リファクタリングをPythonで実践!基本手法とコード例・注意点まで
1.PythonでExcelを操作できるってほんとう?
PythonでExcelを操作できるのは、ほんとうです。正確に言うと、Excelそのものを操作する場合とExcelファイルに対しての操作をする場合とありますが、いずれにせよ、PythonからExcelを読み書きしたり、グラフを描いたり、Excelのマクロを実行したりできます。
この記事では、PythonでのExcel操作のライブラリから、PythonでExcelを操作するメリット・デメリット、操作の具体例までを詳細に解説します。
ではまず、どのようなライブラリがあるのか見ていきましょう。
①openpyxl
PythonのExcel操作では最もメジャーなライブラリです。openpyxlの特徴は以下です。
・処理が高速
PythonからExcelを操作するライブラリの中では最も処理が高速だと言われています。実際筆者も、ExcelのVBAで計算させていたら何日かかるか分からなかった高度な数学の計算を、openpyxlを使い8時間で終わらせた経験があります。
処理スピードというとマシンパワーに目が行きがちですが、実はライブラリの性能に大きく依存します。高速にExcelを処理したいならopenpyxlでしょう。
・ネット上の情報が多い
最も普及しているライブラリなので、他のExcel操作のライブラリと比較してネット上に日本語の情報がたくさんあります。PythonのExcel操作では細かな機能を多用するので、そんなときに少し調べるだけで情報が出てくるのは便利ですよ。この記事でも、具体例はopenpyxlを使って書いていきます。
②pandas
pandasは、正確に言うと、データ分析用のライブラリです。ただpandasでも、Excelを操作することはできます。しかし、pandasは独特の概念を理解しなければならないこと、データ分析に習熟していないと使いこなせないことから、初心者向けのライブラリとは言えません。データサイエンティストが使うようなライブラリです。
そのような理由から、この記事ではpandasには触れませんが、そういうライブラリもあるということは覚えておいてください。
③xlwings
xlwingsは、PythonからExcelを直接操作するライブラリです。openpyxlやpandasはExcelファイルを操作するライブラリですが、xlwingsはExcelを直接操作します。ですので、Excelに対応していないLinuxではxlwingsは使用できません。
Excelを直接操作することで何が便利かと言うと、Excelのマクロを実行できることです。Excelのマクロの実行はopenpyxlだとかなり難しいです。ただ、openpyxlに比べて処理が遅いとされています。
2.PythonでExcelを操作するメリット
①MacでもExcelを自動化しやすい
WindowsのExcel VBAとMacのExcel VBAに無視できない違いがあることはご存じでしょうか。この違いのために、WindowsのExcelで動作するマクロをMacのExcelに持って行っても、通常動作しません。「移植作業」が必要になります。それを専門に行うエンジニアすら存在するほどです。
ところが、Pythonの場合、WindowsとMacの間の違いは、機種依存文字の違いなどといったごくごく一部に限られます。通常のPythonのプログラムはWindowsで開発してMacに持って行ってもそのまま動作します。
そのため、Excelで処理したいことを、VBAではなくPythonで記述すると、WindowsでもMacでも動作するということになり、大変便利です。
②Excelだけでなく他のアプリも連携できる
Excel VBAが操作できるのはあくまでもExcelのみです。それはそうですね、Excel VBAはExcelのために開発された言語なのですから。ところがPythonはオープンな言語です。できることは幅広く、他のアプリ、例えばブラウザ操作なども自動化できます。
この特徴を活かして、Excel操作とブラウザ操作を連携させ、処理を全て自動化してしまう、なんてことも可能です。Excelだけでなく他のアプリも自動化できることは、Excel操作の自動化にPythonを使う最大のメリットだと言えるでしょう。
③Pythonの学習を深めることができる
Excel操作を自動化する際、Pythonの記述はたいてい簡潔ですが、ただ一つ、データフォーマットだけは複雑なものになりがちです。これはExcelが表形式で各セルに様々な形式のデータが格納できる以上、仕方がないことです。
しかしPythonで複雑なデータフォーマットのデータを扱うと、Pythonの特徴を最大限に活かさざるを得ず、Pythonプログラミングの習熟が計れます。
初心者のPythonプログラマにとっては、PythonでExcelを操作することはかっこうのPythonプログラミング上達の手段なのです。
3.PythonでExcelを操作するデメリット
①Pythonをインストールし環境構築する必要がある
PythonでExcelを操作するデメリットの第一は、Pythonをインストールし環境構築する必要があることです。Pythonのインストールは、一般のアプリのインストールと同じようにできます。
ですが、ライブラリのインストールにはpipというコマンドラインで動くプログラムを使用しないといけません。その他、マシンにインストールされているPythonのバージョンを管理しなければならないこと(Pythonのバージョンによってライブラリのバージョンが変わったりコードの書き方が変わったりします。
マシンに複数のバージョンが混在していると、その管理はより一層テクニカルになります)や、仮想環境と呼ばれるプログラム特有の環境構築の仕方を学ぶ必要があります。環境構築はなかなか奥が深いです。初心者には壁だと言えるでしょう。
②Pythonのことを学ばなければならない
PythonでExcelを操作するデメリットの第二は、もちろん、Pythonのことを学ばなければならないことです。「Excel VBAなら知っているけど、Pythonは知らない」こういう方にとって、Pythonのことを学ぶのは一苦労です。プログラミング言語を学ぶのはどんな言語でもそれなりに骨が折れます。
Pythonは学びやすいプログラミング言語ですが、それでも、学ぶのには一定の時間がかかることから、デメリットと言えるでしょう。
AIについて学びたい人におススメ! 【AI入門資料】サクッとわかるAIはじめの一歩-無料ダウンロード
4.PythonでExcelを操作してみよう
それでは早速、PythonでExcelを操作してみましょう。
①ライブラリのインストール
まず、openpyxlをインストールしてみましょう。既にPythonはインストールされているとします。※Pythonのインストール方法についてはこちらの記事を参考にしてください。コマンドラインから、次の文を実行してください。
pip install openpyxl
pipはPythonのライブラリを管理するプログラムです。
pip install
とすることで、そのライブラリでインストールされているPythonに適合したバージョンのライブラリを、定められたサイト(Pythonで公式に認められているサイト)からダウンロード、インストールして使える状態にしてくれます。
コード内でopenpyxlを使用するときには、コードの先頭に
import openpyxl
と書きましょう。これでopenpyxlをそのコード内で使用することができます。これで、openpyxlを使用する準備は整いました。
②Excelのファイルを読み込む
openpyxlでExcelのファイルを読み込むには、次のように書きます。ここではPythonのプログラムと同じフォルダにある「Excelサンプル.xlsx」ファイルの「サンプル」シートのA1セルのデータをvalueに読み込むとします。
wb = openpyxl.load_workbook('./Excelサンプル.xlsx')
sheet = wb['サンプル']
value = sheet.cell(row=1, column=1).value
wb.close()
まず、load_WorkbookでExcelブックを開きます。このとき、相対パスでも絶対パスでも指定できます。次にどのシートのデータを読み込むか指定します。[]でシート名を区切って記述します。そしてデータの読み込みは
value = sheet.cell(row=1, column=1).value
とします。この文は
value = sheet['A1'].value
でも構いません。
読み込む際にはシートが基準になります。rowが行、columnが列です。行、列は1から始まります。これはExcel VBAと同じです。0からではないので気を付けましょう。
.value
を付けることで、「値を読み込む」という意味になります。
Excelのセル表記と同じ書き方でも書けます。セルのデータ型は数値でも文字列でも構いません。openpyxlが自動で判別してPythonの変数に代入します。動的型付け言語であるPythonのメリットがここに活かされています。
なおセルのデータ型が日付時刻型のときには少々厄介な問題が発生するのですが、ここでは割愛します。最後にExcelブックを閉じましょう。
③Excelにデータを書き込む
じつは、読み込みの書き方を覚えると、書き込みは簡単なのです。以下のように書きます。「0」を書き込むとします。
wb = openpyxl.load_workbook('./Excelサンプル.xlsx')
sheet = wb['サンプル']
sheet.cell(row=1, column=1).value = 0
wb.save('./Excelサンプル.xlsx')
wb.close()
いかがでしょうか。読み込みのときと、3行目の左辺と右辺が入れ替わっただけです。3行目はもちろん以下でも構いません。
sheet['A1'].value = 0
ただし、
.save
でブックを保存しないと、書き込んだ値が保存されないので注意してください。saveには必ずファイルパスが必要です。書き込む際のデータ型は数値でも文字列でも構いません。Excelが判別します。読み込みとは違い、Pythonのデータ型が日付時刻型(datetime型)でも大丈夫です。
④Excelでデータを集計する
読み込み、書き込みができたら、Pythonでデータを集計してExcelに書き込みたくなりますね。これこそがPythonでExcelを操作する一番のメリットです。ここでは、A1セルからA5セルまでの合計を、A6セルに書き込みます。
wb = openpyxl.load_workbook('./Excelサンプル.xlsx')
sheet = wb['サンプル']
sum = 0
for row in range(1,6):
sum += sheet.cell(row=row, column=1).value
sheet['A6'].value = sum
wb.save('./Excelサンプル.xlsx')
wb.close()
いかがでしょうか。処理の部分は、通常のPythonのプログラムと同じになっていることに気づいたでしょうか。PythonでExcelを操作すると言っても、読み込みと書き込みがExcelに関係するだけです。
他の部分はあくまでもPythonのプログラムなので、Pythonで出来る処理ならどんな処理でも書けます。Excel VBAでは出来ない計算もPythonを使えばできますよ。
⑤Excelでグラフを作成する
では応用編として、Excelでグラフを作成してみます。ここでは折れ線グラフを作成します。プログラムは以下になります。「Excelサンプル.xlsx」の「サンプル」シートのA1セル~A5セルに数値が格納されているとします。
wb = openpyxl.load_workbook('./Excelサンプル.xlsx')
sheet = wb['サンプル']
values = openpyxl.chart.Reference(sheet, min_col=1, min_row=1, max_col=1, max_row=5)
chart = openpyxl.chart.LineChart()
chart.add_data(values)
sheet.add_chart(chart, 'A10')
wb.save('./Excelサンプル.xlsx')
wb.close()
これで、「サンプル」シートのA10セルにグラフが書かれます。
一行ずつ見ていきます。
values = openpyxl.chart.Reference(sheet, min_col=1, min_row=1, max_col=1, max_row=5)
Referenceオブジェクトは、ここでは「セルを参照するオブジェクト」だと思ってください。それをvalues変数に格納します。
chart = openpyxl.chart.LineChart()
折れ線グラフのオブジェクトを作成しています。
chart.add_data(values)
折れ線グラフのオブジェクトに、「セルを参照するオブジェクト」であるvaluesをデータとして加えます。この処理で、折れ線グラフのオブジェクトであるchartにグラフが作成されます。
sheet.add_chart(chart, 'A10')
シートの指定したセルにグラフを書き加えます。グラフの処理は、細かく書けばきりがないくらい様々なバリエーションがあるのですが、基本としてはここに挙げたサンプルプログラムのようにして作成します。