【Python業務効率化】PDF自動処理マスター講座 第5回 Excelデータから見積書・請求書PDFを自動生成する

Python自動化

※本記事にはPR(アフィリエイト広告)が含まれています。

こんにちは!「Python業務効率化」連載も、いよいよ第5回を迎えました。これまでの連載では、Excelデータの読み込みやデータ加工、PDFの基本操作などを学んできました。今回はその集大成として、Excelに入力した見積書・請求書のデータを、Pythonで自動的にPDF化する方法を解説していきます。

「毎回Excelからコピペして見積書を作るのが面倒…」「請求書の体裁を毎月手作業で整えるのが大変…」そんな悩みを抱えている方は多いのではないでしょうか。本記事を読めば、Excelにデータを入力するだけで、見た目の整ったPDF帳票を自動で量産できるようになります。初心者の方にもわかりやすいよう、一つひとつ丁寧に解説していきますので、ぜひ最後までお付き合いください。

今回のゴールと全体の流れ

まずは今回作成するプログラムの全体像を把握しておきましょう。やることは大きく分けて次の3ステップです。

  1. Excelファイルに記載された見積書・請求書のデータ(取引先名、品目、単価、数量など)を読み込む
  2. 読み込んだデータをもとに、PDFのレイアウト(表形式の明細、合計金額など)を組み立てる
  3. 取引先ごとに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を自動でメール送付する方法」について解説していく予定です。見積書・請求書の作成から送付まで、一連の業務フローを完全自動化する内容になりますので、ぜひお楽しみに!

PR

\ 初心者から未経験でプロを目指す /

Pythonプログラミング マンツーマン詳細はこちら >

Photo by Mohammad Rahmani on Unsplash

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