PythonでExcelの印刷を自動化!openpyxl.worksheet.page_setupの使い方を徹底解説

openpyxl

はじめに

PythonでExcelファイルを操作できるライブラリopenpyxlは、データの読み書きだけでなく、請求書や報告書の定型フォーマット作成にも非常に便利です。しかし、ファイルを作成した後に手動で印刷設定を行っている方も多いのではないでしょうか。

実はopenpyxlを使えば、Excelの印刷設定もPythonコードで自動化できます。

この記事では、openpyxlworksheet.page_setupオブジェクトに焦点を当て、用紙の向きやサイズ、余白設定など、よく使われる印刷設定の方法を具体的なコード例と共に初心者にも分かりやすく解説します。

この記事を読み終える頃には、あなたはopenpyxlを使って印刷設定まで完了したExcelファイルを生成できるようになっているでしょう。

PageSetupとは?

PageSetupとは、openpyxlでExcelのページ設定(印刷設定)を扱うためのオブジェクトです。

各ワークシートはpage_setupという属性を持っており、worksheet.page_setupのようにアクセスすることで、そのシートの印刷に関する様々な設定を変更できます。

例えば、以下のような設定が可能です。

  • 用紙の向き(縦・横)
  • 用紙サイズ(A4, A3など)
  • 余白(上下左右)
  • 拡大縮小印刷(1ページに収めるなど)

これらの設定をコードで管理することで、手作業による設定ミスを防ぎ、定型業務の大幅な効率化に繋がります。

PageSetupの基本的な使い方

PageSetupの各項目を設定する前に、基本的な準備から見ていきましょう。

ライブラリのインストール

まず、openpyxlがインストールされていない場合は、pipでインストールします(Bash)。

pip install openpyxl

PageSetupオブジェクトの取得

PageSetupオブジェクトは、ワークシートオブジェクトの属性として用意されています。以下のコードのようにして取得するのが基本です。

import openpyxl

# 1. Workbookオブジェクトを作成(または既存ファイルを読み込む)
wb = openpyxl.Workbook()

# 2. アクティブなWorksheetオブジェクトを取得
ws = wb.active

# 3. page_setup属性からPageSetupオブジェクトを取得
page_setup = ws.page_setup

# これで page_setup オブジェクトを通して印刷設定が可能になります
print(type(page_setup))
# <class 'openpyxl.worksheet.page.PageSetup'>

# ファイルを保存
# wb.save('sample.xlsx')

このpage_setupオブジェクトの各属性値を変更していくことで、印刷設定をカスタマイズしていきます。

主要な印刷設定項目とコード例

ここからは、特によく使われる印刷設定項目について、具体的なコード例を交えて解説します。

用紙の向きを設定する (orientation)

用紙を縦向きにするか横向きにするかを設定します。

orientation属性に、PageSetupオブジェクトが持つ定数を設定します。

  • 横向き: ws.page_setup.ORIENTATION_LANDSCAPE
  • 縦向き: ws.page_setup.ORIENTATION_PORTRAIT (これがデフォルトです)
import openpyxl

wb = openpyxl.Workbook()
ws = wb.active
ws.title = "Landscape Sheet"

# 用紙の向きを「横」に設定
ws.page_setup.orientation = ws.page_setup.ORIENTATION_LANDSCAPE

# 確認用
print(f"用紙の向き: {ws.page_setup.orientation}")

wb.save('landscape_example.xlsx')

このコードで生成されたExcelファイルを開くと、印刷プレビューで用紙が横向きになっていることが確認できます。

用紙サイズを設定する (paper_size)

印刷する用紙のサイズを設定します。A4やA3など、一般的なサイズが定数として定義されています。

paper_size属性に、こちらもPageSetupオブジェクトが持つ定数を設定します。

import openpyxl

wb = openpyxl.Workbook()
ws = wb.active
ws.title = "A4 Sheet"

# 用紙サイズを「A4」に設定
ws.page_setup.paper_size = ws.page_setup.PAPERSIZE_A4

# 確認用 (内部的にはIDが出力されます)
print(f"用紙サイズID: {ws.page_setup.paper_size}")

wb.save('papersize_a4_example.xlsx')

openpyxlでは、多くの用紙サイズが定数として用意されています。例えば、PAPERSIZE_A3PAPERSIZE_B5などがあります。これらの定数は内部的に整数IDにマッピングされています。

余白を設定する (margin)

ページの余白も細かく設定できます。単位はインチで指定することに注意してください。

left, right, top, bottom, header, footerといった属性に浮動小数点数(float)で値を設定します。

import openpyxl
from openpyxl.utils.units import cm_to_inches

wb = openpyxl.Workbook()
ws = wb.active
ws.title = "Margin Sheet"

# 1インチ = 2.54cm
# 上下左右の余白を約1cmに設定
margin_cm = 1.0
margin_inch = cm_to_inches(margin_cm) # センチメートルをインチに変換するヘルパー関数

ws.page_setup.left = margin_inch
ws.page_setup.right = margin_inch
ws.page_setup.top = margin_inch
ws.page_setup.bottom = margin_inch

# ヘッダーとフッターの余白
ws.page_setup.header = cm_to_inches(0.5)
ws.page_setup.footer = cm_to_inches(0.5)

print(f"左の余白(inch): {ws.page_setup.left}")

wb.save('margin_example.xlsx')

openpyxl.utils.unitsにはcm_to_inchesのような便利な変換関数も用意されているので、センチメートル単位で指定したい場合に活用すると良いでしょう。

拡大縮小印刷を設定する

データが1ページに収まらない場合に、自動で縮小して印刷する設定も可能です。

次のページ数に合わせる (fit_to_page)

fitToPageTrueに設定し、fitToWidth(横)とfitToHeight(縦)でページ数を指定する方法が一般的です。

import openpyxl

wb = openpyxl.Workbook()
ws = wb.active
ws.title = "FitToPage Sheet"

# 大量のデータを書き込む
for row in range(1, 101):
    for col in range(1, 51):
        _ = ws.cell(row=row, column=col, value=f"{row}-{col}")

# 印刷を横1ページ、縦は成り行きで収める
ws.page_setup.fitToPage = True
ws.page_setup.fitToWidth = 1  # 横幅を1ページに収める
ws.page_setup.fitToHeight = 0 # 縦幅は自動(0を指定)

wb.save('fit_to_page_example.xlsx')

この設定は、列数は固定で、行数が可変の帳票などを1ページに収めたい場合に非常に役立ちます。

拡大/縮小率を指定する (scale)

fitToPageFalseの場合、scale属性で拡大・縮小率をパーセント(%)で指定できます。

import openpyxl

wb = openpyxl.Workbook()
ws = wb.active

# 印刷倍率を75%に設定
ws.page_setup.scale = 75

wb.save('scale_example.xlsx')

scaleは10から400の間の整数で指定します。

その他の便利な設定

印刷範囲を指定する (print_area)

シートの一部分だけを印刷したい場合は、print_area属性にセル範囲を文字列で指定します。

import openpyxl

wb = openpyxl.Workbook()
ws = wb.active

# データを書き込む
for row in range(1, 51):
    for col in range(1, 11):
        _ = ws.cell(row=row, column=col, value=f"{row}-{col}")
        
# 印刷範囲を A1からE20 に設定
ws.print_area = 'A1:E20'

wb.save('print_area_example.xlsx')

ヘッダーとフッターを設定する

worksheetオブジェクトが持つHeaderFooterオブジェクトを介して、ヘッダーとフッターにテキストを設定できます。

import openpyxl

wb = openpyxl.Workbook()
ws = wb.active

# ヘッダーの設定
ws.header_footer.center_header.text = "月次報告書"

# フッターの設定
# &P はページ番号、&N は総ページ数を表す特殊なコード
ws.header_footer.right_footer.text = "Page &P of &N"

wb.save('header_footer_example.xlsx')

left_header, center_footerのように、左・中央・右の各セクションに異なるテキストや書式コードを設定できます。

まとめ

今回は、Pythonのopenpyxlライブラリを使ってExcelの印刷設定を自動化する方法を解説しました。

  • worksheet.page_setup オブジェクトで印刷設定にアクセスする
  • 用紙の向きは orientation で設定
  • 用紙サイズは paper_size で設定
  • 余白は margin 関連の属性(単位はインチ)で設定
  • 1ページに収めるには fitToPage, fitToWidth, fitToHeight を使う
  • 印刷範囲やヘッダー/フッターもコードで制御可能

これらのPageSetup機能を活用することで、手作業で行っていた印刷設定の調整から解放され、より効率的にドキュメント作成の自動化を進めることができます。ぜひ、あなたの業務自動化に役立ててみてください。

コメント

タイトルとURLをコピーしました