Python

openpyxlで行、列、矩形領域を参照する方法

更新日:

openpyxlで行や列、矩形領域などの複数セルを参照する方法について記載します。

矩形領域のセルを取得する

シートの矩形領域のセルは、スライスを使ってで取得できます。

>>> import openpyxl
>>> wb = openpyxl.Workbook()
>>> ws = wb.active
>>> cells = ws['A1':'C2']
>>> type(cells)
<class 'tuple'>
>>> cells
((<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>),
 (<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>))

結果はネストしたタプルで返されます。内側のタプルには1行分のセルが含まれます。

行や列のセルを取得します

行や列のセルのセルも同様にスライスで取得できます。先ほどの例に続けて以下を入力します。

>>> col_a = ws['A']
>>> col_a
(<Cell 'Sheet'.A1>, <Cell 'Sheet'.A2>)
>>> col_bc = ws['B:C']
>>> col_bc
((<Cell 'Sheet'.B1>, <Cell 'Sheet'.B2>), (<Cell 'Sheet'.C1>, <Cell 'Sheet'.C2>))
>>> row_1 = ws[1]
>>> row_1
(<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>)
>>> row_2_3 = ws[2:3]
>>> row_2_3
((<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>),
 (<Cell 'Sheet'.A3>, <Cell 'Sheet'.B3>, <Cell 'Sheet'.C3>))

ここで知っておくべきことは、シートが作成されたときにはセルが1つも含まれていないということです。 そしてセルは最初にアクセスされたときに作成されます。

上述の例でws['A1':'C2']とセルにアクセスしたときに、2行3列のセルが作成されました。 ws['A']で取得したA列のセルが2行目までしかないのはそのためです。 ws[2:3]で3行目の参照すると新たに行が作成されます。

例をもう少し見て見ましょう。

>>> col_e = ws['E']
>>> col_e
(<Cell 'Sheet'.E1>, <Cell 'Sheet'.E2>, <Cell 'Sheet'.E3>)
>>> row_1 = ws[1]
>>> row_1
(<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>, <Cell 'Sheet'.D1>, <Cell 'Sheet'.E1>)
>>> row_5 = ws[5]
>>> col_5
(<Cell 'Sheet'.A5>, <Cell 'Sheet'.B5>, <Cell 'Sheet'.C5>, <Cell 'Sheet'.D5>, <Cell 'Sheet'.E5>)

行を順番に取得する

順番に行のデータを取得(イテレート)するには openpyxl.worksheet.Worksheet.iter_rows()メソッドを使います。

>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
...     print(row)
...
(<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>)
(<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>)

すべての行をイテレートしたいなら、代わりにWorksheet.rows属性を使うこともできる。

>>> for rows in ws.rows:
...     print(row)
...
(<Cell 'Sheet'.A5>, <Cell 'Sheet'.B5>, <Cell 'Sheet'.C5>, <Cell 'Sheet'.D5>, <Cell 'Sheet'.E5>)
(<Cell 'Sheet'.A5>, <Cell 'Sheet'.B5>, <Cell 'Sheet'.C5>, <Cell 'Sheet'.D5>, <Cell 'Sheet'.E5>)
(<Cell 'Sheet'.A5>, <Cell 'Sheet'.B5>, <Cell 'Sheet'.C5>, <Cell 'Sheet'.D5>, <Cell 'Sheet'.E5>)
(<Cell 'Sheet'.A5>, <Cell 'Sheet'.B5>, <Cell 'Sheet'.C5>, <Cell 'Sheet'.D5>, <Cell 'Sheet'.E5>)
(<Cell 'Sheet'.A5>, <Cell 'Sheet'.B5>, <Cell 'Sheet'.C5>, <Cell 'Sheet'.D5>, <Cell 'Sheet'.E5>)

最初にタプルのようなデータ型に変換しても良い。

>>> tuple(ws.rows)
((<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>, <Cell 'Sheet'.D1>, <Cell 'Sheet'.E1>),
(<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>, <Cell 'Sheet'.D2>, <Cell 'Sheet'.E2>),
(<Cell 'Sheet'.A3>, <Cell 'Sheet'.B3>, <Cell'Sheet'.C3>, <Cell 'Sheet'.D3>, <Cell 'Sheet'.E3>),
(<Cell 'Sheet'.A4>, <Cell 'Sheet'.B4>, <Cell 'Sheet'.C4>, <Cell 'Sheet'.D4>, <Cell 'Sheet'.E4>),
(<Cell 'Sheet'.A5>, <Cell 'Sheet'.B5>, <Cell 'Sheet'.C5>, <Cell 'Sheet'.D5>, <Cell 'Sheet'.E5>))

列を順番に取得する

同様に、列を順番に取得(イテレート)するには openpyxl.worksheet.Worksheet.iter_cols()メソッドを使います。

>>> for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
...     print(col)
...
(<Cell 'Sheet'.A1>, <Cell 'Sheet'.A2>)
(<Cell 'Sheet'.B1>, <Cell 'Sheet'.B2>)
(<Cell 'Sheet'.C1>, <Cell 'Sheet'.C2>)

すべての列をイテレートしたいなら、代わりにWorksheet.columns属性を使うこともできる。

>>> for col in ws.columns:
...     print(col)
...
(<Cell 'Sheet'.A1>, <Cell 'Sheet'.A2>, <Cell 'Sheet'.A3>, <Cell 'Sheet'.A4>, <Cell 'Sheet'.A5>)
(<Cell 'Sheet'.B1>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.B3>, <Cell 'Sheet'.B4>, <Cell 'Sheet'.B5>)
(<Cell 'Sheet'.C1>, <Cell 'Sheet'.C2>, <Cell 'Sheet'.C3>, <Cell 'Sheet'.C4>, <Cell 'Sheet'.C5>)
(<Cell 'Sheet'.D1>, <Cell 'Sheet'.D2>, <Cell 'Sheet'.D3>, <Cell 'Sheet'.D4>, <Cell 'Sheet'.D5>)
(<Cell 'Sheet'.E1>, <Cell 'Sheet'.E2>, <Cell 'Sheet'.E3>, <Cell 'Sheet'.E4>, <Cell 'Sheet'.E5>)

行のときと同様に、最初にタプルのようなデータ型に変換しても良い。

>>> tuple(ws.columns)
((<Cell 'Sheet'.A1>, <Cell 'Sheet'.A2>, <Cell 'Sheet'.A3>, <Cell 'Sheet'.A4>, <Cell 'Sheet'.A5>),
(<Cell 'Sheet'.B1>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.B3>, <Cell 'Sheet'.B4>, <Cell 'Sheet'.B5>),
(<Cell 'Sheet'.C1>, <Cell 'Sheet'.C2>, <Cell 'Sheet'.C3>, <Cell 'Sheet'.C4>, <Cell 'Sheet'.C5>),
(<Cell 'Sheet'.D1>, <Cell 'Sheet'.D2>, <Cell 'Sheet'.D3>, <Cell 'Sheet'.D4>, <Cell 'Sheet'.D5>),
(<Cell 'Sheet'.E1>, <Cell 'Sheet'.E2>, <Cell 'Sheet'.E3>, <Cell 'Sheet'.E4>, <Cell 'Sheet'.E5>))

-Python

Copyright© アナグマのモノローグ , 2021 All Rights Reserved Powered by STINGER.