まずゴールのイメージをはっきりさせる
やりたいことはシンプルです。
「複数の DataFrame を、1つの Excel ファイルの別々のシートに書き出したい」。
pandas では、そのためにpandas.ExcelWriter と DataFrame.to_excel(sheet_name=...) を組み合わせます。
1ファイル=1ブック
1DataFrame=1シート
という対応関係を、自分で設計していくイメージです。
基本形:ExcelWriter を使った複数シート書き出し
最小コードで流れをつかむ
import pandas as pd
df1 = pd.DataFrame({
"month": ["2025-01", "2025-02"],
"amount": [1000, 1500]
})
df2 = pd.DataFrame({
"store": ["Tokyo", "Osaka"],
"amount": [2000, 1800]
})
with pd.ExcelWriter("report.xlsx") as writer:
df1.to_excel(writer, sheet_name="月次集計", index=False)
df2.to_excel(writer, sheet_name="店舗別集計", index=False)
Pythonここで重要なのは3点です。
ExcelWriter("report.xlsx")で「書き込み用のブック」を開くto_excel(writer, sheet_name=...)で、同じブックにシートを追加していくindex=Falseで余計な行番号を出さない
このパターンさえ身体に入れば、あとは「どの DataFrame を、どのシート名で出すか」を増やしていくだけです。
実務パターン:1つの元データから複数の集計シートを作る
例:売上明細 → 月次集計シート+店舗別集計シート
import pandas as pd
df = pd.read_excel("sales.xlsx", parse_dates=["日付"])
df["金額"] = pd.to_numeric(df["金額"], errors="coerce")
monthly = (
df.assign(month=df["日付"].dt.to_period("M"))
.groupby("month", as_index=False)["金額"].sum()
)
by_store = (
df.groupby("店舗", as_index=False)["金額"].sum()
)
with pd.ExcelWriter("sales_report.xlsx") as writer:
monthly.to_excel(writer, sheet_name="月次集計", index=False)
by_store.to_excel(writer, sheet_name="店舗別集計", index=False)
df.to_excel(writer, sheet_name="元データ", index=False)
Pythonこのブックを開くと、シートが3つ並びます。
- 月次集計
- 店舗別集計
- 元データ
「元データも残しつつ、集計結果も同じファイルに入れておく」というのは、現場でかなり喜ばれる形です。
ExcelWriter を使うときの考え方
「ファイルを一度だけ開いて、まとめて書く」
to_excel("file.xlsx") を何度も呼ぶと、そのたびにファイルを開いて上書きしてしまいます。
複数シートを書きたいときにそれをやると、最後の1回だけが残ってしまう。
だからこそ、
with pd.ExcelWriter("file.xlsx") as writer:
df1.to_excel(writer, sheet_name="A")
df2.to_excel(writer, sheet_name="B")
Pythonというスタイルが必要になります。
1回だけファイルを開く
その中にシートを追加していく
最後にまとめて保存される
この流れをイメージしておくと、「なぜ ExcelWriter が必要なのか」が腑に落ちます。
シート名・列名・順番を整えてから書き出す
人に渡す前に「見た目」を少し整えるテンプレート
import pandas as pd
df = pd.read_excel("sales.xlsx", parse_dates=["日付"])
df["金額"] = pd.to_numeric(df["金額"], errors="coerce")
monthly = (
df.assign(month=df["日付"].dt.to_period("M"))
.groupby("month", as_index=False)["金額"].sum()
.rename(columns={"month": "月", "金額": "売上合計"})
)
by_store = (
df.groupby("店舗", as_index=False)["金額"].sum()
.rename(columns={"店舗": "店舗名", "金額": "売上合計"})
)
with pd.ExcelWriter("sales_report_clean.xlsx") as writer:
monthly.to_excel(writer, sheet_name="月次集計", index=False)
by_store.to_excel(writer, sheet_name="店舗別集計", index=False)
Pythonここでは、
- 列名を日本語に整える
- 列の意味がわかるようにリネームする
- その状態で Excel に出す
という「最後のひと手間」を入れています。
この整え方次第で、「ただのデータ」から「ちゃんとしたレポート」に変わります。
つまずきやすいポイントと注意点
同じシート名を2回使うと上書きされる
同じ sheet_name に対して to_excel を2回呼ぶと、後から書いた方で上書きされます。
「追記」ではなく「上書き」なので、シート名は一意に設計してください。
ファイルを開きっぱなしだと書き出せない
Excel で sales_report.xlsx を開いたままこのコードを実行すると、
OS側のロックで書き込みエラーになります。
「書き出すファイルは Excel で閉じておく」
これは地味だけど、毎回意識しておく必要があります。
小さな練習問題
練習1:2つの小さな DataFrame を作り、1つの Excel に別シートで書き出す
df1: 「A」「B」列df2: 「X」「Y」列- シート名は「Sheet_A」「Sheet_B」
自分で DataFrame を作って、ExcelWriter+to_excel で書き出してみてください。
練習2:sales.xlsx から「月次集計」「店舗別集計」「元データ」の3シートを持つレポートを作る
- 集計ロジックはシンプルでOK
- シート名をわかりやすく付ける
- すべて
index=Falseで書き出す
ここまでできると、「Pythonでレポートブックを組み立てる感覚」がかなり掴めてきます。
最後に
pandas.ExcelWriter + to_excel(sheet_name=...) は、
「Pythonで作った複数の結果を、1つの“レポートExcel”にまとめる」ための道具です。
1 DataFrame = 1シート
それをどういう構成で並べるかは、あなたの設計次第です。
「この人には、どんなシート構成のExcelを渡したら一番わかりやすいか?」
そこまで想像しながらシート名や順番を決めていくと、
コードがただの技術ではなく、ちゃんと“仕事の道具”になっていきます。
