大量の明細を新しいExcelへ順に出すだけなら、全セルを通常のブックとして保持する必要がない場合があります。openpyxlには、行を追加しながら書き出すwrite_onlyというモードがあります。
既存帳票の特定セルを書き換える用途とは違います。新規ファイルへ上から順に出す処理として使い、後から前の行へ戻らない構成にします。
書出し専用のシートへ行を追加
次は架空の三明細を使う小さな例です。freeze_panesを先に設定してから見出しと明細を追加し、一度だけ保存します。その後、読み取り専用で結果を開き直して検算します。
from io import BytesIO
from openpyxl import Workbook, load_workbook
book = Workbook(write_only=True)
sheet = book.create_sheet("明細")
sheet.freeze_panes = "A2"
sheet.append(["ID", "金額"])
for row in [("A", 100), ("B", 200), ("C", 50)]:
sheet.append(row)
buffer = BytesIO()
book.save(buffer)
book.close()
check = load_workbook(BytesIO(buffer.getvalue()), read_only=True)
try:
rows = check["明細"].iter_rows(values_only=True)
header = next(rows)
count = 0
total = 0
for key, amount in rows:
count += 1
total += amount
print("明細件数:", count)
print("金額合計:", total)
assert header == ("ID", "金額")
assert count == 3 and total == 350
finally:
check.close()
明細件数は3、金額合計は350です。Windows・Python 3.12.10・openpyxl 3.1.5で、書き出しと読み戻しを確認しました。大きなデータの処理速度やメモリーの削減量を測った例ではありません。
ここでは説明用に三明細をリストで用意しています。実際の大量入力を全部リストへためると、ブック側を変えても入力側でメモリーを使います。CSVなどから一件ずつ読む部分も合わせて設計します。
後戻りできない順序で組み立てる
write_onlyでは通常のシートのように任意のセルを読み、前の行を書き換える使い方はできません。末尾に合計を出すなら、明細を追加しながら合計値を保持し、最後に合計行を追加します。
freeze_panesなど、行データより前へ保存される設定は先に用意します。列幅や書式が必要なら、その設定をいつ確定できるかも確認してください。列の最大文字数を全件見てから幅を決める処理を、そのまま一回の書出しへ移せるとは限りません。
保存は一度だけです。途中保存し、続きを同じブックへ追加して再保存する運用にはしません。途中で止まった場合は、未完成の出力を完成品として扱わず、元の入力からやり直す条件を決めます。
読み戻すときも全件をためない
例ではiter_rowsを順に読み、件数と合計だけを残しています。読み戻した全行をlistへ変えると、その分のメモリーが必要になります。検算の目的に合う値だけを積み上げます。
Excelで扱える行数や列数、共有先の環境も別の制約です。ファイルが作れたことだけで、受け取る人が開けるとは判断しません。実際に共有する条件で開き、見出しと最後の明細まで確認します。
通常のブック編集はopenpyxl入門、値を保存して確かめる流れはExcel保存の基本で補えます。
参考資料
openpyxlの最適化モード公式資料を2026年11月1日に確認しました。
