どうもこんにちは、Tadash です。
AI エージェントに「Excel を作って」と頼むと、Python のライブラリを選ぶところから始まります。ここで何を選んだかが、そのまま成果物の性質になります。速い代わりに数式が計算されないもの、何でもできる代わりに Excel の起動が要るもの。同じ「Excel を作った」でも中身が違ってきます。
今回は、メジャーどころを並べたうえで、同じ仕様のファイルを5通り作ってもらい、採点も Bob 自身にお願いしました。結論から書くと、今回の条件では openpyxl と xlwings の2つが良さそうでした。
きっかけ
官公庁の PDF を Excel チェックリストにするを書いたときの話です。実は記事には書いていないのですが、最初は xlwings で作ってもらっていました。本物の Excel を起動して操作する方式です。これが時間がかかり、途中で止まりました。openpyxl に切り替えたら一瞬で終わりました。
そのときは「そういうものか」で流してしまい、何がどう違うのかを言葉にできていませんでした。今回はそれを確かめます。
メジャーどころ
Excel を扱う Python ライブラリを、性格ごとに並べます。
| ライブラリ | 役割 | Excel 本体 | 数式 | 書式・グラフ |
|---|---|---|---|---|
| openpyxl | xlsx の読み書き(標準的な選択) | 不要 | 書ける(計算はしない) | ひととおり可 |
| xlsxwriter | xlsx の書き出し専用 | 不要 | 書ける(計算はしない) | 表現力は高い |
| pandas | 表データの入出力 | 不要 | 守備範囲外 | 守備範囲外 |
| xlwings | 本物の Excel を操作 | 要る | 計算できる | Excel の全機能 |
| pywin32 | 生の COM(Office 全体) | 要る | 計算できる | Excel の全機能 |
表の「数式」の列に、ひとつ注意があります。数式を書けることと、数式を計算できることは別です。
openpyxl も xlsxwriter も、=SUM(D2:D100) という文字列をセルに置くことはできます。ただし計算はしません。Excel のファイル形式は、数式そのものと直前の計算結果(キャッシュ値)を別々に持っていて、計算するのは Excel 本体だからです。xlwings と pywin32 は本物の Excel を動かすので、保存された時点で計算結果も一緒に入っています。代わりに Excel の起動を待つことになります。
pandas だけ性格が違います。表データを読み書きするためのライブラリなので、数式も書式もグラフも守備範囲の外です。DataFrame の中身をそのままシートに流し込むところまでを引き受けて、セルの見た目や =SUM() には関与しません。書式やグラフを足したければ、書き出したあとに openpyxl で開き直すことになります。
下2つは別物ではありません。xlwings は pywin32 のラッパーです。手元の xlwings 0.35.3 は Windows では pywin32>=224 に依存していて、内部で win32com.client を呼んでいます。叩いている COM は同じで、違うのは書き味だけです。
それでも両方を試すことにしました。叩いている先が同じなので、差が出たとすれば、それは xlwings 側で余分にかかっている分だと切り分けられます。
もうひとつ、xlwings は Excel 専用なので、Word や PowerPoint まで話が広がると使えません。その点 pywin32 なら、Word も PowerPoint も、Office 文書全般を同じ書き方で扱えます。
実験:同じ仕様を5通りで
お題はこうしました。
- ダミーの売上明細 5,000行(日付・支店・品目・単価・数量・金額)
- 金額はセルの数式(
=単価*数量)で計算する - 末尾に合計行
- 見出しに太字と背景色
- 支店別売上の棒グラフ
数式・書式・グラフ・件数を1つに入れてあります。数式をセルに置けるか、太字や背景色やグラフをどこまで表現できるか、5,000行をどれくらいの時間でさばくか。各ライブラリの得意不得意は、ここで出るはずです。
プロンプト①:まず何を選ぶか見る
いきなり5本お願いする前に、どれを使うかは Bob に選んでもらいます。
ダミーの売上明細5,000行(日付・支店・品目・単価・数量・金額)から Excel ファイルを1つ作ってください。金額はセルの数式で計算し、末尾に合計行を入れてください。見出しは太字と背景色を付け、支店別の売上を棒グラフにしてください。使う Python ライブラリは自分で選び、選んだ理由を先に書いてから実装してください。
Bob は openpyxl を選びました。理由として挙げたのは次の5点です。
- セルに直接 Excel 数式を設定できる
- フォント・背景色などを細かく制御できる
- 棒グラフを含む各種グラフに対応している
- 5,000行なら問題なく処理できる
- Excel ファイル操作のデファクトスタンダードである
補足:理由は「先に」書いてもらいます。
実装のあとで理由を書いてもらうと、書いたコードを正当化する文章になりがちです。先に頼んでおくと、比較検討の跡が残ります。実際、このとき Bob が比較対象に挙げたのは pandas・xlwt/xlrd・pyexcel で、xlwings と pywin32 は候補に入っていませんでした。「Excel を起動する方式もある」という選択肢が視野に無い状態で選んでいた、と分かります。選定理由を残しておくと、あとで「この前提はもう変わった」と判断できます。
プロンプト②:5本そろえる
同じ仕様のファイルを、次の5つでそれぞれ作ってください。openpyxl / xlsxwriter / pandas / xlwings / pywin32(生の COM)。
(1)実装ごとにスクリプトとファイル名を分けてください。
(2)作成にかかった秒数を計測し、記録してください。Excel を起動する方式は、起動から終了までを含めて測ってください。
(3)仕様のうち実現できなかったものがあれば、別の方法で代替せず「できなかった」と記録してください。
(4)実装の途中で仕様を変えないでください。5本とも同じものを作ってください。
(5)xlwings と pywin32 は同じ COM を叩きます。どちらかの結果を流用せず、それぞれ別に実装して別に測ってください。
出てきた実測値です。
| ライブラリ | 所要時間 | ファイルサイズ | 数式 | 書式 | グラフ |
|---|---|---|---|---|---|
| openpyxl | 0.25 秒 | 195,611 B | ○ | ○ | ○ |
| xlsxwriter | 0.28 秒 | 184,883 B | ○ | ○ | ○ |
| pandas | 0.53 秒 | 186,423 B | ×(計算値のみ) | ○ ※ | ○ ※ |
| xlwings | 8.63 秒 | 261,256 B | ○ | ○ | ○ |
| pywin32 | 8.28 秒 | 261,659 B | ○ | ○ | ○ |
Excel を起動しない3本は1秒を切り、起動する2本は8秒台でした。30倍以上の開きです。xlwings と pywin32 の差は 0.35 秒で、8秒台の中では誤差の範囲になります。遅さの正体はラッパーではなく Excel の起動だ、と読めます(計測に使った CPU は Intel Core i7-11700F です)。
pandas だけ「数式 ×」になりました。DataFrame の値をそのまま書き出す作りなので、数式ではなく計算済みの数値が入ります。
※ pandas 版の書式とグラフは、pd.ExcelWriter(engine="openpyxl") で書き出したあと openpyxl で開き直して付けたものです。pandas が作ったわけではありません。
プロンプト③:採点も本人にお願いする
作った5つの成果物を評価してください。
(1)評価軸は自分で決めて、先に一覧にしてください。
(2)軸ごとに5実装を比較する表を作り、そう判定した根拠を書いてください。
(3)作ったファイルを実際に開いて中身を確認したうえで書いてください。とくに、数式を入れたセルに計算結果が入っているかどうかを確認してください。
(4)どの用途にどれを勧めるかを最後にまとめてください。
Bob は7つの評価軸を立て、検証用のスクリプトを書いて実際にファイルを開き、総合評価マトリクスにまとめてきました。判定は★の5段階で返ってきたので、数えやすいように数字へ置き換えています。
| ライブラリ | 速度 | 数式 | 書式 | グラフ | 記述性 | 依存 | メモリ | 総合 |
|---|---|---|---|---|---|---|---|---|
| openpyxl | 5 | 5 | 5 | 5 | 5 | 5 | 4 | 5 |
| xlsxwriter | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 |
| pandas | 4 | 1 | 4 | 4 | 5 | 4 | 3 | 3 |
| xlwings | 1 | 5 | 5 | 5 | 3 | 2 | 2 | 3 |
| pywin32 | 1 | 5 | 5 | 5 | 2 | 2 | 2 | 2 |
ひとつだけ補っておくと、Bob が確認したのは「数式が入っているかどうか」までで、その数式の計算結果までは見ていませんでした。openpyxl と xlsxwriter で作ったファイルは、数式は入っていますが、計算結果のほうは入っていません。Excel で開けば計算されるので、人が開いて使うぶんには何も困りません。掘ると長くなるので今回は触りだけにしますが、AI が出した採点は、根拠のところまで人間が確かめておくほうがいいとは言えそうです。
使い分け
今回の結果を踏まえた、現時点の整理です。
- openpyxl … Excel が無くても動き、書式もグラフも一通り作れます。5,000行で 0.25 秒。標準的な選択になります
- xlsxwriter … 今回のお題の範囲では、openpyxl に対する優位性がありませんでした。速度はほぼ同じで、作れるものも変わらず、読み取りと追記ができないぶん制約だけ多いです。差が出るのは行数が桁違いになったときで、メモリの使い方が有利になります。数十万行を吐くバッチなら、ここが選ぶ理由になります
- pandas … Excel ファイルを組み立てるライブラリではなく、データを整えて渡す役です。数式・書式・グラフは openpyxl 側の仕事になります。集計済みの表を素のまま出すだけなら、これで済みます
- xlwings … openpyxl では手が出ない機能が使えます。数式の計算、ピボットテーブル、PDF 出力、図形、既存マクロの実行。8秒台を払う理由はここにあります
- pywin32 … Excel だけでなく、Word や PowerPoint も同じ書き方で扱えます。Office 全体を自動化する話になったときの選択肢です
今回の検証に限れば、openpyxl と xlwings の2つで足りそうです。Excel が無い環境で速く作るのが openpyxl、Excel にしかできないことを任せるのが xlwings、という分け方です。
xlwings を採ったもう1つの理由は、同じ COM を叩く pywin32 よりコードが読みやすいことです。たとえば見出しの色は、xlwings なら (68, 114, 196) と RGB のタプルで書けますが、pywin32 では 12874308 という BGR 順の整数になります。Word や PowerPoint まで面倒を見るのでなければ、xlwings のほうが後から読めます。
まとめ
- ライブラリの選び方で、出来上がる Excel の性質が変わります。 数式・書式・グラフ・速度のどれを取るかで、答えが変わってきます
- AI に任せきりにせず、何通りか作ってもらって並べるのが早いです。今回はプロンプト3本で足りました
- 今回の条件で良さそうだったのは openpyxl と xlwings です。Excel が無い環境で速く作るなら openpyxl、Excel にしかできないことが要るなら xlwings
- AI が出した採点は、根拠まで人間が確かめる。 判定の理由も書いてもらうと、どこを見ていないかが分かります
ライブラリの一覧を眺めて決めるより、同じお題を何通りか作ってもらって、実物を並べるほうが早い。今回いちばん腑に落ちたのはそこでした。最初のプロンプトから採点まで、10分ほどです。
※2026-08-01 時点。Bob Shell 1.0.6、Intel Core i7-11700F(Microsoft Excel インストール済み)で、1回だけ実行した結果です。使用バージョンは Python 3.13.1 / openpyxl 3.1.5 / XlsxWriter 3.2.9 / pandas 3.0.3 / xlwings 0.35.3 / pywin32 309。LLM の出力は毎回同じにはならないので、同じプロンプトでも別のライブラリを選ぶ、別の評価軸を立てる、といったことは起こります。所要時間も環境と実行ごとに変わります。ダミーデータは自動生成したもので、業務データは使用していません。
出典
- openpyxl | 公式ドキュメント
- XlsxWriter | 公式ドキュメント
- xlwings | 公式ドキュメント
- pandas.read_excel / DataFrame.to_excel | 公式ドキュメント
- pywin32 | GitHub
※投稿内容は個人の見解であり、必ずしも私の所属団体・企業における立場、戦略、意見を代表するものではありません。
