リファクタリングをPythonで実践!基本手法とコード例・注意点まで
- 1.PythonでExcelを操作する方法を極めよう
- 2.Excelのマクロを実行する
- 3.画像をExcelに貼り付ける
- 4.データ処理の応用編
- 5.重要なこと・なぜExcel操作はPythonが適しているのか?
1.PythonでExcelを操作する方法を極めよう
PythonではExcelを操作することができます。前回の記事では、その基本操作を解説しました。今回は、応用編として、PythonでExcelを操作する方法の応用編を解説していきます。なお、Pythonとopenpyxlは既にインストールされているとします。Pythonのインストール方法については、こちらの記事を参考にしてください。openpyxlのインストール方法については、前回の記事を参考にしてください。
2.Excelのマクロを実行する
まずは、PythonからExcelのマクロを実行する方法を解説します。
①xlwingsをインストールする
今まではopenpyxlで解説してきましたが、Excelのマクロを実行する場合、少し困った問題が起きます。openpyxlでExcelのマクロを実行する方法はかなり難しいのです。そこで、PythonからExcelを直接操作するライブラリであるxlwingsを使います。次のコマンドでxlwingsをインストールしてください。
pip install xlwings
xlwingsを使うプログラムでは、コードの先頭に
import xlwings
と書いてxlwingsを使います。これでxlwingsを使う準備ができました。
②xlwingsでマクロを実行する
それでは、Excelのマクロを実行してみます。ここでは、Pythonのプログラムと同じフォルダに「Excelサンプル2.xlsm」というマクロ有効ブックがあって、その中に「サンプル」というSubプロシージャのタイトル名のマクロがあるとします。Pythonのプログラムは以下のようになります。
app = xlwings.App()
wb = app.books.open('./Excelサンプル2.xlsm')
pg=wb.macro('サンプル')
pg()
wb.save('./Excelサンプル2.xlsm')
wb.close()
app.quit()
1行ずつ解説していきます。
app = xlwings.App()
おまじないみたいなものです。App()でアプリケーションオブジェクトを作成します。これは、こういうものだと覚えてもらって構いません。xlwingsでは、この記述をしないとExcelが操作できません。
wb = app.books.open('./Excelサンプル2.xlsm')
マクロ有効のExcelブックを開いています。
app.books
と書かなければならないことに注意すれば、あとはopenpyxlと同じです。パスは相対パスでも絶対パスでも構いません。
pg=wb.macro('サンプル')
pg()
ここが肝です。macroでマクロ関数オブジェクトを作成し、そのオブジェクトを「実行」することでExcelのマクロを実行します。
wb.save('./Excelサンプル2.xlsm')
マクロを実行すると、たいていの場合ブックの内容が変更されます。ですので、ブックの保存は必ずしましょう。
wb.close()
app.quit()
ブックを閉じ、アプリケーションオブジェクトを破棄します。これもおまじないです。xlwingsでの処理の最後には必ずこのように記述してください。こう書いてみると、手間がかかるように思われたかもしれません。
たしかに、記述がやや冗長ですね。それに、PythonでせっかくExcelを処理しているのに、わざわざExcelのマクロを実行する意味はあるのか、と思われたかもしれません。レアケースですが、Excelのマクロを実行しなければならないケースはあります。
openpyxlもそうですが、Excelの全ての機能をPythonから利用できるわけではないからです。ExcelのマクロはExcelの全ての機能を実行できるので、Excelのマクロに頼らざるを得ない場面はあります。ケースによって使い分けましょう。
③参考・openpyxlでマクロの入ったExcelファイルを扱うには?
参考までに、openpyxlで上記の「Excelサンプル2.xlsm」を開くには、次のように記述します。
wb = openpyxl.load_workbook('./Excelサンプル2.xlsm', keep_vba=True)
この
keep_vba=True
を付けないとマクロが保持されないので気を付けてください。デフォルトはFalseです。keep_vbaをFalseにしてブックを開き、そのまま保存すると、マクロが消えてしまいます。
3.画像をExcelに貼り付ける
たとえば説明用資料として、Excelに画像を貼り付けるということもあるかと思います。Pythonで画像をExcelに貼り付けるには実は難しい処理が必要とされることが多いのですが、この記事では最も簡単なケースを取り上げます。
・Pythonのプログラム
・「サンプル」シートが含まれる「Excelサンプル3.xlsx」ブック
・「サンプル.jpg」という画像ファイル
は全て同じフォルダにあるとします。この「サンプル.jpg」を「Excelサンプル3.xlsx」の「サンプル」シートのA1セルに貼り付けるコードは以下のようになります。
img = openpyxl.drawing.image.Image('サンプル.jpg')
wb = openpyxl.load_workbook('./Excelサンプル3.xlsx')
sheet = wb['サンプル']
img.anchor = 'A1'
sheet.add_image(img)
wb.save('./Excelサンプル3.xlsx')
wb.close()
1行ずつ解説していきます。
img = openpyxl.drawing.image.Image('サンプル.jpg')
この記述で、画像オブジェクトを作成します。画像ファイルの形式はJPEGでもPNGでもGIFでもかまいません。
wb = openpyxl.load_workbook('./Excelサンプル3.xlsx')
sheet = wb['サンプル']
こちらは説明不要ですね。「Excelサンプル3.xlsx」ブックを開き、「サンプル」シートを指定しています。
img.anchor = 'A1'
sheet.add_image(img)
こちらが画像貼り付けの肝です。
anchor
で、貼り付け先のセルをExcelのセル表記形式で指定します。必ずセル表記形式である点に注意してください。
add_image
で画像を貼り付けます。
本来ならここに画像のサイズ変更などが必要とされますが、少し難しいのでこの記事では割愛します。
wb.save('./Excelサンプル3.xlsx')
wb.close()
ブックを保存して、閉じています。手作業で画像を貼り付けなくても、Pythonのプログラムを工夫すれば、同一フォルダにある大量の画像をExcelブックに次々貼り付ける、なんてことも実現可能です。
4.データ処理の応用編
PythonでExcelのデータを処理するとき、実際には、Excelのシートのデータを全てPythonで読み込み処理する、という場合が大半です。このとき、たいていの場合、セルを一つずつ参照し、それをループで回し、Pythonのオブジェクトに変換します。
セルの値によって処理を分岐させることはほぼ必ず必要で、また、Python側のデータ構造がどうなっていると都合がいいかはケースバイケースだからです。ですので、Excelのデータ処理についてこうすればいい、という典型例はありません。もともと、Pythonの柔軟なデータ構造を活かすために、PythonからExcelを操作しているはずです。
Pythonにはタプル、リスト、辞書などさまざまなデータ構造があります。Excel VBAには配列しかありません。Pythonに比べると、その構造の柔軟性も、大きく劣ると言わざるを得ません。Pythonの強みを最大限に活かせるのは、データ構造です。プログラムロジックは知恵の絞りどころです。
5.重要なこと・なぜExcel操作はPythonが適しているのか?
ここから、なぜExcel操作にPythonが適しているかが見えてきます。MicrosoftはExcelをJavaScriptで操作できる新しい機能「Office スクリプト」を発表しています。Excelにはブラウザ版もありますから、まあ、納得ですよよね。
しかし、JavaScriptのデータ構造の柔軟性は、これもまたPythonには負けます。特にPythonのNumpyモジュールには行列という表形式の処理に適した強力なデータ構造がありますから、pandasを使うなどすればかなり高度なデータ処理も比較的簡単に記述することができるはずです。
このため、PythonはExcel操作に適しているのです。今のうちからPythonでのExcel操作を覚えておくことをお勧めします。