openpyxl で エクセル操作
insert_rowsで行を挿入した場合、式のアドレスは追従してくれない
ChatGPTに聞いて作ってもらいました所要時間5分。。。
動作確認用の入力データ作成やこの記事作成のほうが時間かかったよ
ChatGPTに使われる素人なボク
これがあれば、仕様変更になって行列追加になっても対応できる!!!
ChatGPT.質問.txt
(1)
openpyxl で insert_row を実施したさいに 数式があった場合にずれが発生します、ずれが発生した式を矯正する方法、例えば3行目に空白行を挿入した場合、それより下の"="で始まる数式で”[A-Z]+[0-9]+”にマッチするアドレスをずらした分に修正する
(2)
新しいinsert_rowとして関数化してください、また列バージョンの例も提示してください
(3)
挿入行より下だけ修正した場合、挿入行より上の式に対応できないようです、なのですべての行をチェックして式の行番号をチェックして挿入行番号より大きい場合に修正するようにお願いします
参考入力CSV形式.xlsx
11,=A1*C1,19,=C1*E1,27
101,=A2*C2,43,=C2*E2,-15
=A2/A4,=B2/B4,=C2/C4,=D2/D4,=E2/E4
-103,=A4+C4,-101,=C4+E4,-99
-145,=A5+C5,-143,=C5+E5,-141
-187,=A6+C6,-185,=C6+E6,-183
openxl_insert.py
import openpyxl
import re
def insert_row_and_adjust_formula(sheet, insert_row):
# 行を挿入
sheet.insert_rows(insert_row)
# 修正対象の数式を含むセルを探して修正
for row in range(1, sheet.max_row + 1): # 全ての行を対象
for col in range(1, sheet.max_column + 1): # 全ての列をチェック
cell = sheet.cell(row=row, column=col)
if isinstance(cell.value, str) and cell.value.startswith('='):
# 数式に含まれるセル参照を修正
def adjust_reference(match):
col_ref, row_ref = match.groups()
new_row_ref = int(row_ref) + (1 if int(row_ref) >= insert_row else 0) # 挿入行以降の行だけ修正
return f"{col_ref}{new_row_ref}"
# 数式のセル参照を正規表現で修正
new_formula = re.sub(r'([A-Z]+)([0-9]+)', adjust_reference, cell.value)
cell.value = new_formula # 修正した数式をセルに再設定
def insert_column_and_adjust_formula(sheet, insert_col):
# 列を挿入
sheet.insert_cols(insert_col)
# 修正対象の数式を含むセルを探して修正
for row in range(1, sheet.max_row + 1): # 全ての行を対象
for col in range(1, sheet.max_column + 1): # 全ての列をチェック
cell = sheet.cell(row=row, column=col)
if isinstance(cell.value, str) and cell.value.startswith('='):
# 数式に含まれるセル参照を修正
def adjust_reference(match):
col_ref, row_ref = match.groups()
new_col_ref = chr(ord(col_ref) + 1) if (ord(col_ref) - 65 + 1) >= insert_col else col_ref
return f"{new_col_ref}{row_ref}"
# 数式のセル参照を正規表現で修正
new_formula = re.sub(r'([A-Z]+)([0-9]+)', adjust_reference, cell.value)
cell.value = new_formula # 修正した数式をセルに再設定
# Excelファイルを読み込み
workbook = openpyxl.load_workbook('a.xlsx')
sheet = workbook.active
# 4列目に空白列を挿入
insert_column_and_adjust_formula(sheet, 4)
# 4行目に空白行を挿入
insert_row_and_adjust_formula(sheet, 4)
# 2列目に空白列を挿入
insert_column_and_adjust_formula(sheet, 2)
# 2行目に空白行を挿入
insert_row_and_adjust_formula(sheet, 2)
# 保存
workbook.save('example_adjusted.xlsx')