pythonでエクセル操作
二つのcellを比較してテキストに差分がある部分だけ赤色にする
最初はopenpyxlでやろうとしたのですが、それだと部分の書式設定ができないと判明したため
xlsxwriter で挑戦してみました
想定している結果が得られましたよ
当初単語設定を"[a-zA-Z0-9_]+"にしていたせいで原文を保持できず
ChatGPTも無理に原文を保持しようとして上手くいかないケースを返してきてたのですが。
私に電流が走り'([a-zA-Z0-9_]+|[^a-zA-Z0-9_]+)'にして全部とってくればいいじゃん!
ってChatGPTにいったらうまく動作するものが返ってきた。
ChatGPTに「ご指摘の通り」って言わせてやったぜ!(最初の聞き方が悪かっただけである)
ChatGPT返信.txt
ご指摘の通り、元の文字列のすべての部分を保持しつつ、単語や記号を適切に抽出するために、
正規表現を見直す必要があります。以下の修正では、単語にマッチする部分だけでなく、
それ以外の部分も抽出し、元のテキストの構造を保持するようにします。
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()