PythonでExcelを操る方法【OpenPyXL】

PythonでExcelを操る方法【OpenPyXL】

こんにちは、えびかずきです!

今回はPythonでExcelを操る方法ということで、OpenPyXLの使い方を説明したいと思います。

開発環境

OS:macOS Catalina ver10.15.4

使用したライブラリ:
・openpyxl 2.6.4

openpyxlは.xlsx形式のエクセルファイルを操作できる外部ライブラリです。


pipで以下のようにしてインストールできます。

$ pip install openpyxl


エディタ:Atom

Excelファイルを作成する

まずはファイルの新規作成を試してみましょう!

「test1.xlsx」というファイルを新規に作成してみます。

#make_file.py
'''
test.xlsxというファイルを新規に作成するコード
'''
import openpyxl as px

wb = px.Workbook()
wb.save("test1.xlsx")

このスクリプトを実行すると、

make_file.pyと同じディレクトリに「test1.xlsx」というファイルが新規に作成されます。

Excelに値を書き込む

続いて書き込みをやってみましょう!

先ほど作成した「test1.xlsx」というファイルに数値を入力してみます。

コード例は以下のとおりです。

#write.py
'''
Excelの(1,1)セルに1234という数値を入力するコード
'''
import openpyxl as px
wb = px.load_workbook("test1.xlsx")

wb["Sheet1"].cell(1,1).value = 1234
#activeシートを指定する場合は下記
#wb.active.cell(1,1).value = 1234

wb.save("test1.xlsx")

コード説明:

①load_workbook(“ファイルパス”)でエクセルファイルを読み込み

②wb[“Sheet名”].cell(X,X).value = <数値>で書き込み

③wb.save(“ファイルパス”)で保存


という流れになります。簡単ですね。

実際に書き込みをしたエクセルファイルは以下のようになりました。

下図のように(1,1)セルに「1234」が入力されています。

Excelの値を取得する

次にエクセルファイル内の数値を取得してみましょう!

#read.py
import openpyxl

wb = openpyxl.load_workbook("test1.xlsx")

a = wb["Sheet1"].cell(1,1).value
print(a)

下の通り、きちんと1234という値を取得することができました。

output:
1234

グラフを作成する

次にグラフ作成をしてみましょう!

下のような2列のデータセットがある場合に散布図を作成する方法について説明します。

以下が散布図を作成するコード例です。

#graph.py
import openpyxl as px

#test2.xlsxを読み込む
wb = px.load_workbook("test2.xlsx")

#散布図をグラフ変数:chartとして定義
chart=px.chart.ScatterChart()

#y,xデータの範囲を選択
y = px.chart.Reference(wb["Sheet1"] ,min_col=2 ,max_col=2 ,min_row=1 ,max_row=5)
x = px.chart.Reference(wb["Sheet1"] ,min_col=1 ,max_col=1 ,min_row=1 ,max_row=5)

#系列変数seriesをy,xを指定して定義する
series = px.chart.Series(y, x)
#線を消す
series.graphicalProperties.line.noFill = True
#マーカーを表示する
series.marker.symbol = "auto"

#散布図として定義したchartへデータを指定したseries変数を渡す
chart.series.append(series)

#A6セルにグラフを表示
wb["Sheet1"].add_chart(chart,"A6")
wb.save("test2.xlsx")

ちょっと長いですが、大半はグラフのプロパティを決める記述になります。

散布図(ScatterChart)はデフォルトだとマーカーがなしの線のみグラフになってしまいます。

個人的な好みと合わないので、マーカーありの線なしグラフに成形し直しました。


コードに意味については、コメントアウトの説明を参考にしてください。

コードを実行した結果が以下になります。

きちんと散布図を作成できました。

応用:集計プログラム

最後に上で紹介したコードを活用して集計プログラムを作成してみます。


下のように月ごとの気温データが入った「temp.xlsx」と、

ジュースの売り上げデータの入った「juice.xlsx」の二つのエクセルファイルを使います。

使ったデータは、気温が高いほどジュースの売り上げが上がるという傾向を想定して、筆者が適当に作成したものです。


この二つのデータを新しいエクセルファイルに書き込んで、

相関を見る為に散布図グラフを作成するというプログラムを作ってみます。

#gather.py
import openpyxl as px

nwb = px.Workbook()
nsh = nwb.active

temp_sh = px.load_workbook("temp.xlsx").active
juice_sh = px.load_workbook("juice.xlsx").active

nsh.cell(1,1).value = "気温"
nsh.cell(1,2).value = "売上"
for i in range(2,14):
    nsh.cell(i,1).value = temp_sh.cell(i,2).value
    nsh.cell(i,2).value = juice_sh.cell(i,2).value

chart=px.chart.ScatterChart(scatterStyle="marker")
y = px.chart.Reference(nsh ,min_col=2 ,max_col=2 ,min_row=2 ,max_row=13)
x = px.chart.Reference(nsh ,min_col=1 ,max_col=1 ,min_row=2 ,max_row=13)
series = px.chart.Series(y, x)
series.graphicalProperties.line.noFill = True
series.marker.symbol = "auto"
chart.series.append(series)
nsh.add_chart(chart,"C1")
nwb.save("gather.xlsx")

結果は以下のようになりました。

イメージ通りのデータ集計とグラフ作成ができました。

その他のライブラリ

実は他にも、Excelを操れるライブラリは多数存在します。


今回は王道のライブラリとしてopenpyxlで説明しましたが、以下にExcelファイルやExcelソフトを操れるライブラリをまとめました。

Excel関連ライブラリまとめ:
openpyxl: .xlsx形式ファイルの読み書きが可能
xlrd: .xls, .xlsx形式ファイルのデータを読むことが可能
xlwd .xls形式ファイルにデータとフォーマットを書き込むことが可能
xlswriter .xlsx形式ファイルにデータとフォーマットを書き込むことが可能
PyXLL: エクセルソフトの操作(有料ライブリ)
xlwings: エクセルソフトの操作

下二つのPyXLLとxlwingsは今回紹介したファイル操作のライブラリとは少し毛色が違っていて、エクセルソフト自体を操作するソフトになります。

これらを使えばVBAで作るようなマクロなんかをPythonで作れるみたいです。

機会があれば追加で記事にしようかなと思います。

まとめ

今回は、PythonでExcelを操る方法について説明しました。

openpyxlで割と簡単にExcelファイルを操作できることがわかりましたね。


PythonでExcelを操作できると、Python内で数値計算処理なんかも出来て自由度が増します。

さらにOffice製品だけの為にVBAを覚える必要もなくなるので一石二鳥です。


みなさんもPythonでExcelを操ってVBAでのマクロ作成を卒業しましょう!

参考

この記事を執筆するにあたって、以下の情報を参考にさせていただきました。

書籍:

Excel×Python最速仕事術

Web上の記事では以下が参考になりました。
https://qiita.com/taito273/items/07e4332293c2c59799d1
https://qiita.com/yniji/items/b38bc312e860027108ac

Pythonカテゴリの最新記事