概要(to_excelは「DataFrameをExcelに保存」する最短ルート)
pandas.DataFrame.to_excelは、表(DataFrame)を.xlsxへ書き出す標準メソッドです。基本は「ファイル名」「シート名」「インデックス有無」を決めればOK。重要なのは、文字コードではなくExcel専用の“書き出しエンジン”(openpyxl/xlsxwriter)を理解し、ヘッダー・欠損・小数点表示・複数シート・既存ファイルへの追記などを適切に設定することです。
基本の書き出し(ここが重要)
最短の保存とインデックスの扱い
import pandas as pd
df = pd.DataFrame({"名前": ["田中", "鈴木"], "売上": [10000, 15000]})
df.to_excel("sales.xlsx", index=False) # 左端の行番号を出さない
Pythonindex=Falseにすると、余計な行番号(インデックス)をExcelに出さず、見た目がそのまま表になります。
シート名・列の順・ヘッダー制御
df.to_excel(
"sales.xlsx",
sheet_name="Report", # シート名
columns=["名前", "売上"], # 出力列の順と選択
header=True, # ヘッダー行を出す(Falseなら非表示)
index=False
)
Python列順はcolumnsで固定すると、後工程(人の閲覧やインポート)で迷いません。
表示・欠損・配置の整え方(見やすさを決める設定)
欠損や小数の見え方を制御
import numpy as np
df = pd.DataFrame({"商品": ["A","B","C"], "単価": [350.0, np.nan, 280.12345]})
df.to_excel(
"format.xlsx",
index=False,
na_rep="", # 欠損(NaN)を空文字で出力
float_format="%.2f" # 小数は2桁で表示
)
Pythonna_repで欠損の見え方を、float_formatで小数表示桁を揃えます(計算値は内部的には元の数値のままです)。
開始位置(行・列)をずらす
df.to_excel("placed.xlsx", sheet_name="Data", startrow=2, startcol=1, index=False)
Python冒頭に説明文やロゴを先に書く想定なら、表の開始位置をずらしてレイアウトを整えます。
ヘッダー行の固定(スクロールしても見出しを維持)
df.to_excel("freeze.xlsx", index=False, freeze_panes=(1, 0)) # 1行目を固定
Pythonfreeze_panesで“見出し固定”ができます。行を固定するなら(1, 0)、列も固定するなら(1, 1)など。
複数シート・既存ファイルへの追記(ExcelWriterの使い方)
複数のDataFrameを別シートへ
import pandas as pd
with pd.ExcelWriter("multi.xlsx", engine="openpyxl") as w:
pd.DataFrame({"A":[1,2]}).to_excel(w, sheet_name="Sheet1", index=False)
pd.DataFrame({"B":[3,4]}).to_excel(w, sheet_name="Sheet2", index=False)
PythonExcelWriterを使うと、1つのブックに複数シートを書けます。シートごとにto_excelへwriterを渡すのが型です。
既存ブックへ安全に追記・置換
with pd.ExcelWriter(
"existing.xlsx",
engine="openpyxl",
mode="a", # 追記モード
if_sheet_exists="replace" # 同名シートがあれば置き換え("overlay" なども可)
) as w:
df.to_excel(w, sheet_name="Report", index=False)
Python既存に加える場合はmode=”a”。同名シートの扱いをif_sheet_existsで明示すると、事故(重複シート量産)を防げます。
書式・日付・数式の実務ポイント(必要なときだけ軽く使う)
日付や日時のフォーマット(xlsxwriterで一括設定)
import pandas as pd
from datetime import datetime
df = pd.DataFrame({"日付": [datetime(2025,12,15)], "売上": [120.5]})
with pd.ExcelWriter("datefmt.xlsx", engine="xlsxwriter", datetime_format="yyyy-mm-dd") as w:
df.to_excel(w, index=False)
Pythonxlsxwriterエンジンならdatetime_format/date_formatをExcelWriterで一括指定できます。openpyxlでも書けますが、細かな表示形式はopenpyxlでセル書式を直接設定するほうが自由度が高いです。
Excelの数式を書き込む(文字列でOK)
import pandas as pd
df = pd.DataFrame({"値":[10, 20]})
with pd.ExcelWriter("formula.xlsx", engine="openpyxl") as w:
df.to_excel(w, sheet_name="S", index=False, startrow=1)
# 合計セルを後から追加(pandasではセル書式は限定的。必要ならopenpyxlで)
ws = w.book["S"]
ws["A1"] = "値"
ws["B3"] = "=SUM(B2:B3)"
Python数式は「=SUM(…)」の文字列を入れればExcel側で計算されます。リッチな書式やグラフはopenpyxlで直接操作するのが定石です。
実務の安全設計(保存先・エンジン・パフォーマンス)
保存先の用意(親フォルダを先に作る)
from pathlib import Path
import pandas as pd
out = Path("reports") / "summary.xlsx"
out.parent.mkdir(parents=True, exist_ok=True)
pd.DataFrame({"x":[1,2]}).to_excel(out, index=False)
Pythonファイル出力前に親フォルダを作る癖をつけると、存在しないフォルダでの失敗を防げます。
エンジン選択の目安
- 既存.xlsxへの追記・差し替えが多いなら openpyxl。
- 日付フォーマットや条件付き書式などExcel側の見栄えを楽に整えたいなら xlsxwriter。 どちらもpipで導入(pip install openpyxl / pip install XlsxWriter)。未指定でもpandasが適切なエンジンを選ぶことが多いですが、迷ったら明示すると安心です。
大量行の書き出しの勘所
DataFrameが大きい場合は、余計な変換を避け、float_formatやna_repを最初から指定して1回で吐くのが速いです。さらに凝った帳票整形が必要なら、pandasでテーブルを出したあとにopenpyxlで整形を重ねると、速度と品質のバランスが取りやすくなります。
例題で身につける(定番から一歩先まで)
例題1:見出し固定・小数2桁でレポート出力
import pandas as pd
df = pd.DataFrame({"商品": ["コーヒー","紅茶"], "数量": [10,8], "単価": [350.0, 280.0]})
df["金額"] = df["数量"] * df["単価"]
df.to_excel("report.xlsx", index=False, float_format="%.2f", freeze_panes=(1, 0))
Python例題2:複数シートへ同時出力(Writer)
import pandas as pd
sales = pd.DataFrame({"月":[1,2,3], "売上":[120,150,180]})
users = pd.DataFrame({"id":[101,102], "name":["Alice","Bob"]})
with pd.ExcelWriter("bundle.xlsx", engine="openpyxl") as w:
sales.to_excel(w, sheet_name="Sales", index=False)
users.to_excel(w, sheet_name="Users", index=False)
Python例題3:既存ファイルのシートを置き換え
import pandas as pd
df = pd.DataFrame({"id":[1,2], "score":[90,80]})
with pd.ExcelWriter("existing.xlsx", engine="openpyxl", mode="a", if_sheet_exists="replace") as w:
df.to_excel(w, sheet_name="Scores", index=False)
Python例題4:開始位置をずらして表を配置
import pandas as pd
df = pd.DataFrame({"項目":["A","B","C"], "値":[1,2,3]})
df.to_excel("placed.xlsx", sheet_name="Data", startrow=3, startcol=2, index=False)
Pythonまとめ
to_excelは「ファイル名・シート名・インデックス有無」を決めるだけで使えます。見やすさはna_rep(欠損)、float_format(小数桁)、freeze_panes(見出し固定)、startrow/startcol(配置)で整える。複数シートや既存への追記はExcelWriter+mode/if_sheet_existsが安全。リッチな書式やグラフはpandasで出力後にopenpyxl/xlsxwriterで仕上げると、短くて壊れないExcel出力が実務品質になります。
