Home » Python » OpenPyXLの使い方 » OpenPyXLで1行のみ1列のみを指定した場合はタプルのタプルではない

OpenPyXLで1行のみ1列のみを指定した場合はタプルのタプルではない

動作検証バージョン:Windows 10 Pro(64-bit)+ Python 3.11.1(64-bit) + OpenPyXL 3.0.10

セル範囲を文字列で指定してCellを順番に取得するOpenPyXLのコードをご紹介しました。

この方法の場合、基本的にはCellオブジェクトを要素として含むタプルのタプルが取得できるのですが、1行のみ・1列のみを指定した場合については、タプルのタプルではない点に注意が必要です。

タプルのタプルになる場合

以下のようなデータの入力されている「Sheet1」シートが、

Cドライブtempフォルダーのsample.xlsxブックに存在する場合を見てみましょう。

import openpyxl

bk = openpyxl.load_workbook(r'C:\temp\sample.xlsx')
ws = bk['Sheet1']

for i in ws['A2:B5']:
    print(type(i))
    print(i)

上記のスクリプトを実行すると、

<class 'tuple'>
(<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>)
<class 'tuple'>
(<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>)
<class 'tuple'>
(<Cell 'Sheet1'.A4>, <Cell 'Sheet1'.B4>)
<class 'tuple'>
(<Cell 'Sheet1'.A5>, <Cell 'Sheet1'.B5>)

と出力され、タプルのタプルになっていることがわかります。

そのため、個々のセルを操作するには、

for row in ws['A2:B5']:
    for cel in row:
        print(cel.value)

のように2重ループにする必要があります。

タプルのタプルではない場合

この記事の本題である、タプルのタプルではない、タプルが取得できる場合を見ましょう。

以下のように1行のみを指定した場合には、タプルのタプルではなく、Cellオブジェクトを要素に含むタプルが取得できます。

for i in ws['2:2']:
    print(type(i))
    print(i)

を実行した場合には、

<class 'openpyxl.cell.cell.Cell'>
<Cell 'Sheet1'.A2>
<class 'openpyxl.cell.cell.Cell'>
<Cell 'Sheet1'.B2>

と出力され、タプルのタプルではなく、Cellオブジェクトを要素に含むタプルであることを確認できます。

ですから、

for cel in ws['2:2']:
    print(cel.value)

で、

1
Alice

が出力されます。

1列だけを指定した場合も同様です。

for i in ws['B:B']:
    print(type(i))
    print(i)

を実行した場合には、

<class 'openpyxl.cell.cell.Cell'>
<Cell 'Sheet1'.B1>
<class 'openpyxl.cell.cell.Cell'>
<Cell 'Sheet1'.B2>
<class 'openpyxl.cell.cell.Cell'>
<Cell 'Sheet1'.B3>
<class 'openpyxl.cell.cell.Cell'>
<Cell 'Sheet1'.B4>
<class 'openpyxl.cell.cell.Cell'>
<Cell 'Sheet1'.B5>

と出力され、こちらもタプルのタプルではなく、Cellオブジェクトを要素に含むタプルです。

ですから、

for cel in ws['B:B']:
    print(cel.value)

で、

Alice
Bob
Chris
Dave

と出力されます。

最終更新日時:2023-05-23 08:57

[スポンサードリンク]

Home » Python » OpenPyXLの使い方 » OpenPyXLで1行のみ1列のみを指定した場合はタプルのタプルではない

「OpenPyXLの使い方」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.