RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

openpyxlでExcelを操作する【Python入門】

初めに

皆さんこんにちは。mosyoryです。
今回はPythonのopenpyxlを使用してExcelの簡単な操作方法をご紹介します。 Pythonのコードを例として記載してますが、詳細な解説は行っていないので予めご了承ください。

openpyxlとは

openpyxlとはExcelファイルを読み書きするためのPythonライブラリです。
これはPythonからOffice Open XMLフォーマットをネイティブに読み書きするために作られました。
openpyxl.readthedocs.io

openpyxlのインストール

openpyxlのインストールは簡単です。

 1 ) コマンドプロンプトを起動  
 2 ) 「pip install openpyxl」を入力してエンター  
 3 ) インストール完了!

本記事ではopenpyxlのバージョンは3.0.7を使用して進めます。
バージョンを確認したい場合はコマンドプロンプトから「pip list」を実行してください。

> pip list
Package           Version
----------------- --------
openpyxl          3.0.7

※pipはPythonのパッケージ管理ツールです。Python3.4以上なら標準で付属していますので別途インストールする必要はありません。

Pythonは既にインストールされている前提で進めますので、まだの方はPython公式サイトからPython3.xのバージョンをインストールしてください。本記事ではPython3.9を使用します。
www.python.org

Pythonのバージョンを確認したい方はコマンドプロンプトから「python -V」を実行してください。

> python -V
Python 3.9.1

Excelファイルの準備

冒頭でも記載しましたがopenpyxlはPythonExcelファイルを操作するライブラリです。
なので実際にExcelファイルを用意し、そのファイルを使いながらopenpyxlの使い方を覚えていきましょう。
今回は以下の内容のExcelファイルを使いながらopenyxlの操作方法を紹介します。
Excelのファイル名:openpyxl_training.xlsx
・シートの名前:Sheet1

基本操作

openpyxlでExcelを操作するには最初に3つのステップが必要です。

1)Excelファイル(ワークブック)の指定  
2)ワークシートの指定  
3)セルの指定  

どのExcelファイルの、どのシートの、どのセルに対して操作を行うのかを指定しないとPythonはどのExcelファイルに処理を行えば良いかかわからなくなってしまいます。まずはこの3つについて紹介してきます。

Excelファイル(ワークブック)の 読み込み / 保存

最初にExcelファイルの読み込み、保存方法を紹介します。
この操作ができないとファイルの編集が出来なかったり、加えた変更が反映されなかったりするので覚えておきましょう。 まずはPythonのプログラム内でopenpyxlが使えるようにインポートします。

import openpyxl

読み込み

Excelファイルを読み込みにはload_workbook()を使用します。
引数のファイルパスは相対パスまたは絶対パスで指定してください。

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

保存

保存はsave()を使用します。この時に読み込んだExcelファイルと同じ名前を指定すれば上書き保存、
別名を指定すれば新規での保存となります。保存しないと加えた変更がすべて消えてしまうので注意してください。

wb = openpyxl.load_workbook("openpyxl_training.xlsx")
wb.save("openpyxl_training.xlsx")     #上書き保存
wb.save("Python.xlsx")           #別名保存

ファイルを閉じる

開いたファイルはclose()で閉じましょう。この時ファイル名の指定は不要です。

wb.close()

シートの操作

Excelファイルは1つ以上のシートで構成されています。そのため操作を行いたいシートを取得する必要があります。

シートの取得

シートの取得方法は3つあります。1つ目はシート名を指定して取得する方法です。本記事の場合はSheet1ですね。2つ目はシートのインデックスで指定する方法です。インデックスは左のシートから順番に振られます。数字は0から始まるので注意してください。3つ目はアクティブなシートを取得する方法です。Excelファイルは開いた時点で1つのシートが選択された状態になっています。その選択された状態のシートを「アクティブなシート」と言います。

# 下の3つはどれもSheet1を取得している
ws = wb["Sheet1"]
ws2 = wb.worksheets[0]
ws3 = wb.active

シートの作成

新しくシートはcreate_sheet()で作ります。引数のtitleに与えた値がシートの名前になります。
下の例では「Python」というシートが新たに作成されます。

ws4 = wb.create_sheet(title="Python")

シートの削除

逆にシートを削除したい場合はremove()です。例は先ほど作成した「Python」というシートを削除しています。

wb.remove(ws4)

セルの操作

セルの取得

セルの取得には3つの方法があります。
1つ目:セルの場所を文字列で指定する方法
2つ目:引数に数字を渡し列と行を指定する方法
3つ目:2つ目の書き方から引数名を省略した書き方
行と列の番号は1から始まるため数字で指定する場合は注意してください。

# どれもセルB4を取得している
cell1 = ws["B4"]
cell2 = ws.cell(row=4, column=2)  # rowが行, columnが列 
cell3 = ws.cell(4, 2)

セルの値の取得

上で紹介した方法はセルのオブジェクトを取得するだけであり、そのセルの値は取得してくれません。
そのため、セルのオブジェクトが持つvalueから取得します。空白のセルの値はNoneになります。

# どれもセルB4の値を取得している
val1 = ws["B4"].value
val2 = ws.cell(row=4, column=2).value
val3 = ws.cell(4, 2).value
val4 = cell1.value

セルの値の書き込み / 削除

値を書き込む場合もvalueを使用します。 このときNoneを与えるとセルの値を削除することができます。

# セルB11にPythonと書き込む
ws["B11"] = "Python"
ws.cell(row=11, column=2, value="Python")
# セルB11の値を削除する
ws["B11"] = "None"
ws.cell(row=11, column=2, value="None")

結合したセルの場合

結合したセルに対して値の取得などを行いたい場合は結合したセルの中で1番左上のセルを指定してください。

print(ws.cell(row=1, column=1).value)   # セルA1を指定してるので「PythonでExcelを操作する練習用データ」と出力
print(ws.cell(row=2, column=1).value)   # セルA2を指定してるので「None」と出力

グラフの作成

最後に棒グラフを作成してみましょう。まずはグラフを作成したPythonコードと作成したグラフをお見せします。
Excelファイル(ワークブック)の読み込みなどは省略しています。

chart = openpyxl.chart.BarChart()
chart.title = "openpyxlで作成したグラフ"
chart.height = 7.5
chart.width = 15
chart.y_axis.scaling.min = 0
chart.y_axis.scaling.max = 600
chart.y_axis.majorUnit = 50
chart.y_axis.title = "Y 軸ラベル"
chart.x_axis.title = "X 軸ラベル"
data = openpyxl.chart.Reference(ws, min_col=3, min_row=4, max_col=4, max_row=9)
chart.add_data(data, titles_from_data=True)
categories = openpyxl.chart.Reference(ws, min_col=2, min_row=5, max_col=2, max_row=9)
chart.set_categories(categories)
ws.add_chart(chart, "F4")

それでは各行が何をしているのか上から順に見ていきましょう。
最初の行は棒グラフ用のオブジェクトを作成してます。このオブジェクトに対し設定を行っていきます。

chart = openpyxl.chart.BarChart()

2~4行目はグラフエリアの設定を行っています。上からタイトルとグラフエリアの高さ、幅を設定しています。
これらは省略可能であり記述する順番に指定はありません。Pythonコード上で指定しなかった場合はExcelの標準設定の値が使用されます。

chart.title = "openpyxlで作成したグラフ"  # グラフのタイトル
chart.height = 7.5            # 高さ
chart.width = 15              # 幅

5~9行目は軸の設定です。軸の設定ではy_axis, x_axisに値を入れていきます。
上から順にY軸の最小値 / 最大値、目盛の間隔、X / Y軸のラベルを設定しています。
これらもグラフエリアの設定と同様に省略した場合はExcelの標準設定が適応されます。

chart.y_axis.scaling.min = 0      # Y軸の最小値
chart.y_axis.scaling.max = 600    # Y軸の最大値
chart.y_axis.majorUnit = 50       # 目盛の間隔
chart.y_axis.title = "Y 軸ラベル" # Y軸のラベル名
chart.x_axis.title = "X 軸ラベル" # X軸のラベル名

10~11行目でグラフとなるデータ範囲を設定しています。Referenceに与えている引数がセルの範囲となっています。
今回の例ではセルC4(3列目の4行目)からD9(4列目の9行目)までをデータ範囲としています。
それをadd_dataでグラフオブジェクトに渡すことでグラフになります。同時にtitles_from_data=Trueと指定しています。 これは設定したデータ範囲の先頭行をグラフの系列名として使用するということです。例での先頭行はセルC4とD4、つまり「データ1」と「データ2」が系列名として使用されます。この2行はグラフを作るうえで必須なので省略できません。

data = openpyxl.chart.Reference(ws, min_col=3, min_row=4, max_col=4, max_row=9)
chart.add_data(data, titles_from_data=True)

12~13行目は横軸の項目名となるデータ範囲を設定しています。範囲を指定する方法はグラフのデータ範囲の指定を同じ記述になります。この例ではセルB5(2列目の5行目)からB9(2列目の9行目)を横軸に指定しています。
これをset_categoriesでグラフオブジェクトに渡すことで横軸ができます。この2行を省略した場合は1、2と番号が横軸に設定されます。

categories = openpyxl.chart.Reference(ws, min_col=2, min_row=5, max_col=2, max_row=9)
chart.set_categories(categories)

14行目はグラフをセルF4に配置しています。13行目まではグラフを作成している段階でありExcelファイルに変化は起きていない状態です。そのためこの処理を省略するとExcelファイルを開いてもせっかくPythonで作成したグラフがない状態になります。 忘れず記述するようにしましょう。

ws.add_chart(chart, "F4")

終わりに

Pythonのopenpyxlを使ってExcelの操作方法を紹介しました。今回は棒グラフを作り、設定を少し変える程度でしたが折れ線などのグラフも作れます。またフォントやセルの色、SUMなどのExcel関数といったよく使う操作もPythonのopenpyxlで実行できるので興味のある方は試してみてください。

参考サイト

OpenPyXL入門!使い方や基礎メソッドを7の事例で紹介(初心者向け)

openpyxl による Excelファイル操作方法のまとめ - ガンマソフト株式会社

Excelを自動化できる!Pythonのモジュール「OpenPyXL」で効率化してみた | AIZINE(エーアイジン)

【Excel x Python】 openpyxlを使って面倒なExcelのグラフ作成作業を自動化する | 似非プログラマの備忘録

冒頭の画像ロゴは、商標使用ポリシーに基づき以下サイトのものを利用しております。
https://www.python.org/community/logos/


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.