PR

PythonでExcel請求書を自動PDF化!openpyxlからCustomTkinterによる一括GUIツール開発まで完全解説

Python
スポンサーリンク

はじめに

こんにちは、ニンジンです🥕

これまで全3回にわたってお届けしてきた「Invoice Maker」制作シリーズ、ついに完結しました!
毎月末の受注一覧データから会社名や金額をコピーし、請求書の雛形に貼り付けて1枚ずつPDF形式で保存する作業は、件数が増えるほど手作業での対応が困難になります。コピペミスによるヒューマンエラーのリスクも生じます。
本記事では、3回分の内容をダイジェストでおさらいしながら、Excelデータの読み取りやPDF変換のロジック、さらにノンプログラマーでも操作可能なGUI(操作画面)の実装まで、一連の構築手順を一括で確認できます。

スポンサーリンク

【第1回】Excelデータの読み取りとPDF変換の基本ロジック

第1回 請求書自動PDF化

最初のステップとして、基盤となる「1枚のExcelデータを取得し、レイアウトを保持したままPDFへ変換する」プログラムを構築します。

詳細解説:【第1回】PythonでExcel請求書を自動PDF化!openpyxlとpywin32で行う業務自動化入門 >

仕様上の注意点と対策

  • ① data_only=True の指定:
    通常の読み込みでは、合計値などのセルから「=SUM(H2:H3)」といった数式文字列がそのまま取得されます。data_only=Trueを設定することで、Excelが計算した後の数値結果を正確に抽出します。
  • ② 一時ファイル(temp.xlsx)の経由:
    openpyxl単体ではPDF出力を行えません。そのため、一度別名でデータをExcel保存し、COMコンポーネント(pywin32)を通じてWindows上でExcel製品を操作してPDF保存を指示し、最後に一時ファイルを削除する処理フローを採用しています。
スポンサーリンク

【第2回】for文による連続一括PDF化とエラーハンドリング

第2回 連続一括PDF化

1枚の処理ロジックを、複数データの連続処理へと拡張します。for文による繰り返し処理を実装し、実務運用に必須となる例外処理を組み込みます。

詳細解説:【第2回】Pythonのfor文でExcelデータを連続PDF化!重複回避とエラー対策(例外処理)のやり方 >

実務運用に耐えうるコード設計

⚠️ Excelの未終了プロセス(ゴーストプロセス)の防止

Pythonを使いバックグラウンドでExcelを操作する際、処理の途中でエラーが発生すると、タスクマネージャー上でExcelプロセスが起動したまま残る問題があります。これが累積するとシステムのリソースを圧迫します。

この現象を防ぐため、コード内にtry...finallyブロックを導入します。メイン処理中に予期せぬエラーが発生した場合でも、finally: excel.Quit()が確実に呼び出され、バックグラウンドのExcelプロセスを安全にクローズします。

スポンサーリンク

【第3回】CustomTkinterによるGUI操作画面の実装

第3回 GUI操作画面

自動化ロジックの完成後、非エンジニアの担当者でもソースコードに触れずに利用できるよう、操作画面(GUI)を開発します。

詳細解説:【第3回】CustomTkinterでPythonツールをGUI化!ノンプログラマーでも使える汎用アプリの作り方 >

操作性向上とアプリケーション設計のポイント

  • ① filedialog によるファイルパス取得:
    パスの手入力を排除し、Windows標準の「ファイルを開く」ダイアログから視覚的にExcelファイルを選択できる仕組みにより、入力ミスを防止します。
  • ② .get() による実行範囲の制御:
    画面上の入力欄(Entry)から「開始行」と「終了行」の数値を.get()で動的に取得。ソースコードを直接書き換えることなく、対象データの範囲変更を可能にします。
  • ③ クラス(Class)を用いた構造化:
    画面の部品管理と自動化ロジックの連携が煩雑にならないよう、class InvoiceApp(ctk.CTk):を用いたオブジェクト指向設計を導入し、コードの保守性を高めています。

スポンサーリンク

よくある質問(FAQ)

環境・準備について

Windowsのみ対応しています。

PDF化の処理に使用している pywin32 が、WindowsのExcelを裏側から直接操作する仕組みのためです。MacやLinux環境では動作しません。

Macでも同様の処理をしたい場合は、PDF化の部分を reportlabpdfkit などの別のライブラリに置き換える必要があります。

Python 3.8以上を推奨します。

第3回で使用するCustomTkinterの推奨環境がPython 3.8以上のため、この基準に合わせておくと安心です。インストール済みのバージョンはコマンドプロンプトで確認できます。

python --version

Microsoft Excel(有償版)がパソコンにインストールされている必要があります。

PDF化の処理でExcel本体を裏側から起動しているためです。GoogleスプレッドシートやLibreOfficeでは代替できないのでご注意ください。

よくある原因は3つです。

  • Pythonが正しくインストールされていない:python --version でバージョンが表示されるか確認してください。
  • pipが古い:python -m pip install --upgrade pip でpipを最新にしてから再試行してください。
  • 社内ネットワークの制限:社内のセキュリティ設定でインターネット接続が制限されている場合があります。IT担当者に確認してください。
コード・処理の内容について

計算式の文字列がそのまま取得されてしまいます。

例えば合計金額のセルに =SUM(H2:H3) という式が入っている場合、数値ではなくこの式の文字列が請求書に転記されてしまいます。

data_only=True を指定することで、Excelが計算した後の「結果の数値」だけを取得できます。データの読み取りには必ず付けるようにしましょう。

openpyxlにはPDF書き出しの機能がないためです。

処理の流れを整理すると、以下のようになります。

  • openpyxlでデータを書き込み、いったん temp.xlsx として保存する
  • 裏側でExcelを起動して temp.xlsx を開き、PDF形式で保存する
  • 用済みの temp.xlsxos.remove() で削除する

この手順を踏むことで、元の請求書テンプレートのレイアウトを崩さずにPDFを生成できます。

はい、range() の数値を変更するだけで対応できます。

「4行目から10行目まで」処理したい場合は range(4, 11)、「20行目から25行目まで」なら range(20, 26) と指定します。

第3回で作ったGUIアプリでは、この開始行・終了行を画面の入力欄から変更できるため、コードを直接触る必要はありません。

エラーが発生して処理が止まります。

Windowsではファイル名に / \ : * ? " < > | などの文字は使えません。

対策として、会社名を取得した後に str.replace()re.sub() を使って使用できない文字を除去する処理をあらかじめ追加しておくことをおすすめします。

はい、エラー発生前に処理が完了したPDFはそのまま残ります。

第2回で解説した try...finally の構造により、エラーが発生してもExcelプロセスは確実に終了します。

エラーになった行番号はターミナルに表示されるため、その行のデータを確認してから再実行することで対処できます。

GUIアプリ(第3回)について

見た目が大きく異なります。通常のTkinterは古いWindowsアプリ風のデザインですが、CustomTkinterはフラットでモダンな見た目です。

項目Tkinter(標準)CustomTkinter
デザイン古いWindowsアプリ風フラットでモダン
ダークモード非対応対応
インストールPython標準搭載pip installが必要
書き方通常のTkinterと同じほぼ同じ(移行しやすい)

PyInstallerで .exe ファイル化するのが現実的な方法です。

そのままでは相手のPCにもPythonと各ライブラリが必要になります。社内に非エンジニアのスタッフが多い場合、環境構築をお願いするのは現実的ではありません。

PyInstallerで実行ファイル(.exe)化すれば、Pythonがインストールされていないパソコンでもダブルクリックで起動できるようになります。

はい、基本のコードではエラーが発生します。

入力値を int() で数値変換する際に文字列が渡されるとエラーになります。

実務で使う場合は try...except ValueError を組み合わせて「数字以外が入力されたら警告を出す」処理を追加しておくと安心です。

運用・実務について

はい、セルの位置が変わった場合は修正が必要です。

コード内の ws_kanri["C4"] のような記述が、どのセルを参照するかを指定しています。列や行の位置を変更した場合は、その箇所を対応するセル番地に書き換えてください。

管理表と請求書の両方を変更した場合は、それぞれの参照箇所を確認するようにしましょう。

はい、os モジュールと datetime を組み合わせることで対応できます。

処理の冒頭で現在の年月を取得してフォルダ名に使う方法が一般的です。os.makedirs() と組み合わせることで、フォルダが存在しない場合も自動作成できます。

記述例:datetime.now().strftime("請求書_%Y%m") → 「請求書_202507」のようなフォルダ名を自動生成

件数が増えるほど処理時間はかかりますが、Excelプロセスが溜まるトラブルは防止できます。

1件あたり数秒が目安ですが、PCのスペックやExcelファイルの複雑さによって変わります。

第2回で解説した try...finally を正しく実装することで、エラー発生時にExcelのプロセスが残り続けてPCが重くなる現象を防げます。

スポンサーリンク

まとめ:3回でたどった自動化の道のり

本シリーズでは、以下のようなステップでExcel請求書の自動化ツールを作り上げてきました。

📄
1枚をPDF化
第1回
🔁
大量を一括PDF化
第2回
🖥️
GUIアプリ化
第3回

これで「クリック一つで大量の請求書を発行できるツール」という当初の目標は達成できました。ただ、このツールを他のパソコンで動かすには「Pythonとライブラリのインストール」という壁が残っています。

スポンサーリンク

💡 環境構築不要で今すぐ使いたい方へ

PYTHON環境構築 不要・実行ファイル化済み

Invoice Maker (NINJIN EDITION)

「自分で環境を作るのは大変…」「社内のPCにそのまま展開したい」という方には、ダブルクリックするだけで起動できる実行ファイル(.exe)の完全版パッケージをご用意しました。

noteで詳しく見る →

最後までお読みいただき、ありがとうございました。py-vbalab.comでは、これからも皆様の業務を劇的に楽にするVBA&Pythonの技術を発信していきます!


PROJECT LOG — SERIES INDEX
スポンサーリンク

シリーズ記事一覧

電子工作・自動化ツールの製作記録をシリーズごとにまとめています。気になるテーマからお読みください。


PythonでExcel請求書を自動PDF化!openpyxlからCustomTkinterによる一括GUIツール開発まで完全解説
PythonでExcel請求書を自動PDF化するツール「Invoice Maker」の制作シリーズ全3回をまとめて解説。openpyxlとpywin32による基本ロジック、for文でのループ処理、CustomTkinterを使ったGUIアプリ化まで、業務自動化の全ステップをこの1記事で確認できます。
【完全版】ゼロから作る自作CNCロードマップ!Arduino制御とレーザー刻印機への全手順
Arduino×GRBL×1064nm赤外線レーザーで自作するCNCマシンの全工程を、全10回のロードマップで完全解説。要素設計から本筐体の組み立て、配線エラーの解決、設計データ配布までを網羅します。
ラズパイPico W×GASで自作!「LINEで動く温湿度&スマートリモコン」完全ロードマップ
ペットの熱中症対策に。Pico W+GASでスマホからエアコンを遠隔操作する自作スマートリモコンをLINE Botで作る全5回の総集編。回路図・Pythonコード・API設定・フリーズ対策まで全部まとめました。
GASとLINE Bot(Webhook)でPico Wを遠隔操作!双方向通信の作り方
ラズパイPico WとLINEを連携して自作スマートリモコンを完成させよう!第5回ではGoogle Apps Script(GAS)を中継サーバーとして使い、外部からエアコンを遠隔操作する仕組みと、PC不要で動かす完全スタンドアロン化の手順を解説します。
ラズパイPico Wで赤外線リモコンを自作!送受信回路とPWM制御のやり方
Raspberry Pi Pico Wを使ってエアコンの赤外線信号をハック!自作IoTスマートリモコンの要となるハードウェア改造手順を解説します。受光モジュールの配線、38kHzの信号解析、トランジスタを使ったIR送信回路の組み方まで、実践的な電子工作ノウハウを公開。

コメント