PythonからExcelを読み書きするために使われる代表的な外部ライブラリであるopenpyxlを使用してExcelファイルの読み書き方法を具体例をつけて備忘録として残しておきます。
ここでは、読み込み方法について記載します。
目次
- openpyxlのインストール
- 対象Excelファイルと処理内容
- プログラム例1(Excel表内データ取得)
- 対象Excelファイルと処理内容
- プログラム例2(Excel表内データ取得後別ファイルへ書込み)
はじめにopenpyxlのインストール方法は以下のようになります。
openpyxlのインストール
インストール py -m pip install openpyxl
次に、Pythonからこのopenpyxlを使った読み込みプログラムの例を挙げたいと思います。
対象Excelファイルと処理内容
対象となるExcelファイルは以下のような簡単なものとします。
c:\abc.xlsx
選択 | 名前 | 得点 |
---|---|---|
鈴木 | 80 | |
○ | 田中 | 70 |
高橋 | 90 | |
佐藤 | 50 |
シート名:'def'
ここで、処理する内容としては、
[処理内容]
Excelファイル(c:\abc.xlsx)のシート名('def')の1列目に〇がついている行の名前と点数を取得(1つ目の○の名前、点数)
とします。
プログラム例1(Excel表内データ取得)
この処理を行うプログラムの例としては以下のようになります。
excelreadwrite1.py
import openpyxl ###wb = openpyxl.load_workbook(ファイル名) wb = openpyxl.load_workbook(r"C:\abc.xlsx") ### ws = wb[シート名] ws = wb["def"] ### 辞書型変数dict_text 宣言、初期化(要素としてキー'名前'、'得点'を持つ) dict_text = {"名前":"","得点":""} #xの値でループ(xの値を1から最大行番号までループ) for x in range(1, ws.max_row ): #1列目を順に見ていきセルの値が"○"であれば、 if ws.cell(x,1).value == "○": #"○"がついている行の名前と得点取得 dict_text["名前"]= ws.cell(x, 2).value dict_text["得点"]= ws.cell(x, 3).value break
プログラムの説明
1行目の
import openpyxl
は、openpyxlのインポートになります。
それに続く、
###wb = openpyxl.load_workbook(ファイル名) wb = openpyxl.load_workbook(r"C:\abc.xlsx") ###ws = wb[シート名] ws = wb["def"]
で、wbという変数にExcelファイル(c:\abc.xlsx)を読み込み、wsにそのExcelファイル(c:\abc.xlsx)のシート名('def')のシートを読み込んでいます。
ファイル名指定でのカッコ内の先頭の"r"は、これがないとファイル指定時に"\"がエスケープシーケンスとみなされてエラーが出るため必要となります。
その次の、
#辞書型変数dict_text 宣言、初期化(要素としてキー'名前'、'得点'を持つ) dict_text = {"名前":"","得点":""}
でキーとして'名前','得点'をもつ辞書型変数dict_textを宣言、初期化しています。
続いて、
#xの値でループ(xの値を1から最大行番号までループ) for x in range(1, ws.max_row ):
では、for文の中で、xの値として、3から ws.max_rowまでループを回します。
ws.max_rowにはopenpyxlではwsシートの最大行番号が入っています。
ちなみに、Python からExcelシートの最大行番号、最大列番号の求め方は以下のように以前記載しています。
それに続く、
#1列目を順に見ていきセルの値が"○"であれば、 if ws.cell(x,1).value == "○":
では、for文の中でxで行番号を変えながら1行目から最大行番号まで"○"が出てくるまでセルの値を見ていきます。
そして、if文の条件成立時の実行内容としては、
#"○"がついている行の名前と得点取得 dict_text["名前"]= ws.cell(x, 2).value dict_text["得点"]= ws.cell(x, 3).value break
となっています。
これにより、1列目に"○"がついてる行がはじめて登場した時にその行の2列目のセルの内容をdict_textの'名前'キーの値に入れ,3列目のセルの内容を'得点'キーの値に入れています。
この場合、得点は文字列として入ります。
これにより、Pythonからopenpyxlを使用して、Excelファイルの該当するデータや行番号の読み込みができることになりますので、プログラムの内容を変更することで種々のデータなどの取得ができると思います。
対象Excelファイルと処理内容
次に、Excelの表内の値を取得した後に別のExcelファイルへの書き込み処理をするように内容を追加してみます。
対象とするExcelファイルは以下のようにします。
c:\abc.xlsx
名前 | 英語 | 数学 | 国語 |
---|---|---|---|
鈴木 | 80 | 55 | 75 |
田中 | 70 | 65 | 85 |
高橋 | 90 | 60 | 90 |
佐藤 | 50 | 75 | 60 |
シート名:'def'
c:\abc2.xlsx
科目 | 英語 | 数学 | 国語 | ||
---|---|---|---|---|---|
平均点 | |||||
シート名:'def2'
処理する内容としては、
[処理内容]
abc.xlsxファイルから科目ごとの各生徒の点数を読み込んで平均点を求め、abc2.xlsxファイルの各科目の平均点の欄に書き込む
とします。
プログラム例2(Excel表内データ取得後別ファイルへ書込み)
これを実施するためのプログラムの例としては以下のようになります。
excelreadwrite2.py
import openpyxl ###wb = openpyxl.load_workbook(ファイル名) wb = openpyxl.load_workbook(r"C:\abc.xlsx") wb2 = openpyxl.load_workbook(r"C:\abc2.xlsx") ###ws = wb[シート名] ws = wb["def"] ws2 = wb2["def2"] #辞書型変数dict_text 宣言、初期化(要素としてキー'英語'、'数学'、'国語'を持つ) dict_text = {"英語":0,"数学":0,"国語":0} #xの値でループ(xの値を2から最大行番号までループ) for x in range(2, ws.max_row ): #abc.xlsxファイルのdefシートから各科目ごとに全員の合計点を計算 dict_text["英語"]= dict_text["英語"] + ws.cell(x, 2).value dict_text["数学"]= dict_text["数学"] + ws.cell(x, 3).value dict_text["国語"]= dict_text["国語"] + ws.cell(x, 4).value #各科目ごとに平均点を求めて、abc2.xlsxファイルのdef2シートの平均点欄へ書込み ws2.cell(2, 2).value = dict_text["英語"] / (ws.max_row - 1) ws2.cell(2, 3).value = dict_text["数学"] / (ws.max_row - 1) ws2.cell(2, 4).value = dict_text["国語"] / (ws.max_row - 1) wb2.save(r"C:\abc2.xlsx")
プログラムの説明
先頭のimport文は一緒ですが、
その次の、
###wb = openpyxl.load_workbook(ファイル名) wb = openpyxl.load_workbook(r"C:\abc.xlsx") wb2 = openpyxl.load_workbook(r"C:\abc2.xlsx") ###ws = wb[シート名] ws = wb["def"] ws2 = wb2["def2"]
で、読み込み用のファイル、シートに加えて、書き込み用のファイル、シートを追加しています。
その次の、
#辞書型変数dict_text 宣言、初期化(要素としてキー'英語'、'数学'、'国語'を持つ) dict_text = {"英語":0,"数学":0,"国語":0}
で、各科目の合計点用にキーとして'英語','数学','国語'をもつ辞書型変数dict_textを宣言、初期値を0として初期化しています。
そして、それに続く、
#xの値でループ(xの値を2から最大行番号までループ) for x in range(2, ws.max_row ): #abc.xlsxファイルのdefシートから各科目ごとに全員の合計点を計算 dict_text["英語"]= dict_text["英語"] + ws.cell(x, 2).value dict_text["数学"]= dict_text["数学"] + ws.cell(x, 3).value dict_text["国語"]= dict_text["国語"] + ws.cell(x, 4).value
で、ws(abc.xlsxファイルのdefシート)からfor文で2行目から最大行番号までループを回しながら各科目ごとに全生徒の点数を読み込んで合計点を求めています。
たとえば、英語であれば、dict_text["英語"]に、順に各生徒の点数を足しこんでいます。
次が別ファイルへの書き込みとなります。
#各科目ごとに平均点を求めて、abc2.xlsxファイルのdef2シートの平均点欄へ書込み ws2.cell(2, 2).value = dict_text["英語"] / (ws.max_row - 1) ws2.cell(2, 3).value = dict_text["数学"] / (ws.max_row - 1) ws2.cell(2, 4).value = dict_text["国語"] / (ws.max_row - 1)
では、求めた各科目の合計点を人数で割って平均点を求め、ws2(abc2.xlsxファイルのdef2シート)の各科目の平均点の欄に書き込んでいます。
今回の例では、各科目ごとの行番号などは固定で入れています。
最後の
wb2.save(r"C:\abc2.xlsx")
で、書き込んだファイルを保存しています。
上の例ではCドライブの直下を書き込み先としていますが、管理者権限でないと書き込めないということでエラーが出る場合があります。
その場合は、ドキュメントの下(C:\Users\(ユーザー名)\Documents)など書き込めるところに変更してください。
これらにより、Pythonからopenpyxlを使用して、Excelファイルの該当するデータを読み込み、別ファイルへの書き込みなどができることになりますので、プログラムの内容を変更することで種々のデータなどの読み込み、書き込みができると思います。
また、Pythonに関して初心者、初級者におすすめの入門書は以下に記載していますのでもしよければ見てみてください。
また、PythonやSeleniumの活用に必要となりそうな記事を一覧として以下にまとめましたのでよかったらご参照ください。
関連記事:
【クローリング、スクレイピング】クローリング、スクレイピングとは、Web上のデータ取得、操作での参考書籍、サイト - Django Girls and Boys 備忘録
【Python】Excel読み書き用外部ライブラリopenpyxlのインストール手順 - Django Girls and Boys 備忘録
【Python】openpyxlを使用してのExcelファイルの読み込み方法(具体的な読み込み方法記載例) - Django Girls and Boys 備忘録
【Python】openpyxlを使用してのExcelファイルの読み書き方法(具体的な読み書き方法記載例) - Django Girls and Boys 備忘録
【Python Excelファイルの読み書き】PythonのダウンロードからExcelファイルの読み書きまで必要なものを一通り記載 - Django Girls and Boys 備忘録
【PythonによるExcelファイルの読み書き】PythonのダウンロードからExcelファイルの読み書きまでの一通りすべての方法 - Django Girls and Boys 備忘録
【TOEIC試験 おすすめ参考書、書籍】(勉強法) - Django Girls and Boys 備忘録