Pythonの勉強で覚えた、Excelを操作する方法をまとめました。初心者向けの備忘録です。
結論から言うと、openpyxlで load_workbook() で開き、wb['シート名'] でシートを選び、sheet['A1'] でセルを読み書きして、save() で保存 します。
要点
- Excelの操作には、openpyxlというライブラリを使います
- シートの名前の一覧は
wb.sheetnames、シートはwb['シート名']で選びます - セルは
sheet['A1']でも、sheet.cell(row=1, column=1)でも指定できます - 計算式のセルで結果を取りたいときは
data_only=Trueで開きます。ただし、そのまま上書き保存すると式が消えます
1. openpyxlをインストールする
Excelを操作できるライブラリはいくつかありますが、今回はopenpyxlを使います。
pip install openpyxl
2. ファイルを開く
import openpyxl
wb = openpyxl.load_workbook('エクセル名.xlsx')
Excelのファイル(ブック)全体が、変数 wb に入ります。ファイル名は、拡張子(.xlsx)まで書いてください。
3. シートの名前を調べる
print(wb.sheetnames)

シートの名前が、左から順にリストで出てきます。リストの番号は0から始まるので、wb.sheetnames[0] が左から1つ目、wb.sheetnames[2] が左から3つ目のシートです。少しややこしいですが、慣れれば気にならなくなります。
当時は wb.get_sheet_names() と書いていましたが、今のopenpyxlでは古い書き方として警告が出ます。wb.sheetnames を使ってください。
4. シートを選ぶ
sheet = wb[wb.sheetnames[0]] # 左から1つ目のシート
sheet = wb['Sheet1'] # 名前で選ぶこともできます
左から1つ目のシートが、変数 sheet に入ります。
5. セルを操作する

セルの値を読む
x = sheet['A1']
print(x.value)
A1セルの中身(この例では123)が出てきます。sheet['A1'] で取れるのは「セル」そのものなので、中身は .value で取り出します。
アルファベットと数字ではなく、行と列の番号で指定することもできます。
x = sheet.cell(row=1, column=1)
print(x.value)
A1の「1」が row=1(行)、「A」が column=1(列)です。セルの場所は、この2つの方法で指定できます。使いやすい方を使ってください。
セルに値を入れる
読むときと逆に、セルに値を入れます。
sheet['A1'] = 123
sheet.cell(row=1, column=1).value = 123
どちらの書き方でも、A1セルに123が入ります。
6. 保存する
wb.save('エクセル名.xlsx')
開いたファイルと同じ名前で保存すると、上書きされます。元のファイルはそのままで、新しいファイルとして保存したいときは、別の名前にします。
wb.save('new.xlsx')
ここまでわかっていれば、データを取り出して、加工して、また入れる、という簡単な仕事の自動化ができると思います。
7. 計算式の入ったセルで困ったこと

ここで困ったことが起きました。A2セルには「2」と表示されていますが、中に入っているのは「=A1+B1」という計算式です。そのまま値を取ると、「=A1+B1」という式の方が出てきてしまいます。
計算結果の「2」を取るには、data_only=True を付けて開きます。
wb = openpyxl.load_workbook('エクセル名.xlsx', data_only=True)
これで、セルの値を取ると計算結果が出てきます。
注意1:そのまま上書き保存すると式が消える
data_only=True で開いたファイルを上書き保存すると、計算式がすべて消えて、計算結果だけになってしまいます。気をつけてください。
注意2:Excelで一度も保存していないファイルは結果がNoneになる
openpyxlは、計算式を自分で計算するわけではありません。Excelが保存したときに一緒に記録された計算結果を読んでいます。そのため、Pythonで作って一度もExcelで開いて保存していないファイルは、data_only=True でも結果が None になります。この記事を書き直すときに試していて気づきました。そのときは、一度Excelで開いて保存してから読み込んでください。
まとめ
- openpyxlの
load_workbook()でExcelのファイルを開きます - シートの名前は
wb.sheetnames、シートはwb['シート名']で選びます - セルは
sheet['A1'].valueで読み、sheet['A1'] = 値で書きます - 計算結果を取りたいときは
data_only=True。ただし上書き保存すると式が消えます
Excelの中だけで作業を自動にしたいときは、Excel VBAでセルの図形を番号順に別シートへコピーする方法も参考にしてください。

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング