「エンジンを指定する」ってそもそも何をしているのか
pandas が Excel に書き出すとき、
実際に .xlsx ファイルを作っているのは「pandasそのもの」ではなく、openpyxl や XlsxWriter といった 外部ライブラリ(エンジン) です。
engine='xlsxwriter' は、
「この Excel は XlsxWriter を使って書いてほしい」
と pandas に指示している、ということです。
同じ to_excel でも、
どのエンジンを使うかで「できること」「得意分野」が少し変わります。
一番シンプルな書き出しと engine の指定
デフォルト(エンジン指定なし)の書き方
import pandas as pd
df = pd.DataFrame({
"month": ["2025-01", "2025-02"],
"amount": [1000, 1500]
})
df.to_excel("out.xlsx", index=False)
Python多くの環境では、これだけで .xlsx が書き出せます。
裏側では、pandas が自動的に openpyxl などを選んで使っています。
明示的に XlsxWriter を使う書き方
import pandas as pd
df = pd.DataFrame({
"month": ["2025-01", "2025-02"],
"amount": [1000, 1500]
})
df.to_excel(
"out_xlsxwriter.xlsx",
index=False,
engine="xlsxwriter"
)
Python見た目はほとんど同じですが、
このファイルは「XlsxWriter が生成した Excel」です。
「じゃあ何が違うの?」という話を、ここから掘っていきます。
XlsxWriter を使うときの典型パターン
書式設定やグラフなど「装飾」をしっかりやりたいとき
XlsxWriter は「Excel の装飾・レイアウト・グラフ」に強いライブラリです。
pandas と組み合わせるときは、ExcelWriter と一緒に使うのが定番です。
import pandas as pd
df = pd.DataFrame({
"month": ["2025-01", "2025-02", "2025-03"],
"amount": [1000, 1500, 1200]
})
with pd.ExcelWriter(
"styled_report.xlsx",
engine="xlsxwriter"
) as writer:
df.to_excel(writer, sheet_name="売上", index=False)
workbook = writer.book
worksheet = writer.sheets["売上"]
money_fmt = workbook.add_format({"num_format": "#,##0", "align": "right"})
worksheet.set_column("B:B", 12, money_fmt)
Pythonここでやっていることは、
DataFrame を書き出す
XlsxWriter の workbook / worksheet オブジェクトを取り出す
列の書式(カンマ区切り・右寄せ)を設定する
という流れです。
「pandas でデータを作る → XlsxWriter で見た目を整える」という分業ができるのが、engine="xlsxwriter" を明示する大きなメリットです。
openpyxl と xlsxwriter のざっくりした違い
openpyxl のイメージ
既存の .xlsx を読み書きできる
既存ファイルにシートを追加したり、セルを編集したりしやすい
pandas の「読み込み」「追記(mode=’a’)」と相性がいい
たとえば、既存ファイルにシートを追加するときは、ほぼ必ず openpyxl を使います。
import pandas as pd
df = pd.DataFrame({
"month": ["2025-01", "2025-02"],
"amount": [1000, 1500]
})
with pd.ExcelWriter(
"report.xlsx",
mode="a",
engine="openpyxl"
) as writer:
df.to_excel(writer, sheet_name="追加シート", index=False)
PythonXlsxWriter のイメージ
新規に .xlsx を作るのが得意
書式設定・条件付き書式・グラフなどの装飾が強力
既存ファイルの編集(追記)は基本的にできない(新規作成専用と考える)
つまり、
「既存ブックをいじる」→ openpyxl
「新しく“きれいなレポート”を作る」→ xlsxwriter
という使い分けがしっくりきます。
実務テンプレート:XlsxWriter でちょっと“レポート感”を出す
合計行に太字を付ける例
import pandas as pd
df = pd.DataFrame({
"month": ["2025-01", "2025-02", "2025-03"],
"amount": [1000, 1500, 1200]
})
total = df["amount"].sum()
df_total = pd.DataFrame({"month": ["合計"], "amount": [total]})
with pd.ExcelWriter("report_styled.xlsx", engine="xlsxwriter") as writer:
df.to_excel(writer, sheet_name="売上", index=False, startrow=0)
df_total.to_excel(writer, sheet_name="売上", index=False, startrow=len(df)+2)
workbook = writer.book
worksheet = writer.sheets["売上"]
bold_fmt = workbook.add_format({"bold": True})
worksheet.write(len(df)+2, 0, "合計", bold_fmt)
worksheet.write(len(df)+2, 1, total, bold_fmt)
Pythonここでは、
DataFrame を普通に書き出す
その下に「合計」行を追加する
合計行だけ太字にする
という「レポートっぽい」仕上げを、XlsxWriter の機能でやっています。
どのエンジンを使うかを決めるときの考え方
まずは「何をしたいか」から逆算する
既存ファイルにシートを追加したい
→ ExcelWriter(mode="a", engine="openpyxl")
新規にレポートブックを作り、書式やグラフも整えたい
→ ExcelWriter(engine="xlsxwriter")
ただ単に DataFrame を Excel に出したいだけ
→ エンジン指定なし(環境に任せる)でもよいが、
将来を見据えて engine="openpyxl" に寄せておくのもアリ
「とりあえず動けばいい」から一歩進む
最初は df.to_excel("out.xlsx", index=False) だけで十分です。
でも、「既存ブックに追記したい」「見た目も整えたい」となった瞬間に、
エンジンの違いが効いてきます。
そこで初めて、
読み書き・追記 → openpyxl
新規レポート・装飾 → xlsxwriter
という選択を意識できると、一気に“仕事で使える Excel 出力”になります。
小さな練習アイデア
1つの DataFrame を使って、
engine指定なしでto_excelengine="openpyxl"でto_excelExcelWriter(engine="xlsxwriter")を使って、列に書式を付けてto_excel
この3パターンを試してみると、
「エンジンを意識する/しない」で何が変わるかが、体感でわかってきます。
まとめの一言
engine='xlsxwriter' は、
「この Excel は“ただのデータ”じゃなくて、“ちゃんとしたレポート”として仕上げたい」
と思ったときに、本領を発揮します。
一方で、既存ブックをいじるなら engine='openpyxl'。
この2つを意識して使い分けられるようになると、
「PythonでExcelを扱う」が、単なる入出力から“設計されたアウトプット”に変わっていきます。
