Python Excel操作 逆引き集 | 複数シートを書き出す

Python
スポンサーリンク

まずゴールのイメージをはっきりさせる

やりたいことはシンプルです。
「複数の DataFrame を、1つの Excel ファイルの別々のシートに書き出したい」。

pandas では、そのために
pandas.ExcelWriterDataFrame.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 を作って、ExcelWriterto_excel で書き出してみてください。

練習2:sales.xlsx から「月次集計」「店舗別集計」「元データ」の3シートを持つレポートを作る

  • 集計ロジックはシンプルでOK
  • シート名をわかりやすく付ける
  • すべて index=False で書き出す

ここまでできると、「Pythonでレポートブックを組み立てる感覚」がかなり掴めてきます。


最後に

pandas.ExcelWriter + to_excel(sheet_name=...) は、
「Pythonで作った複数の結果を、1つの“レポートExcel”にまとめる」ための道具です。

1 DataFrame = 1シート
それをどういう構成で並べるかは、あなたの設計次第です。

「この人には、どんなシート構成のExcelを渡したら一番わかりやすいか?」
そこまで想像しながらシート名や順番を決めていくと、
コードがただの技術ではなく、ちゃんと“仕事の道具”になっていきます。

タイトルとURLをコピーしました