生成したExcel帳票は、セルに値が入っただけでは印刷用の範囲まで決まりません。右側の作業用メモが印刷されたり、二ページ目に列名が出なかったりする場合は、印刷設定も出力の一部として確認します。
openpyxlでは印刷するセル範囲、ページごとに繰り返す見出し行、用紙の向きを設定できます。保存後に設定を読み戻す確認と、実際の紙面を見る確認を分けて進めます。
印刷範囲と繰り返す行を保存
次は一行の見出しと五行の架空明細を持つブックです。印刷範囲をA1:C6とし、一行目をページごとの見出しに指定します。ファイルはメモリー上へ保存するだけで、プリンターへは送りません。
from io import BytesIO
from openpyxl import Workbook, load_workbook
book = Workbook()
sheet = book.active
sheet.title = "集計"
sheet.append(["ID", "部門", "金額"])
for number in range(1, 6):
sheet.append([f"T{number}", "A", number * 100])
sheet["E1"] = "印刷対象外の確認メモ"
sheet.print_area = "A1:C6"
sheet.print_title_rows = "1:1"
sheet.page_setup.orientation = sheet.ORIENTATION_LANDSCAPE
sheet.page_setup.paperSize = sheet.PAPERSIZE_A4
buffer = BytesIO()
book.save(buffer)
book.close()
check = load_workbook(BytesIO(buffer.getvalue()))
result = check["集計"]
print("見出し行:", result.print_title_rows)
print("用紙の向き:", result.page_setup.orientation)
print("印刷範囲の設定あり:", bool(result.print_area))
assert result.print_title_rows == "$1:$1"
assert "$A$1:$C$6" in str(result.print_area)
assert result.page_setup.orientation == "landscape"
check.close()
見出し行は$1:$1、向きはlandscapeとなり、印刷範囲も保存されます。Windows・Python 3.12.10・openpyxl 3.1.5で、この設定の読み戻しを確認しました。Excelの印刷プレビューや実際の出力は確認していません。
E1のメモはシートに残っていますが、印刷範囲の外です。元の値を消すことと、印刷対象へ含めないことを別の操作として扱えます。
明細が増えたら最終行も更新する
印刷範囲を六行目まで固定したまま明細を追加すると、新しい明細が印刷範囲へ入りません。出力した明細数から最終行を求め、見出しや合計行を含むかも合わせて決めます。
シートの最終行を無条件に使うと、下に残る過去の書式や別の表まで対象になることがあります。帳票として印刷したい範囲を、出力処理の中で把握する方が確認しやすくなります。
見出しが二行なら、繰り返す範囲も変わります。結合した見出し、注記、ページ番号などがある場合は、帳票の構成に合わせて設定してください。
改ページは表示する環境でも確かめる
横向きへ変えただけで、すべての列が読みやすく一枚へ収まるとは限りません。列幅、フォント、余白、拡大縮小、用紙、出力先の環境によって確認する点が残ります。
openpyxlで設定を保存できたことを、PDFの生成やプリンターでの印刷成功とは報告しないようにします。共有先が使う環境でプレビューを開き、右端の列、二ページ目の見出し、最終明細が見えるかを確認します。
最初は印刷対象外のメモを一つ置いた小さな帳票で、範囲が意図どおりかを試すと追いやすくなります。設定の読み戻し結果とプレビュー確認を残せば、値の問題と紙面の問題を分けられます。
セルの保存はopenpyxl入門、帳票全体の設計は見積書・請求書作成の設計で確認できます。
参考資料
openpyxlの印刷設定公式資料を2026年11月1日に確認しました。
