openpyxlは「Pythonからxlsxファイルを操作するためのライブラリ」です。
基本的にExcelの自動操作はVBAやマクロを使うことが多いですが、openpyxlを使えばPythonからでも操作が可能です。
ここではopenpyxlでどんなことができるのかを解説します。
今回はこのExcelファイルを使います(tenki.xlsx)。
[東京の月別気温、降水量、風速]
[札幌の月別気温、降水量、風速]
Excelファイルを読み込む
まずはExcelファイルを読み込みましょう。
import openpyxl as xl
workbook = xl.load_workbook('/Users/xxx/OneDrive/ドキュメント/tenki.xlsx')
print(workbook.sheetnames)
print(workbook.worksheets)
[出力結果]
['Tokyo', 'Sapporo']
[<Worksheet "Tokyo">, <Worksheet "Sapporo">]
load_workbook()を使い、引数にExcelファイルのパスを指定することで読み込めます。
読み込んだworkbookのsheetnamesでシート名の一覧を、worksheetsでシートのオブジェクトの一覧をリスト形式で取得できます。
ワークブックの操作
ワークブックの操作方法を見ていきましょう。
シートを追加する
シートの追加はcreate_sheet()を使います。
workbook.create_sheet(title='Okinawa')
print(workbook.sheetnames)
[出力結果]
['Tokyo', 'Sapporo', 'Okinawa']
また、create_sheet()のindex引数に数値を渡すことで、任意の位置にシートを作ることもできます。
workbook.create_sheet(title='Okinawa', index=1)
print(workbook.sheetnames)
[出力結果]
['Tokyo', 'Okinawa', 'Sapporo']
ファイルを保存する
ファイルの保存にはsave()を使います。
読み込んだファイルと同じ名前を引数に渡せば「上書き保存」、違う名前を渡せば「名前を付けて保存」になります。
workbook.create_sheet(title='Okinawa') #Okinawaシートを追加
workbook.save('tenki.xlsx') #上書き保存
workbook.create_sheet(title='Osaka') #さらにOsakaシートを追加
workbook.save('tenki2.xlsx') #名前を付けて保存
[出力結果]
tenki.xlsx(上書き保存)
tenki2.xlsx(名前をつけて保存)
上書き保存したtenki.xlsxにはOkinawaのみ、名前をつけて保存したtenki2.xlsxにはOkinawaとOsakaのシートが追加されています。
シートの操作
シートの操作方法を見ていきましょう。
シートを取得する
まずは操作するシートを取得しましょう。
s_tokyo = workbook['Tokyo']
print(s_tokyo)
[出力結果]
<Worksheet "Tokyo">
ワークシート内のシート名を指定することでシートのオブジェクトを取得できます。
シートのコピー
シートをコピーするにはcopy_worksheet()にコピーしたいシートを渡します(シート名ではなくシートのオブジェクトを渡す必要があります)。
s_tokyo = workbook['Tokyo']
s_tokyo_copy = workbook.copy_worksheet(s_tokyo)
print(workbook.sheetnames)
workbook.save('tenki.xlsx')
[出力結果]
['Tokyo', 'Sapporo', 'Tokyo Copy']
tenki.xlsx
Tokyoシートをコピーした「Tokyo Copy」が作成されました。
シートを削除する
シートを削除するにはremove()を使います。
先ほどコピーしたTokyo Copyを削除します。
print(workbook.sheetnames) #削除前
workbook.remove(workbook['Tokyo Copy'])
print(workbook.sheetnames) #削除後
workbook.save('tenki.xlsx')
[出力結果]
['Tokyo', 'Sapporo', 'Tokyo Copy']
['Tokyo', 'Sapporo']
tenki.xlsx
削除後のシート一覧と保存したxlsxファイルから「Tokyo Copy」が削除されました。
シート名の変更
titleを変更することでシート名を変更できます。
print(workbook.sheetnames) #変更前
s_sapporo = workbook['Sapporo']
s_sapporo.title = 'Hokkaido'
print(workbook.sheetnames) #変更後
workbook.save("tenki.xlsx")
[出力結果]
['Tokyo', 'Sapporo']
['Tokyo', 'Hokkaido']
tenki.xlsx
セルの操作
セルの操作方法を見ていきましょう。
セル内のデータを1つ取得する
単純に1つのセルの値を取得したい場合は、シートにセルの情報を指定するだけです。
s_tokyo = workbook['Tokyo']
cell = s_tokyo["C5"]
print(cell)
print(cell.value)
print(cell.coordinate)
print(cell.row)
print(cell.column_letter)
[出力結果]
<Cell 'Tokyo'.C5>
17.7
C5
5
C
cellにはセルそのものが格納されています。セル内のデータを取得したい場合はvalueを参照します。
また、coordinateでセルの行列、rowで行、column_letterで列の位置を取得できます。
複数のセルを取得する
複数のセルを取得したい場合は範囲を指定します。
s_tokyo = workbook['Tokyo']
rows = s_tokyo["E2":"F4"]
print(rows)
for row in rows:
for cell in row:
print(f"{cell.coordinate} -> {cell.value}")
[出力結果]
((<Cell 'Tokyo'.E2>, <Cell 'Tokyo'.F2>), (<Cell 'Tokyo'.E3>, <Cell 'Tokyo'.F3>), (<Cell 'Tokyo'.E4>, <Cell 'Tokyo'.F4>))
E2 -> 35.6
F2 -> 20.7
E3 -> 36.2
F3 -> 17.1
E4 -> 30.3
F4 -> 12.1
範囲指定して取得したセル情報は行ごとにタプルで格納された二次元配列になっています。
セルの情報を取得する場合は繰り返し処理をする必要があります。
値を書き換える
取得したcellのvalueを変更することで値の書き換えが可能です。
s_tokyo = workbook['Tokyo']
a2 = s_tokyo['A2']
a2.value = '2019年8月'
b15 = s_tokyo['B15']
b15.value = '=AVERAGE(B2:B14)' #平均気温の平均
workbook.save('tenki.xlsx')
[出力結果]
tenki.xlsx
A2のように単純に値を書き換える以外にも、B15のようにExcelの数式を使うことも可能です。
フォーマットを変更する
先ほど計算した平均気温の平均値のフォーマットを変更しましょう。
ここでは小数第3位まで表示するように変更します。
number_formatを変更することでフォーマットを変更できます。
s_tokyo = workbook['Tokyo']
b15 = s_tokyo['B15']
b15.number_format = '0.000'
workbook.save('tenki.xlsx')
[出力結果]
tenki.xlsx