Python Excel操作 逆引き集 | 書き込み時のエンジン指定(xlsxwriter/openpyxl)

Python
スポンサーリンク

「エンジンを指定する」ってそもそも何をしているのか

pandas が Excel に書き出すとき、
実際に .xlsx ファイルを作っているのは「pandasそのもの」ではなく、
openpyxlXlsxWriter といった 外部ライブラリ(エンジン) です。

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)
Python

XlsxWriter のイメージ

新規に .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 を使って、

  1. engine 指定なしで to_excel
  2. engine="openpyxl"to_excel
  3. ExcelWriter(engine="xlsxwriter") を使って、列に書式を付けて to_excel

この3パターンを試してみると、
「エンジンを意識する/しない」で何が変わるかが、体感でわかってきます。


まとめの一言

engine='xlsxwriter' は、
「この Excel は“ただのデータ”じゃなくて、“ちゃんとしたレポート”として仕上げたい」
と思ったときに、本領を発揮します。

一方で、既存ブックをいじるなら engine='openpyxl'
この2つを意識して使い分けられるようになると、
「PythonでExcelを扱う」が、単なる入出力から“設計されたアウトプット”に変わっていきます。

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