何をしたい機能なのかをまず言葉でつかむ
やりたいことはこうです。
「すでに存在する Excel ファイル(既存ブック)に、
新しいシートを“追加”して書き込みたい。
既存のシートはそのまま残したい。」
そのために使うのが、
pd.ExcelWriter("file.xlsx", mode="a", engine="openpyxl")
Pythonです。mode='a' は「append(追記)」、engine='openpyxl' は「.xlsx を扱うエンジンを明示する」という意味です。
基本形:既存ファイルにシートを追加するコード
いちばんシンプルな例
まず、report.xlsx という既存ファイルがある前提で考えます。
そこに、新しい集計結果 df_new を「新しいシート」として追加したい。
import pandas as pd
df_new = pd.DataFrame({
"month": ["2025-01", "2025-02"],
"amount": [1000, 1500]
})
with pd.ExcelWriter(
"report.xlsx",
mode="a",
engine="openpyxl"
) as writer:
df_new.to_excel(writer, sheet_name="月次集計_2025", index=False)
Pythonこれで、report.xlsx の中に
「月次集計_2025」という新しいシートが追加されます。
既存のシート(たとえば「元データ」「過去集計」など)はそのまま残ります。
ここでの重要ポイントは、
mode="a" で「追記モード」engine="openpyxl" で「.xlsx を openpyxl で扱う」
この2つをセットで書くことです。
なぜ engine=’openpyxl’ が必要なのか
既存ファイルを“開いて編集する”には、対応したエンジンが要る
新規作成(mode='w')なら、pandas が内部で勝手にエンジンを選んでくれることも多いですが、
既存ファイルに追記する場合は、「そのファイル形式を理解して編集できるエンジン」が必要です。
.xlsx の場合は、基本的に openpyxl を使います。
with pd.ExcelWriter("report.xlsx", mode="a", engine="openpyxl") as writer:
...
Pythonこれを書いておくことで、
既存のシート構成を読み込む
その上に新しいシートを追加する
全体を保存し直す
という流れが成立します。
実務パターン:毎月の集計シートを既存ブックに追加していく
例:sales_report.xlsx に「2025-01」「2025-02」…とシートを増やしていく
すでに sales_report.xlsx があり、
そこに毎月の集計結果を「月ごとのシート」として追加していくイメージです。
import pandas as pd
df = pd.read_excel("sales_2025_01.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()
)
with pd.ExcelWriter(
"sales_report.xlsx",
mode="a",
engine="openpyxl"
) as writer:
monthly.to_excel(writer, sheet_name="2025-01", index=False)
Python翌月は、同じファイルに対してシート名だけ変えて追記します。
df = pd.read_excel("sales_2025_02.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()
)
with pd.ExcelWriter(
"sales_report.xlsx",
mode="a",
engine="openpyxl"
) as writer:
monthly.to_excel(writer, sheet_name="2025-02", index=False)
Pythonこうしていくと、1つの sales_report.xlsx の中に
「2025-01」「2025-02」「2025-03」…とシートが増えていきます。
既存シートを残しつつ、新しい分析結果を足していく
例:元データ+集計シートを後から追加する
最初は「元データ」だけの Excel があるとします。
import pandas as pd
df = pd.read_excel("sales_raw.xlsx", parse_dates=["日付"])
df["金額"] = pd.to_numeric(df["金額"], errors="coerce")
with pd.ExcelWriter(
"sales_book.xlsx",
mode="w",
engine="openpyxl"
) as writer:
df.to_excel(writer, sheet_name="元データ", index=False)
Pythonあとから、「月次集計」と「店舗別集計」を同じブックに追加したくなったとします。
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_book.xlsx",
mode="a",
engine="openpyxl"
) as writer:
monthly.to_excel(writer, sheet_name="月次集計", index=False)
by_store.to_excel(writer, sheet_name="店舗別集計", index=False)
Pythonこれで、
元データ
月次集計
店舗別集計
という3シート構成のブックが完成します。
「最初に元データだけ作っておいて、あとから分析結果を足す」という流れが自然に書けます。
上書きと追加の違いをはっきり意識する
mode=’w’ は「ファイルごと作り直す」
with pd.ExcelWriter("file.xlsx", mode="w", engine="openpyxl") as writer:
...
Pythonこれは「新規作成 or 上書き」です。
既存の file.xlsx があっても、中身は全部消えて作り直されます。
mode=’a’ は「既存の中身を残したまま、シートを追加する」
with pd.ExcelWriter("file.xlsx", mode="a", engine="openpyxl") as writer:
...
Pythonこれは「追記」です。
既存のシートはそのまま残り、新しいシートが増えます。
ただし、同じ sheet_name を指定すると、そのシートは上書きされることが多いので、
「シート名は一意にする」か、「あえて上書きする」かを意識して設計してください。
よくあるつまずきポイント
既存ファイルが .xlsx 以外だと動かない
engine="openpyxl" は .xlsx 用です。.xls(旧形式)や .xlsm(マクロ付き)などを扱う場合は、
そもそも「追記で編集できるか」がエンジン依存になります。
基本的には、「追記したいブックは .xlsx にしておく」と決めておくのが安全です。
Excel で開きっぱなしだと書き込めない
report.xlsx を Excel で開いたままこのコードを実行すると、
OS のロックで「書き込めません」というエラーになります。
「追記したいファイルは、Excel で閉じてから実行する」
これは毎回意識しておく必要があります。
小さな練習問題
練習1:既存の report.xlsx に「テストシート」を追加する
条件は次の通りです。
- 小さな DataFrame(例:
{"A": [1,2], "B": [3,4]})を作る ExcelWriter(mode="a", engine="openpyxl")でreport.xlsxを開くsheet_name="テスト"で書き出す- Excel で開いて、シートが追加されているか確認する
練習2:sales_book.xlsx に、毎月の集計シートを追加していく
条件は次の通りです。
sales_2025_01.xlsx,sales_2025_02.xlsxなどを順番に読み込む- 各ファイルごとに月次集計を作る
sheet_nameを"2025-01","2025-02"のようにして追記する
最後に
ExcelWriter(mode='a', engine='openpyxl') は、
「既存の Excel ブックに、Pythonから“あとからシートを足す”ための入り口」です。
これを使いこなせると、
毎月のレポートを1ファイルに積み上げていく
元データブックに分析結果シートを追加していく
人が使っている既存の Excel に、そっと“Python製のシート”を差し込む
といったことが、自然なコードで書けるようになります。
「この既存の Excel に、どんなシートを足したら仕事が楽になるか?」
そこをイメージしながら、シート名と中身を設計してみてください。
その設計力が、そのままあなたの“Pythonで仕事を変える力”になります。
