Python Excel操作 逆引き集 | 既存ファイルにシート追加で書き出す

Python
スポンサーリンク

何をしたい機能なのかをまず言葉でつかむ

やりたいことはこうです。

「すでに存在する 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 に「テストシート」を追加する

条件は次の通りです。

  1. 小さな DataFrame(例:{"A": [1,2], "B": [3,4]})を作る
  2. ExcelWriter(mode="a", engine="openpyxl")report.xlsx を開く
  3. sheet_name="テスト" で書き出す
  4. Excel で開いて、シートが追加されているか確認する

練習2:sales_book.xlsx に、毎月の集計シートを追加していく

条件は次の通りです。

  1. sales_2025_01.xlsx, sales_2025_02.xlsx などを順番に読み込む
  2. 各ファイルごとに月次集計を作る
  3. sheet_name"2025-01", "2025-02" のようにして追記する

最後に

ExcelWriter(mode='a', engine='openpyxl') は、
「既存の Excel ブックに、Pythonから“あとからシートを足す”ための入り口」です。

これを使いこなせると、

毎月のレポートを1ファイルに積み上げていく
元データブックに分析結果シートを追加していく
人が使っている既存の Excel に、そっと“Python製のシート”を差し込む

といったことが、自然なコードで書けるようになります。

「この既存の Excel に、どんなシートを足したら仕事が楽になるか?」
そこをイメージしながら、シート名と中身を設計してみてください。
その設計力が、そのままあなたの“Pythonで仕事を変える力”になります。

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