PythonでExcelの複数ファイルを結合するには、同じ列構成の表をopenpyxlで読み取り、1つの一覧へ縦に追加します。この記事では、原本を変更せず、列の違い・空行・型の不一致・重複伝票番号を「要確認」シートへ分けるスクリプトと、AIで自分の帳票に合わせるプロンプトを渡します。結合後も元ファイル名と行番号をたどって照合できます。
Pythonで複数のExcelを1つにまとめる対象
添付の merge_excel.py は、フォルダ直下の .xlsx をファイル名順に読み、各ブックの「売上」シートを結合します。対象は1行目が次の4列の一覧表です。列の順序は違っても構いませんが、列名は完全一致が必要です。
| 列名 | 入力のルール |
|---|---|
| 日付 | 文字列なら 2026-10-01 形式。Excelの日付セルも可 |
| 部署 | 空でない文字列。例:東、西 |
| 伝票番号 | 001 のような文字列。全ファイルを通して一意 |
| 金額 | 0〜1兆円の整数。カンマ・通貨記号なし |
金額の文字列 1000 は整数に変換しますが、1,000 や 1000円 は採用しません。部署・伝票番号の前後の空白は除去します。日付セルに時刻があれば日付だけを残します。
これは明細を下へ積む「縦結合」です。伝票番号で別表の列を横につなぐ処理や、元ブックの書式・グラフの再現は行いません。.xls、.xlsm、結合セル、数式を残した帳票は対象外です。まず合計1万行以下のコピーで試し、メモリや処理時間を確認してください。この行数での性能を保証するものではありません。
用意するもの
- Python 3.10以降と、同じPython環境で使えるopenpyxl。今回の検証はPython 3.12.3・openpyxl 3.1.5です。
- 添付の
merge_excel.pyと、原本からコピーした.xlsx。 - 結果を開いて確認できるExcelなどの表計算ソフト。
- 列名を変える場合は、組織で利用が認められたAI。標準の4列で使うだけならAIは不要です。
Pythonとopenpyxlが未導入なら、組織の承認済み手順で準備します。管理されたPCでは、自己判断で制限を解除しないでください。添付スクリプト自体はネットワークへ接続しません。
手順1:デモデータでExcel結合を試す
スクリプトを専用の作業フォルダに保存し、そのフォルダをターミナルの作業場所にします。以下はmacOS/Linux向けの表記です。openpyxlが使えるPythonで実行してください。
python3 merge_excel.py --demo python3 merge_excel.py demo_merge/input --output output/practice.xlsx
最初のコマンドが架空データを作り、次のコマンドが結合します。demo_merge が既にある場合、デモ生成は停止します。再練習には新しい作業フォルダを使うと確実です。
架空データの入力例と出力例
east.xlsx と west.xlsx の「売上」シートには、次の明細が入ります。各ファイルで1行目が見出し、2行目から明細です。
| ファイル | 日付 | 部署 | 伝票番号 | 金額 |
|---|---|---|---|---|
| east.xlsx | 2026-10-01 | 東 | 001 | 1000 |
| east.xlsx | 2026-10-02 | 東 | 002 | 2000 |
| west.xlsx | 2026-10-01 | 西 | 003 | 3000 |
| west.xlsx | 2026-10-02 | 西 | 004 | 4000 |
実行時の出力は次のとおりです。
出力: output/practice.xlsx / 採用 4行 / 要確認 0件 / 合計 10,000円
出力の「集約」は次の形です。「要確認」は見出しだけになります。
| 日付 | 部署 | 伝票番号 | 金額 | 元ファイル | 元行 |
|---|---|---|---|---|---|
| 2026-10-01 | 東 | 001 | 1000 | east.xlsx | 2 |
| 2026-10-02 | 東 | 002 | 2000 | east.xlsx | 3 |
| 2026-10-01 | 西 | 003 | 3000 | west.xlsx | 2 |
| 2026-10-02 | 西 | 004 | 4000 | west.xlsx | 3 |
「001」が「1」になっていないこと、合計と元行が一致することまで確認します。
Windowsで実行するには
Windowsでは、Pythonランチャーが使える環境なら、上のコマンドの先頭の python3 を py に置き換えます。引数の merge_excel.py --demo や、入力・出力の指定は同じです。PowerShellなどでスクリプトを保存したフォルダを開いて実行します。
py が見つからない場合は、Pythonの導入状況を管理担当者に確認してください。複数のPythonが入っているPCでは、実行に使うPythonからopenpyxlを読み込める必要があります。Windowsでの実行は今回未検証です。
手順2:実ファイルのコピーを結合する
- 専用の
inputフォルダを作り、対象ブックのコピーだけを入れます。原本は別の場所に保管します。 - 各ブックの「売上」シート、1行目の見出し、伝票番号の文字列設定を確認します。
- 数式がある場合は、別ブックへ「値として貼り付け」したコピーを用意します。数式の結果と先頭ゼロを人が照合します。
- 出力は入力とは別のフォルダへ、未使用の名前で保存します。
python3 merge_excel.py input --output output/monthly_202610.xlsx
このコマンドも、デモのコピーを input に置いて実行を確認しました。本番では自分の対象ファイルへ差し替えます。パスに空白がある場合は、入力パス・出力パスをそれぞれ引用符で囲みます。
サブフォルダは読みません。Excelが作る ~$ で始まる一時ファイルも無視します。対象外の拡張子は処理されないため、必要なファイルを取りこぼしていないか投入前に確認してください。出力名が既存の場合や、出力先が入力フォルダ直下の場合は停止します。
列の違い・空行・重複は「要確認」で判断する
出力は「集約」と「要確認」の2シートです。「要確認」には元ファイル・元行・理由・入力値を記録します。
| 検出する内容 | 扱い |
|---|---|
| 不足・余分・重複・空の見出し | そのファイル全体を除外し、1件記録 |
| シートなし・読込不能・結合セル | そのファイル全体を除外し、1件記録 |
| 使用範囲内の空行 | その行を除外し、元行番号を記録 |
| 日付不正・金額不正・数値の伝票番号 | その行を除外し、理由を記録 |
| 数式・Excelのエラー値 | その行を除外 |
| 同じ文字列の伝票番号 | 候補の全行を除外 |
例えば伝票番号 009 が2行あり、一方の金額だけが「不明」でも、両方を重複候補として除外します。金額が正しい方を勝手に採用しません。1行に複数の理由があっても、要確認では1件です。
ただし、ファイル全体を除外したブックの伝票番号は重複判定に含みません。数値の伝票番号も文字列に自動変換して照合しません。要確認がある結果は、全体の重複確認が完了した成果物ではありません。理由を解消して再実行してください。
空行の対象はExcelが保持する使用範囲内です。末尾の未使用行を無限に調べる処理ではありません。書式だけ残った行も空行として出ることがあります。なお、元行が空欄の記録はファイル単位の除外です。「要確認件数」を除外した明細数と同一視しないでください。
AIで自分の列構成に合わせるプロンプト
列名やシート名が違う場合は、添付の adjust_prompt.txt を使います。単に COLUMNS を変えるだけでは、列ごとの型判定や重複キーが一致しなくなるおそれがあります。実データを渡す前に、架空の列名と数行の例で依頼します。
添付merge_excel.pyを、以下の架空の入力仕様に合わせて修正してください。 シート名:明細 1行目の列:取引日、部門、伝票ID、税込金額 対応:日付→取引日、部署→部門、伝票番号→伝票ID、金額→税込金額 重複キー:全ファイルを通した伝票ID 日付はYYYY-MM-DD、伝票IDは先頭ゼロを保持する文字列、金額は0以上の整数です。 原本非変更、既存出力の上書き禁止、元ファイル名・行番号の記録を維持してください。 列の過不足・空行・型不一致・数式・重複候補を要確認へ分けてください。 型エラー行も重複判定に含め、重複候補は全行除外してください。 ファイル単位の除外がある場合、全体の重複確認は未完了と明示してください。 変更した完全なコード、変更理由、架空の正常系・異常系データ、期待結果を返してください。 正常系だけでなく、重複の片方が金額不正の場合、列不足、先頭ゼロ、既存出力の保護も確認してください。 実行できた場合だけ実行結果を示し、未実行なら未検証と書いてください。
AIの回答は保存前に差分を確認し、別の作業フォルダで練習データから試します。部署ごとに同じ伝票番号を使うなら、「部署+伝票番号」の組み合わせへ変更する必要があります。重複の定義は業務の担当者が決めてください。
うまくいかないとき
No module named 'openpyxl':実行に使っているPythonにopenpyxlがありません。承認済みの導入手順を確認します。- 見出しエラー:前後の空白、改行、余分な備考列、書式で広がった列も確認します。必要な列を黙って捨てず、入力仕様かスクリプトを直します。
- 伝票番号が数値扱い:表示形式を文字列に変えるだけで、失われたゼロは復元できません。正しい番号を原本と照合し、入力コピーを作り直します。
- ファイル読込エラー・採用0行:暗号化、破損、対象シートや形式の違いを確認します。出力が作られても成功とは限りません。
- 保存時に停止:既存出力と同名でないか、保存権限や空き容量を確認し、未使用の名前で再実行します。
注意点と人が行う最終確認
機密情報・個人情報を含むExcelを、許可のないAIへアップロードしないでください。列名やファイル名にも情報が含まれます。「要確認」には入力値も残るため、出力ファイルにも原本と同じ管理が必要です。
結合後は、対象ファイル一覧、要確認の理由、採用件数、金額合計、伝票番号を人が照合します。要確認を直したら全ファイルを再実行し、新しい出力名で結果を比較します。原本と出力の総額を比べるときは、除外した行・ファイルの金額を分けて検算します。原本を変更しない設計でも、結果の正しさは自動的には保証されません。
よくある質問
列の順番が違うExcelでも結合できますか?
4つの見出しが完全一致していれば結合できます。列名が違う場合や列を追加する場合は、型判定と出力列も含めてスクリプトを調整します。
同じ伝票番号は先に読んだ方だけ残せますか?
添付版は全候補を要確認へ分けます。訂正版か二重計上かを機械的に決めないためです。採用基準を決めずに重複を削除しないでください。
Excelの数式や書式も引き継げますか?
引き継ぎません。数式は要確認へ分け、集約には検証した値を新しく書き出します。原本の見た目を保つ必要がある帳票には、別の設計が必要です。
検証範囲
Python 3.12.3・openpyxl 3.1.5のローカル環境で添付版を実行しました。デモ4行・合計10,000円、列順変更、先頭ゼロ、日付セル、数値文字列、空行、列の過不足・重複、シート不足、破損ファイル、結合セル、型不一致、数式、Excelエラー、異常行を含む重複候補の除外を確認しました。入力ファイルのハッシュ一致、既存出力の保護も確認済みです。
Windowsの py、AIサービス内での実行、大量データの性能、実務での削減時間は未検証です。自動化レベルは「AIと一緒にやる」です。AIによる変更のレビューと、結合結果の最終確認を人が担当します。
添付ファイル CC0 ・ 自由に持ち帰れます
- スクリプト ・ 6.7 KB
- プロンプト ・ 1.2 KB
会社のデータをAIに入れる前に、社内ルールを確認しましょう。
コメント 0
まだコメントはありません。質問や、試してみた感想を書いてみませんか?