kakashi-blog・カカシブログ・

Python備忘録を書きドローンやバイクなど好きな事で生きて行こうとしているブログ

Python

PythonでExcelを操作する方法|openpyxlの基本

投稿日:2019年11月16日 更新日:

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)
Excelのシートの名前の一覧をPythonで表示したところ

シートの名前が、左から順にリストで出てきます。リストの番号は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. セルを操作する

A1セルに123が入ったExcelのシート

セルの値を読む

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セルに計算式=A1+B1が入ったExcelのシート

ここで困ったことが起きました。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にやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

-Python
-, , ,

執筆者:


comment

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

関連記事

Python Tkinter入門|ウインドウ・ラベル・入力欄・ボタンの基本

PythonのTkinter(ティーケーインター)を使うと、ボタンや入力欄のある画面(GUI)を作れます。この記事では、ウインドウを開いて、ラベル、テキストの入力欄、ボタンを付けるまでの基本をまとめま …

PythonでFizzBuzz問題を書く|3通りの書き方と1行コード

プログラミングの入門でよく出てくる「FizzBuzz問題」を、Pythonで書いてみました。 結論から言うと、3で割り切れるか、5で割り切れるか、両方か、を if で分けるだけ です。この記事では、私 …

カプレカ数をPythonで求める|20桁まで一気に計算

6174や495のような「カプレカ数」を、Pythonで求めてみました。 結論から言うと、1つずつ数字を調べる方法では、5分回しても6個目が出てきませんでした。ところが、数字の並べ方(組み合わせ)で調 …

Tkinterのメッセージボックスで出る謎ウインドウの消し方

Pythonのtkinterでメッセージボックスだけを出したいのに、何もない小さなウインドウ(謎ウインドウ)が一緒に出てきて、処理が止まってしまうことがあります。 結論から言うと、謎ウインドウの正体は …

Seleniumの使い方入門|ブラウザを開いてスクロールする

Pythonでウェブブラウザを動かしてみたいと思い、Seleniumというライブラリを使ってみました。この記事では、Chromeを自動で開いて、ページを一番下までスクロールし、また一番上に戻るところま …