PythonでExcel集計を行い、売上CSVから「明細・部署別集計・要確認」の3シートを持つ報告用Excelを作る方法です。添付スクリプトとコマンドを使って、文字コードの指定、金額の数値化、欠損の確認まで再現できます。計算はPythonに任せ、除外行と提出前の合計は人が確認します。
PythonでExcel集計する仕組みと用意するもの
毎月の「CSVを開く→部署別に合計する→報告用に整える」を、同じスクリプトの実行に置き換えます。CSVの読み込みは標準のcsvモジュール、Excelへの書き出しはopenpyxlを使い、集計値を数値として保存します。Excelの数式による再計算には依存しません。
用意するものは次の4つです。
- Python 3.10以降が使える、社内で認められた実行環境
- openpyxlが導入された環境(今回の検証は3.1.5)
- 記事に添付した
csv_report.py - 必須列を含む売上CSVと、新しいExcelを保存できるフォルダ
openpyxlの準備が必要な場合は、管理者に導入を依頼してください。スクリプトとCSVを同じ作業フォルダに置き、そのフォルダでターミナルを開きます。以下は python3 が使える環境の実行例です。Windows固有の起動方法は今回検証していません。
AIの利用は必須ではありません。定型処理はローカルで実行し、列名や集計軸を変えるときにAIへ改造を依頼する使い方です。自動化レベルは「AIと一緒にやる」で、無人の定期実行までは含みません。
入力CSVの列・金額・欠損のルール
見出しには 日付,部署,商品コード,金額 が必要です。入力の列順は入れ替えられ、余分な列は集計に使いません。ただし、見出しの重複や必須列の不足は処理を止め、行ごとの列数の不一致は「要確認」に分けます。前後の空白は必須4列の値から取り除きますが、見出し名は完全一致が必要です。
| 項目 | 受け付ける内容 | 要確認になる例 |
|---|---|---|
| 日付 | 実在する日付をYYYY-MM-DDで記載 | 2026/10/01、存在しない日付 |
| 部署 | 空でない文字列 | 空欄 |
| 商品コード | 空でない文字列。先頭ゼロを保持 | 空欄 |
| 金額 | 半角数字で0〜1兆円、13桁以内 | 空欄、NaN、負数、小数、1,000、¥1000 |
金額は検証を通ったものだけ整数に変換します。0 は有効ですが、空欄を0円に置き換えません。部署名も推測で埋めません。記号付き金額を受け付ける必要がある場合は、通貨や桁区切りの規則を決めてからコードを変更します。
「営業」と「営業部」は別部署です。表記ゆれ、税込・税抜、対象期間、同一取引の重複は入力側で確認してください。この版は返品の負数、税計算、通貨換算、重複取引の自動判定には対応しません。
手順1:架空の売上CSVでExcel変換を試す
最初に、実データを使わず練習します。添付を保存したフォルダで次を実行してください。
python3 csv_report.py --demo python3 csv_report.py sample_sales.csv --output output/practice.xlsx
1行目のコマンドで、次の架空データを持つ sample_sales.csv を作ります。すでに同名ファイルがある場合は上書きせず停止するため、初回だけ実行します。
日付,部署,商品コード,金額 2026-10-01,営業,00123,1000 2026-10-02,営業,00124,2500 2026-10-03,企画,00007,500
2行目でExcelが生成され、次の結果が表示されます。
出力: output/practice.xlsx / 採用 3行 / 要確認 0行 / 合計 4,000円
「明細」には日付・部署・商品コード・金額・元行が並びます。商品コードが 00123、00124、00007 のままで、金額は数値になっていることを確認します。「元行」は元CSVのレコード開始行です。セル内の改行を含むレコードでは、その開始位置を示します。完全な空行は読み飛ばします。
「部署別集計」の出力例は次のとおりです。
| 部署 | 合計金額 |
|---|---|
| 企画 | 500 |
| 営業 | 3500 |
| 総計 | 4000 |
「要確認」は見出しだけになります。各シートの先頭行は固定されますが、提出様式に合わせた罫線・印刷設定は行いません。
手順2:毎月のCSV集計をPythonで自動化する
実際の月次CSVを sales_202610.csv のような名前で置き、対象月が分かる別名で出力します。次は練習データのコピーでも実行を確認したコマンドです。
python3 csv_report.py sales_202610.csv --output output/report_202610.xlsx
標準は utf-8-sig で読み込み、BOM付き・BOMなしのUTF-8を扱えます。Shift_JIS系のCSVがcp932で出力されている場合は、次のように指定します。
python3 csv_report.py sales_202610_sjis.csv --encoding cp932 --output output/report_202610_sjis.xlsx
文字コードは推測で切り替えません。cp932はShift_JIS系の文字コードですが、すべてのファイルを読める保証はありません。読み込めない場合は、出力元の文字コードを確認してください。文字化けを置換して無理に続ける処理は入れていません。
毎月は、対象期間と出力条件を確認してCSVを保存し、同じスクリプトを実行します。その後、要確認行を照合し、採用行の合計を検算してから提出します。月をファイル名に付けても期間による絞り込みは行われず、日付が有効な行はすべて集計されます。
原CSVは変更しません。修正が必要ならコピーを作り、出力も report_202610_v2.xlsx など未使用の名前にします。既存ファイルへの上書きは停止します。入力、実行に使ったスクリプト、結果、確認記録を月ごとにまとめると、翌月も同じ条件を再現できます。
手順3:「要確認」を解消してから報告する
たとえば、次の2行があるとします。
2026-10-04,営業,00125, 2026-02-30,企画,00008,800
金額の空欄は「部署・商品コード・金額は必須」、存在しない日付は日付エラーとして「要確認」に回ります。どちらも明細と部署別集計には入りません。「要確認」には元行、理由、入力のリスト表現が残るため、元CSVと照合できます。1行に複数の問題がある場合は、最初に検出した理由が表示されます。
確認するのは次の3点です。
- 採用行数と要確認行数が、空行を除いた入力レコード数と合うか
- 採用行の金額合計、部署別合計の足し算、総計が一致するか
- 除外された金額や期間外のデータが、報告対象に残っていないか
別の承認済みの表計算環境などで、同じ採用条件の合計と照合してください。除外行が残る総計は「採用分の合計」です。全体の売上と扱わず、修正するか、除外理由と金額への影響を確認者が判断します。
AIに集計軸の変更を頼むプロンプト
部署別から部署・商品別へ変える場合は、スクリプトと匿名化したサンプルを渡し、次をコピーします。実データを送る前に、利用環境の承認範囲を確認してください。
添付のcsv_report.pyを、部署×商品コード別の集計に変更してください。 入力列は日付・部署・商品コード・金額のままです。 変更前の原本は残し、修正版を別ファイルで返してください。 維持する条件: ・原CSVと既存出力を上書きしない。 ・商品コードの先頭ゼロと、文字列の式扱い防止を維持する。 ・金額は半角整数、0〜1兆円。欠損や不正値は補完せず要確認へ。 ・UTF-8/cp932の指定、列数検証、総計15桁の制限を維持する。 ・明細・集計・要確認の3シートと、入力元行を残す。 架空データの期待値: 営業/00123/1000、営業/00123/2500、企画/00007/500 →営業×00123=3500、企画×00007=500、総計4000。 金額空欄の行を追加しても総計は4000、要確認は1行増えること。 変更点、実行コマンド、検算結果を説明してください。 実行できなければ未実行と明記し、成功したとは書かないでください。
修正版は別フォルダで試し、先に期待値と一致することを確認します。AIの説明だけで判断せず、Excelの内容と除外条件を人が見ます。
うまくいかないとき
No module named 'openpyxl' は、実行中のPythonからライブラリを使えない状態です。別のPythonへ導入されていないか、管理者に確認します。
読込エラーなら文字コードを確認します。見出しエラーなら全角空白、名称の違い、重複列を確認し、原本のコピーか列名対応のコードを修正します。カンマ区切り以外のファイルは、そのまま対象にしません。
要確認が多いときは、日付形式と金額の記号を先に調べます。引用符が閉じていないなどCSVの構文が壊れている場合は、行単位での分離を続けず全体を停止します。見出しだけのCSVでは総計0になるため、0円という結果だけで正常と判断しないでください。
Excel保存時に停止した場合は、不完全な出力が残る可能性があります。原因を直し、未使用の出力名で再実行してください。大量データはメモリに保持するため、少量のコピーで試してから利用範囲を決めます。
注意点と検証範囲
機密情報・個人情報を含むCSVは、認められた端末と保存先だけで処理します。「要確認」にも元の入力が残ります。AIへの添付は組織のルールに従い、列名と架空データだけで相談できる場合はそれを使ってください。
文字列はExcelの数式として保存しない設計です。ただし、生成物を別形式へ再変換した場合まで安全性を保証するものではありません。最終確認は人が行い、期間、単位、税区分、部署の対応、除外理由を確認して提出します。
今回、Python 3.12.3・openpyxl 3.1.5で、本文のコマンド、部署別合計、先頭ゼロ、UTF-8/cp932、0円、欠損・不正日付・NaN・列数不一致の除外、式に見える文字列の保持、原本不変、既存出力の保護を確認しました。複数行セル・空行の元行、見出し異常、CSV構文不正、総計15桁超での停止も確認済みです。
確認は生成したExcelをライブラリで再読込して行いました。実際のExcel画面、Windows、Pythonの他バージョン、大規模データ、実業務データ、AI改造後の動作は未検証です。削減時間とAIの実応答も測定していません。
よくある質問
PythonでExcelデータを直接集計できますか?
可能ですが、この添付版の入力はCSVです。既存のxlsxを入力しても動きません。まず必要なシートをCSVとして出力するか、Excel読み込み部分を別途実装し、数式セルや日付の扱いも検証してください。
pandasは必要ですか?
この方法では不要です。csvモジュールで読み、Pythonの整数で合計し、openpyxlでExcelに保存します。集計条件が複雑になる場合も、変更前後で同じ検算データを使うと差を確認できます。
カンマや円記号付きの金額も自動変換できますか?
この版は誤解釈を避けるため要確認にします。対応を追加するときは、引用符付きの「1,000」と列ずれを区別し、負数・小数・欠損をどう扱うかを決めてから、正常例と異常例で再検証してください。
添付ファイル CC0 ・ 自由に持ち帰れます
- スクリプト ・ 5.0 KB
会社のデータをAIに入れる前に、社内ルールを確認しましょう。
コメント 0
まだコメントはありません。質問や、試してみた感想を書いてみませんか?