【番外編】Excelファイルの操作
みなさんが最終課題のpythonアプリコンテストに望めるようにと、いろいろなアプリを紹介してきたつもりだが、ややゲームに偏り、実用アプリに取り組むための情報が不足している気もする。そこでここでは、組織や個人でのビジネスを省力化、加速化する手法として、Excelファイルをpythonから読み書きする方法を紹介する。リモートワークなどで「働き方改革」が叫ばれている現在、自分の仕事を見直し、退屈で機械的な部分は、できるだけpythonに任せてしまうことを考えるべきである。「pythonがやった分まで自分の仕事としてカウントされる」ことになるのだから、やらない理由がない。
Excelを扱うpythonモジュールは複数あるが、ここでは最も単純で、だが使いようによってはかなり高度なことまで自動化できるツールとして、openpyxlを使う。簡単な使い方はこのstepで紹介したが、各クラスやメソッドの詳しい説明は、openpyxlモジュールの公式リファレンスサイトを参照するとよい。これも英語だが、使う部分だけ調べるのならさほどの手間ではないはずだ。ホームページを図11-1に示す。

openpyxlは何をするのか
Excel上の仕事を自動化するツールは、もちろんopenpyxlだけではないし、またpythonを使わなくてもできる。最も普及しているのはExcelの一部として統合されているプログラミング言語、Visual Basic for Application(VBA)だろう。だが、これは1960年代初期からある古いBasic言語に基づいており、とてもpythonを学んだ皆さんにお奨めできるシロモノではない。最大の欠点は、プログラムが特定のExcel文書と結びついており、再利用が著しく面倒なことだ。
またVBAとopenpyxlでは、同じ「Excelを扱う」と言ってもアプローチが異なる。その違いを以下に示す。
- VBAのプログラム
- Excelというアプリケーション自体を制御する。処理系もExcelの一部である。だからExcelを起動し、そのプログラムを含んだ文書を読み込まないと実行できない。その代わり、Excelのかなりマイナーな機能までカバーしている。
- python/openpyxlのプログラム
- Excelの文書ファイルを読み書きし、加工する。したがってExcelと無関係に起動でき、プログラムはExcelやExcel文書とは独立である。Excelの代表的な機能は一通りカバーしているが、たとえばセルに数式を設定しても、その評価自体はExcelが行うので、やや工夫が必要な部分もある。だが、pythonとexcelがシームレスに使えるのなら、どうしても表計算でやらなくてはならない理由もあまりない(python側でどんな計算でもできるから※1)。
1 2番目のサンプルプログラムmakegraph.pyに、Excel側に計算を指示する場合と、python側で計算する場合の両方を取り入れた。前述のようにopenpyxlはExcelの文書ファイルを操作するだけなので、表計算の結果をさらにグラフ化するような場合は、一旦Excel文書を保存して再度開かなければならないのが欠点である。このとき、表計算は文書が開かれるタイミングでExcelが行う。
単純なExcel文書の自動作成
pythonプログラムから単純なExcel文書を作成するサンプルを通して、openpyxlモジュールの基本的な使い方を学ぶ。(リスト11-2)をコマンドプロンプトから実行すると、図11-2に示す「test.xl」というExcel文書が作成される。

以下のやり方を確認しよう。単純な指示でExcel文書への値書き込みができることがわかるはずだ。
- Excel文書の開き方(作成)
- ワークシートオブジェクトの取得
- セル範囲の表記から行、セルという2重ループによって個別セルのオブジェクトを取得する方法
- x, yの2つの整数から同様に個別セルにアクセスする方法
- Excel文書をファイルに保存する方法
既存文書からのデータ取得と表計算、グラフ作成
基本的な使い方が分かったところで、実用系のコンテスト作品を作るのに役立つような本格的なアプリを作ってみよう。ソースコードはやや長いが、徹底して注釈を入れてあるので、読めば理解できるはずだ。もとろん、openpyxlのリファレンスサイトは常に参照しながら読み進めてほしい。
アプリの入力は、単純なExcel文書「庭園.xlsx」(図11-3参照)である。ある家の屋上庭園に乗っている庭造りの材料の1個あたりの重さと個数を表にまとめたものだ。この時点ではいわゆる所与の値を入れただけで、「表計算」は発生しない。
リスト11-2に示すプログラム「makegraph.py」をコマンドプロンプトから実行すると、図11-4に示すExcel文書「庭園new.xlsx」が生成される。以下の操作が自動的に行われたことを確認しよう。
- 新たな列「総重量(kg)」が作成され、数式が設定される(これらの数式はまだ評価されない。実際の計算が行われるのは、Excel文書が一旦保存され、再度開けられたタイミングである)
- 新たな列「個数」が作成され、値が書き込まれる
- 新たな列「金額(円)」が作成され、そこにpython側で計算された値が書き込まれる。このように、openpyxlによるExcel文書の作成においては、Excelに表計算を指示するか、python側で計算を行うかという選択肢が存在する。どちらがよいかはExcel文書の目的、つまり使われ方によって異なる
- セル書式を指定して背景が黄色で塗りつぶされる
- 表中の2つのセル範囲から、棒グラフと円グラフの2種類のグラフが自動生成され、グラフのスタイルが変更される
- 別ファイル「庭園new.xlsx」に保存される


リスト中、セルにアクセスするためのrowやcolumnの指定が、リストのインデックスなどとは違う1オリジンであることに注意すること。フィールド名を除くセルのデータだけをおさめたリストのインデックスとは、2だけずれることになる。セルへの値の書き込みと取り出しで文法のニュアンスが異なる点や、PattenFillとか、Referenceといった特殊なオブジェクトの使い方、メソッドによるグラフオブジェクトの設定など、慣れが必要な事柄もある。リファレンスサイトやリスト中のコメントを参照しながら習得してもらいたい。
以上の例からわかるように、pythonプログラムによるビジネス文書の自動処理は、仕事の能率を何倍にも上げる強力なツールになりうる。しかもそれが自分自身の仕事能率向上に直結するところがミソである。同様のツールとしては、Microsoft Word文書を操作するpython-docxや、Microsoft PowerPoint文書を操作するpython-pptxがあり、いずれもここで解説したopenpyxlと同レベルのスキルで使いこなせる。これからの時代には、あなたの能力があなたの作るアプリの能力込みで評価されることを忘れないでほしい。