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>))