【番外編】Excelファイルの操作

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

図11-1: openpyxlの公式リファレンスサイト

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文書が作成される。


リスト11-1: xltest.py
図11-2:自動作成されるExcel文書「test.xlsx」

以下のやり方を確認しよう。単純な指示でExcel文書への値書き込みができることがわかるはずだ。

既存文書からのデータ取得と表計算、グラフ作成

基本的な使い方が分かったところで、実用系のコンテスト作品を作るのに役立つような本格的なアプリを作ってみよう。ソースコードはやや長いが、徹底して注釈を入れてあるので、読めば理解できるはずだ。もとろん、openpyxlのリファレンスサイトは常に参照しながら読み進めてほしい。
アプリの入力は、単純なExcel文書「庭園.xlsx」(図11-3参照)である。ある家の屋上庭園に乗っている庭造りの材料の1個あたりの重さと個数を表にまとめたものだ。この時点ではいわゆる所与の値を入れただけで、「表計算」は発生しない。
リスト11-2に示すプログラム「makegraph.py」をコマンドプロンプトから実行すると、図11-4に示すExcel文書「庭園new.xlsx」が生成される。以下の操作が自動的に行われたことを確認しよう。

図11-3:加工前のExcel文書「庭園.xlsx」

リスト11-2: makegraph.py
図11-4:加工後のExcel文書「庭園new.xlsx」

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