Python Excelの読み込み、必要なモジュール
書き込み手順やシートの編集方法について
書き込み手順やシートの編集方法については、こちらの記事で紹介しています。
akuruhinode.hatenablog.com
必要なモジュール
PythonでExcelを操作するにはopenpyxlモジュールが必要です。標準では付属していないため、開発環境に応じた方法でインストールしてください。
- Python環境
pip install openpyxl
- Anaconda環境
conda install openpyxl
バージョン情報
本記事のサンプルコード作成時のバージョン情報は以下の通りです。
python : 3.8.3 openpyxl : 3.0.4
基本的な手順
基本的な流れは以下の通りです。openpyxlモジュールを利用することで、簡単にExcelファイルを読み込むことができます。
上記手順のコードは以下の通りです。
ここでは、以下のようにSheet1に簡単なテーブルを持つExcelファイルを読み込んでみます。
import openpyxl # 1.openpyxlモジュールをインポートする wb = openpyxl.load_workbook('sample.xlsx') # 2.Excelファイルを読み込む names = wb.sheetnames # シート名のリストを取得 # ['Sheet1', 'Sheet2'] ws= wb[names[0]] # 3.操作するシートを指定する # このように直接文字列を指定することも可能 # ws = wb['Sheet1'] # このようにアクティブシートを読み込むことも可能 # ws= wb.active # print(ws.title) # シート名はws.titleで確認できる a2 = ws['A2'] # 4.セルから値を読み込む print(a2.value) # 値を取得 print(a2.row) # 行番号を取得 print(a2.column) # 列番号を取得 print(a2.coordinate) # セル文字列を取得 # 以下のように指定しても、上記と同じようにCellオブジェクトを取得可能 # a2 = ws.cell(row=2, column=1)
English 2 1 A2
その他の読み込み方法
複数のセルをまとめて読み込み
リストのようにスライスを利用することで、複数のセルをまとめて取得できます。
for row_of_cell_obj in ws['A2':'D4']: # 'A2'から'D4'のセルをまとめて取得 for cell_obj in row_of_cell_obj: # 1セル単位で取り出し print(cell_obj.coordinate, cell_obj.value) print('---')
A2 English B2 80 C2 95 D2 50 --- A3 Math B3 90 C3 100 D3 72 --- A4 Science B4 75 C4 80 D4 55
行番号、列番号を指定してforループで読み込み
cell()
メソッドに行番号、列番号を指定することでも上記と同じ結果を得られます。
ここでは、max_row
とmax_column
を利用することでシート内のサイズを取得しています。また、get_column_letter()
メソッドを利用することで、列番号を列文字列に変換しています。
from openpyxl.utils import get_column_letter for row in range(2, sheet.max_row + 1): # 見出し行をスキップするため2から開始 for col in range(1, sheet.max_column + 1): print(str(row) + get_column_letter(col), ws.cell(row=row, column=col).value) print('---')
読み込んだセルをリストや辞書に変換
ここまで説明してきた機能を利用すれば、読み込んだセルを簡単にリストや辞書に変換できます。
- リストの入れ子に変換
test_score = [] for row_of_cell_obj in ws['A2':'D4']: test_score.append([cell_obj.value for cell_obj in row_of_cell_obj]) # test_score = [['English', 80, 95, 50], ['Math', 90, 100, 72], ['Science', 75, 80, 55]] print(test_score[0][0], test_score[0][1])
English 80
- リストと辞書に変換
test_score = [] for row_of_cell_obj in ws['A2':'D4']: test_score.append({ws.cell( row=1, column=cell_obj.column).value: cell_obj.value for cell_obj in row_of_cell_obj}) # 1列目をキーにする # test_score = [{'Subject': 'English', 'Average': 80, 'Highest': 95, 'Lowest': 50}, {'Subject': 'Math', 'Average': 90, 'Highest': 100, 'Lowest': 72}, {'Subject': 'Science', 'Average': 75, 'Highest': 80, 'Lowest': 55}] print(test_score[0]['Subject'], test_score[0]['Average'])
English 80