akuruhinode's blog

pythonやC#を中心に興味を持った内容について調べています。

Python Excelの読み込み、必要なモジュール

はじめに

PythonではExcelを簡単に操作できます。ここでは、Excelからセルの値を読み込む手順をサンプルコードを用いて説明します。

書き込み手順やシートの編集方法について

書き込み手順やシートの編集方法については、こちらの記事で紹介しています。
akuruhinode.hatenablog.com

必要なモジュール

PythonExcelを操作するにはopenpyxlモジュールが必要です。標準では付属していないため、開発環境に応じた方法でインストールしてください。

pip install openpyxl
  • Anaconda環境
conda install openpyxl

バージョン情報

本記事のサンプルコード作成時のバージョン情報は以下の通りです。

python : 3.8.3
openpyxl : 3.0.4

基本的な手順

基本的な流れは以下の通りです。openpyxlモジュールを利用することで、簡単にExcelファイルを読み込むことができます。

f:id:akuruhinode:20210131000017j:plain
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_rowmax_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