1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pythonでエクセルの書式を操作してテキストに差分がある部分だけ赤字にする(協力ChatGPT)

Last updated at Posted at 2024-10-29

pythonでエクセル操作
二つのcellを比較してテキストに差分がある部分だけ赤色にする
最初はopenpyxlでやろうとしたのですが、それだと部分の書式設定ができないと判明したため
xlsxwriter で挑戦してみました
想定している結果が得られましたよ

当初単語設定を"[a-zA-Z0-9_]+"にしていたせいで原文を保持できず
ChatGPTも無理に原文を保持しようとして上手くいかないケースを返してきてたのですが。
私に電流が走り'([a-zA-Z0-9_]+|[^a-zA-Z0-9_]+)'にして全部とってくればいいじゃん!
ってChatGPTにいったらうまく動作するものが返ってきた。

ChatGPTに「ご指摘の通り」って言わせてやったぜ!(最初の聞き方が悪かっただけである)

ChatGPT返信.txt
ご指摘の通り、元の文字列のすべての部分を保持しつつ、単語や記号を適切に抽出するために、
正規表現を見直す必要があります。以下の修正では、単語にマッチする部分だけでなく、
それ以外の部分も抽出し、元のテキストの構造を保持するようにします。

image.png

import xlsxwriter
import difflib
import re

def extract_parts(text):
    # 単語とそれ以外の部分を抽出
    return re.findall(r'([a-zA-Z0-9_]+|[^a-zA-Z0-9_]+)', text)

def get_differences(parts1, parts2):
    # 差分を取得
    diff = difflib.ndiff(parts1, parts2)
    return diff

def create_rich_string(text1, text2, workbook):
    # リッチ文字列を生成するためのリスト
    rich_string = []
    
    # 赤色フォーマットの定義
    red_format = workbook.add_format({'color': 'red'})

    # テキストのパーツを抽出
    parts1 = extract_parts(text1)
    parts2 = extract_parts(text2)

    # 差分を取得
    differences = get_differences(parts1, parts2)

    # 現在のテキストを保持するための変数
    current_text = text2  # text2を基準にする

    # 差分を解析
    for part in differences:
        if part.startswith('+ '):
            # 新しく追加された部分
            rich_string.append(red_format)  # 赤色フォーマットを追加
            rich_string.append(part[2:])  # 新しい部分を追加
        elif part.startswith('- '):
            # 削除された部分は無視
            continue
        else:
            # 変更のない部分を追加
            rich_string.append(part[2:])  # 変更のない部分を追加

    return rich_string



# Excelファイルに書き込む関数
def main():

    # Excelファイルの作成
    workbook = xlsxwriter.Workbook('differences.xlsx')
    worksheet = workbook.add_worksheet()

    # 例
    text1 = "The quick brown fox jumps over the lazy dog"
    text2 = "The quick blue fox jumps over a lazy dog"
    # リッチ文字列を生成
    rich_string = create_rich_string(text1, text2, workbook)
    # 指定されたセルにテキストを追加
    worksheet.write("A1", text1)
    worksheet.write_rich_string("A2", *rich_string)


    # 例
    text1 = "ans = A1 + BB3 + CC"
    text2 = "ans = A1 + BB2 + CC * (DD_4 + 1)"
    # リッチ文字列を生成
    rich_string = create_rich_string(text1, text2, workbook)
    # 指定されたセルにテキストを追加
    worksheet.write("B1", text1)
    worksheet.write_rich_string("B2", *rich_string)

    # 例
    text1 = "ans = func(in(\"in1.txt\"),out(\"out1.txt\"))"
    text2 = "ans = func(in(\"in1.txt\"),out(\"outout.txt\"))"
    # リッチ文字列を生成
    rich_string = create_rich_string(text1, text2, workbook)
    # 指定されたセルにテキストを追加
    worksheet.write("C1", text1)
    worksheet.write_rich_string("C2", *rich_string)

    # ファイルを閉じる
    workbook.close()

main()
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?