※本記事にはPR(アフィリエイト広告)が含まれています。
こんにちは!「Python業務効率化」連載も、いよいよ第5回を迎えました。これまでの連載では、Excelデータの読み込みやデータ加工、PDFの基本操作などを学んできました。今回はその集大成として、Excelに入力した見積書・請求書のデータを、Pythonで自動的にPDF化する方法を解説していきます。
「毎回Excelからコピペして見積書を作るのが面倒…」「請求書の体裁を毎月手作業で整えるのが大変…」そんな悩みを抱えている方は多いのではないでしょうか。本記事を読めば、Excelにデータを入力するだけで、見た目の整ったPDF帳票を自動で量産できるようになります。初心者の方にもわかりやすいよう、一つひとつ丁寧に解説していきますので、ぜひ最後までお付き合いください。
今回のゴールと全体の流れ
まずは今回作成するプログラムの全体像を把握しておきましょう。やることは大きく分けて次の3ステップです。
- Excelファイルに記載された見積書・請求書のデータ(取引先名、品目、単価、数量など)を読み込む
- 読み込んだデータをもとに、PDFのレイアウト(表形式の明細、合計金額など)を組み立てる
- 取引先ごとにPDFファイルとして書き出す
使用するライブラリは、Excel操作でおなじみのopenpyxl(またはpandas)と、PDF生成用のreportlabです。この2つを組み合わせることで、「データはExcel、見た目はPDF」という業務フローを完全に自動化できます。
完成イメージ
最終的には、以下のような流れが実現できます。
- 経理担当者がExcelに「取引先名・品目・単価・数量」を入力
- Pythonスクリプトを実行するだけで、取引先ごとの見積書PDFが自動生成
- 請求書も同じ仕組みで、フォーマットを変えるだけで対応可能
事前準備:必要なライブラリとExcelデータの設計
ライブラリのインストール
まずは必要なライブラリをインストールしましょう。ターミナル(コマンドプロンプト)で以下を実行してください。
pip install openpyxl pandas reportlab
それぞれの役割は次の通りです。
- openpyxl:Excelファイル(.xlsx)の読み書きを行うライブラリ
- pandas:Excelデータを表形式(DataFrame)で扱いやすくするライブラリ
- reportlab:PDFファイルをゼロから作成できるライブラリ
Excelデータのフォーマットを設計する
自動化をスムーズに進めるには、Excel側のデータ設計がとても重要です。今回は以下のようなシンプルな構成を例にします。
| 取引先名 | 品目 | 単価 | 数量 |
|---|---|---|---|
| 株式会社サンプル | Webサイト制作 | 300000 | 1 |
| 株式会社サンプル | 保守サポート | 20000 | 3 |
| テスト商事株式会社 | システム導入 | 500000 | 1 |
ポイントは「取引先名」を1列目に置いておくことです。これにより、同じ取引先のデータをグループ化して、1社につき1枚のPDFを作成することができます。
Excelデータを読み込んで見積書PDFを作成する
Excelデータをpandasで読み込む
まずはExcelファイルを読み込み、取引先ごとにデータをまとめます。
import pandas as pd
# Excelファイルを読み込む
df = pd.read_excel("見積データ.xlsx", sheet_name="Sheet1")
# 取引先名ごとにグループ化
grouped = df.groupby("取引先名")
for client_name, group in grouped:
print(client_name)
print(group)
groupbyを使うことで、取引先ごとにデータを分割できます。これで「1社分の明細データ」を取り出す準備が整いました。
reportlabでPDFの見積書を作成する
次に、取り出したデータをもとにPDFを生成します。以下は基本的なサンプルコードです。
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
# 日本語フォントの登録(フォントファイルは別途用意)
pdfmetrics.registerFont(TTFont("IPAexGothic", "ipaexg.ttf"))
def create_estimate_pdf(client_name, items, filename):
c = canvas.Canvas(filename, pagesize=A4)
c.setFont("IPAexGothic", 16)
c.drawString(50, 800, f"御見積書")
c.setFont("IPAexGothic", 12)
c.drawString(50, 760, f"{client_name} 様")
y = 700
total = 0
c.drawString(50, y, "品目")
c.drawString(250, y, "単価")
c.drawString(350, y, "数量")
c.drawString(450, y, "金額")
for _, row in items.iterrows():
y -= 25
amount = row["単価"] * row["数量"]
total += amount
c.drawString(50, y, str(row["品目"]))
c.drawString(250, y, f'{row["単価"]:,}円')
c.drawString(350, y, str(row["数量"]))
c.drawString(450, y, f'{amount:,}円')
y -= 40
c.drawString(350, y, "合計金額:")
c.drawString(450, y, f"{total:,}円")
c.save()
注意点として、reportlabは標準で日本語フォントに対応していないため、IPAexゴシックなどのフォントファイルを別途用意し、registerFontで読み込む必要があります。フォントファイルは無料で配布されているものを利用できます。
取引先ごとにPDFを一括出力する
最後に、先ほどのグループ化したデータとPDF生成関数を組み合わせます。
for client_name, group in grouped:
filename = f"見積書_{client_name}.pdf"
create_estimate_pdf(client_name, group, filename)
print("すべての見積書PDFを作成しました!")
これで、Excelに入力した取引先データをもとに、自動で複数の見積書PDFが生成されるようになりました。手作業で1件ずつ作っていた時間が、わずか数秒の処理に置き換わります。
請求書への応用と、さらなる業務効率化のヒント
見積書と請求書の違いを吸収する
請求書は見積書とほぼ同じ構造ですが、「支払期限」や「請求番号」など追加の項目が必要になることが多いです。そこで、関数に引数を増やして柔軟に対応させましょう。
def create_invoice_pdf(client_name, items, invoice_no, due_date, filename):
c = canvas.Canvas(filename, pagesize=A4)
c.setFont("IPAexGothic", 16)
c.drawString(50, 800, "御請求書")
c.setFont("IPAexGothic", 12)
c.drawString(50, 770, f"請求番号:{invoice_no}")
c.drawString(50, 750, f"お支払期限:{due_date}")
c.drawString(50, 720, f"{client_name} 様")
# 以下、見積書と同様に明細を出力
# ...
c.save()
このように「共通部分は関数化」「違う部分だけ引数で切り替える」設計にしておくと、見積書・請求書・納品書など帳票の種類が増えても対応しやすくなります。
テンプレート化でさらに業務を効率化する
毎回Pythonコードでレイアウトを細かく指定するのは手間がかかります。実務では、以下のような工夫をするとさらに効率が上がります。
- 会社ロゴや振込先情報など「固定文言」は別ファイル(設定ファイル)にまとめておく
- Excelの入力シートに「請求番号」「発行日」などの列も追加しておき、プログラム側で自動読み込みする
- 生成したPDFを自動でメール添付・送信する仕組み(連載の次回以降で解説予定)と連携する
よくあるつまずきポイント
初心者の方がよくつまずくポイントをまとめておきます。
- 日本語フォントを登録し忘れて文字化けする →
registerFontの設定を確認 - Excelのセルが空欄だとエラーになる →
fillna()などで事前に空欄処理をしておく - 数量や単価が文字列として読み込まれる →
pd.to_numeric()で型変換しておく
まとめ
今回は、「Excelデータから見積書・請求書PDFを自動生成する」という、業務効率化において非常に実践的なテーマを扱いました。ポイントを振り返ってみましょう。
- Excelデータは
pandasでグループ化すると、取引先ごとの処理がしやすくなる - PDFの生成には
reportlabを使い、日本語フォントの登録を忘れずに行う - 見積書・請求書など帳票の種類が増えても、関数化しておけば柔軟に対応できる
一度この仕組みを作ってしまえば、毎月・毎週発生する定型的な帳票作成業務が驚くほど楽になります。最初は設定に手間取るかもしれませんが、ぜひ自分の業務に合わせてカスタマイズしてみてください。
次回、第6回では「生成したPDFを自動でメール送付する方法」について解説していく予定です。見積書・請求書の作成から送付まで、一連の業務フローを完全自動化する内容になりますので、ぜひお楽しみに!
Photo by Mohammad Rahmani on Unsplash

