【Python】openpyxlを使ったエクセルの操作方法 |セル取得・ループ処理

Pythonのopenpyxlを使ったエクセルのセルや列等の指定方法、ループ処理について解説します。

ブック、シートの取得方法

細かい操作に入る前に操作するファイル、シートの指定する。

一般的なブック(ファイル)、シートの取得方法

import openpyxl # openpyxlをインポート

wb = openpyxl.load_workbook('エクセルファイルのパス')
sheet = wb['シート名']

関数の値を取得する場合のブックの取得

上記の一般的なブックの取得方法でブックを開き、後述するセルの値取得をすると、セル内の関数式の取得となってしまう。

もし関数式の結果である値を取得したい場合には、引数を一つ追加してブックを取得する必要がある。

wb = openpyxl.load_workbook('エクセルファイルのパス', data_only=True)

data_only=Trueを追加してブックを開くことで、関数の値を取得できるようになる。

セルの指定と値の取得

セルの指定

まずは、セルの指定方法を紹介する。

wb = openpyxl.load_workbook('エクセルファイルのパス')
sheet = wb['シート名']

sheet['セル番地'] # 例:sheet['A1']
sheet.cell(行番号,列番号 # 例:sheet.cell(1,1)

上記のようにセル番地で指定するか、行番号と列番号とで指定する。

セルの範囲指定

sheet['番地A':'番地B'] # 番地Aから番地Bの範囲を取得

列単位での指定方法

sheet['A'] # A列を指定
sheet['A'].value # A列のデータのはいっているセルの値を返す

列単位でセルの値を取得する場合

シートの最終行、最終列の取得

.max_rowと.max_columnを利用します。

maxRow = sheet.max_row # 最終行の番号を取得
maxCol = sheet.max_column # 最終列の番号を取得

シートの最初の行、最初の列を取得

minRow = sheet.min_row # 最初の行番号を取得
minCol = shee.min_column  # 最初の列番号を取得

セルの値の取得

上記のセルの指定の後に.valueをつけるだけです。

sheet.cell(行番号,列番号).value # .valueでセルの値を取得できる

複数セルのループ処理

複数セルをループ処理する。
ループ処理に入る前に、セルを指定した場合に取得されるデータ構造を確認する。

cell_A = sheet['A1'] # => <Cell '値'.A1>
range_A = sheet['A1':'C3']
'''
セルのレンジ指定は情報がタプル(タプル内タプル)で帰ってくる
((<Cell, 'シート名'.A1>, <Cell 'シート名'.B1>, <cell 'シート名'.C1>),
 (<Cell, 'シート名'.A3>, <Cell 'シート名'.B2>, <cell 'シート名'.C2>),
 (<Cell, 'シート名'.A3>, <Cell 'シート名'.B3>, <cell 'シート名'.C3>))
'''

複数セルのループ処理で重要なのは、セルのレンジ指定をした場合の取得内容です。

タプル内のには指定範囲の各行の情報がはいったタプルが入っている。
行ごとに順番に処理する場合にはタプル内のタプルを順番に指定して処理する。

for row in sheet['A1':'A3]:
    for cell in row:
        print(cell.value)

# 指定範囲のセル値を順に表示
# cell.coordinateとすれば番地情報を取得することもできる。

空白セルを飛ばして値を取得

A列の空白列を飛ばして値を取得、リスト化する。

li = [] # 空のリストを作成

for i in sheet['A']:
    if not i.value == None:
        li.append(i.value)

空欄セルはNoneを返すため、Noneをはじけいて、残りを空のリストに追加するだけです。