📊Excel業務をPythonで自動化!請求書フォルダから一覧表を作る実践レシピと環境づくり

📊 Excel地獄から抜け出す“最初の一歩”

毎月たまっていく請求書のExcelファイル。1つ開いて、会社名をコピーして、金額をコピーして、日付をコピーして、別のシートに貼り付けて——これを100ファイル繰り返したら丸一日が消えてしまいますよね😇 しかもコピペミスが混じれば、後から犯人探しの時間まで発生します。

そんな“Excel手作業ループ”を救ってくれるのがPython。pathlibでファイル一覧を取得し、openpyxlでセルを読み取り、pandasで表にまとめて、最後にto_excel()で書き出す——たったこれだけの流れで、何百ファイルでも数秒〜数十秒で処理できる世界が手に入ります✨

🧭 ゴールから逆算:処理を3つに分解する

「フォルダの中の請求書を全部読んで、日付・会社名・金額の一覧表を作る」という今回のゴール。いきなり完璧なコードを書こうとせず、処理を分解するのが成功のコツです。

  • 📁 ステップ12021年フォルダ内の全Excelファイルのパスを取得する
  • 📖 ステップ2:各ファイルを開き、日付・請求先会社名・合計金額を読み取る
  • 📝 ステップ3:読み取ったデータを新しいExcelファイルに一覧表として書き出す

この3ステップを順番に実装していけば、迷子にならずにゴールへたどり着けます。

📁 ステップ1:pathlibでExcelファイル一覧を取得

ファイルのパス操作には標準ライブラリのpathlibが便利です。glob()でワイルドカード指定すれば、拡張子.xlsxのファイルだけを一気に集められます。

from pathlib import Path

def main():
    folder = Path(r"C:\work\2021年")
    for file_path in folder.glob("*.xlsx"):
        print(file_path)

if __name__ == "__main__":
    main()

絶対パスで指定しておけば、Pythonスクリプトをどこに置いても安定して動きます。forループで1ファイルずつ取り出して、次のステップに渡していきましょう。

📖 ステップ2:openpyxlでセルから値を読み取る

Excel操作の定番ライブラリopenpyxlを使って、ワークブックを読み込みます。請求書フォーマットが統一されているなら、セル番地を直接指定するのがいちばんシンプル。

from openpyxl import load_workbook

wb = load_workbook(file_path, data_only=True)
ws = wb.worksheets[0]

invoice_date = ws["H4"].value      # 日付
invoice_company = ws["A7"].value   # 請求先会社名
invoice_amount = ws["E13"].value   # 合計金額

ここで重要なのがdata_only=Trueのオプション。これを付けないと、合計金額のセルが=SUM(...)のような数式の文字列として返ってきてしまいます。「数式の結果=計算後の値」が欲しいときは必ず指定しましょう。

🗓️ 日付は datetime.date に変換しておく

セルから読み取った日付はdatetime.datetime型で時刻まで含まれています。一覧表に時刻まで出ると見づらいので、datetime.dateに変換しておくと美しい仕上がりに。

from datetime import date

invoice_date = date(invoice_date.year, invoice_date.month, invoice_date.day)

🧱 関数に切り出してコードを“読める”形に

1ファイル分の読み取り処理は、関数として独立させておくとループ部分がぐっとスッキリします。型ヒント(type annotation)も付けておくと、後から見返したときの理解度が段違いです。

from pathlib import Path
from datetime import date
from openpyxl import load_workbook

def get_invoice_data(file_path: Path) -> tuple[date, str, int]:
    """請求書Excelから日付・会社名・金額を抽出する"""
    wb = load_workbook(file_path, data_only=True)
    ws = wb.worksheets[0]

    raw_date = ws["H4"].value
    invoice_date = date(raw_date.year, raw_date.month, raw_date.day)
    invoice_company = ws["A7"].value
    invoice_amount = ws["E13"].value

    return invoice_date, invoice_company, invoice_amount

📝 ステップ3:pandasで一覧表にまとめてExcel出力

表形式のデータはpandasのDataFrameに任せるのが最短ルート。ループの中で1行ずつ追加していき、最後にto_excel()でファイルに書き出します。

import pandas as pd
from pathlib import Path

def main():
    folder = Path(r"C:\work\2021年")
    df = pd.DataFrame(columns=["日付", "請求先", "金額"])

    for file_path in folder.glob("*.xlsx"):
        invoice_date, invoice_company, invoice_amount = get_invoice_data(file_path)
        new_row = pd.DataFrame([{
            "日付": invoice_date,
            "請求先": invoice_company,
            "金額": invoice_amount,
        }])
        df = pd.concat([df, new_row], ignore_index=True)

    df.to_excel("2021年請求書一覧.xlsx", index=False)

if __name__ == "__main__":
    main()

ignore_index=Trueを付けるのがポイント。これを忘れると行番号が重複してエラーになります。出力されたExcelファイルを開けば、日付・請求先・金額がきれいに並んだ一覧表ができあがっているはずです🎉

💡 余裕が出てきたら、フォルダが存在しないときの例外処理や、処理状況を残すログ出力を追加してみましょう。実務で使うスクリプトはここまで作り込むと一気に堅牢になります。

🚀 さらに広げるアイデア

同じ仕組みを少し拡張するだけで、業務改善のインパクトはどんどん広がります。

  • 📂 複数年フォルダ対応rglob("*.xlsx")でサブフォルダまで再帰的に走査
  • 📈 月別・会社別集計pandasgroupby()で合計を一発算出
  • 📧 結果の自動配布:生成したExcelをメール送信/Slack投稿まで自動化
  • 定期実行:Windowsのタスクスケジューラやcronで毎月自動実行

🛒 Excel自動化の学習を加速させる相棒アイテム

「動かしながら覚える」ことが業務自動化のいちばんの近道。手元の環境と教材を整えてあげるだけで、学習スピードはぐっと上がります。実際に手を動かす時間を増やせるアイテムを厳選して紹介します💪

📕 まずはこの一冊:『PythonによるExcel自動化』系の定番書

openpyxlpandasを使ったExcel操作を、業務シナリオベースで丁寧に解説してくれる入門書。動画で得た知識を体系として固めるのに最適です。

📗 もっと幅広い業務に応用するなら:『退屈なことはPythonにやらせよう』

Excelだけでなく、PDF・メール・Web・画像処理まで“面倒な作業”の自動化テクニックが満載。手元に1冊あると、ふとした業務改善のアイデアが湯水のように湧いてきます。

🖥️ 在宅・出社どちらでも捗るモバイルモニター

左にコード、右にExcelファイルや公式ドキュメントを並べると、自動化スクリプト作成の効率が劇的にアップ。USB-C一本で接続できるモバイルモニターは、机が狭くても気軽に2画面化できる頼れる相棒です。

⌨️ 長時間コーディングを支える静音メカニカルキーボード

自動化スクリプトはトライ&エラーの連続。指への負担を軽くしてくれる静音赤軸のメカニカルキーボードがあれば、集中時間が伸びてバグ解決のスピードも上がります。

🖱️ 大量ファイル処理の検証に効くトラックボールマウス

フォルダ内の大量Excelファイルを目視で確認する場面では、長時間使っても疲れにくいトラックボールが圧倒的に快適。手首の負担を減らせるので、自動化スクリプトのデバッグ作業もはかどります。

❓ よくある質問(FAQ)

🤔 Q1. openpyxlとpandasはどう使い分ければいい?

セル単位での読み書きや書式設定はopenpyxlが得意。一方、表として一括で読み込んで集計したいならpandasread_excel()が便利です。今回のようにフォーマットの決まったセルからピンポイントで値を取り出すならopenpyxl取得した結果を表にまとめて出力するならpandas、と役割を分けるのがおすすめです。

🙋 Q2. セルから取得した金額が「=SUM(...)」のような文字列になります

load_workbook()data_only=Trueを指定してください。これを付けると数式ではなく計算結果の値が返ってきます。ただし、Excelで一度も保存していない状態だとキャッシュが空なので、対象ファイルを一度Excelで開いて保存しておく必要があります。

🧐 Q3. ファイル数が多すぎて処理が遅いです

concurrent.futuresThreadPoolExecutorを使って並行処理するのが効果的です。Excelファイル読み込みはI/Oバウンドな処理なので、マルチスレッドで体感速度が大きく向上します。何百ファイルレベルになったら検討してみましょう。

🛡️ Q4. フォーマットが微妙に違うファイルが混じっていたら?

セル位置を直接指定するのではなく、「請求金額」という見出しセルを探してから隣のセルを読むなど、キーワード検索ベースに切り替えると堅牢になります。try/exceptで個別ファイルのエラーをキャッチし、ログに残しつつ処理を継続させる作りにすると実務でも安心です。

📚 Q5. 学習を続けるならどんな順番で進めるのがいい?

「pathlibでファイル操作 → openpyxlでExcel読み書き → pandasでデータ整形 → 例外処理&ログ出力 → スケジュール実行」の順がおすすめ。1ステップずつ自分の業務に当てはめて作っていくと、書籍で学んだ知識が“使えるスキル”として定着していきます。

🌟 まとめ:自動化の効果は“1回作れば一生効く”

Excelの繰り返し作業は、自動化したその瞬間から「来月も再来月も時間が浮く」という複利のリターンが返ってきます。今日紹介したように、処理を3ステップに分解して、関数に切り出してリファクタリング——この一連の流れが身につけば、請求書だけでなく見積書・売上集計・在庫管理など、あらゆる業務に応用できるようになります💼

まずは小さなフォルダで試して、「これだけ自動化できた!」という成功体験を積んでみてください🐣 そのうえで書籍やデバイス環境への投資を組み合わせれば、学習スピードはさらに加速します。今日紹介したアイテムが、あなたの“脱・Excel手作業”ライフを後押しする頼れる相棒になりますように!

あざらし

はじめまして、あざらしです。 フリーターからエンジニア会社へ就職し、 現在はフリーランスのシステムエンジニアとして働いています。 本業のエンジニア業のかたわら、 ✍️ ブログ運営 と「収入の柱を増やす挑戦」を少しずつ続けています。 フリーター時代から比べると、 段階的に収入が増えていくのを実感できるのが素直にうれしい今日この頃。 このブログでは、日々の気づき・体験談 IT・ガジェット・ゲーム系の話 「調べて分かったこと」を噛み砕いた解説 などを中心に、ジャンルに縛られない雑記ブログとして発信しています。 「自分と同じように悩んでいる人のヒントになればいいな」 そんな気持ちで更新中です。 👉 プロフィール詳細は、名前「あざらし」をクリックしてください