
前回はExcelシートの列番号とアルファベットを変換する方法を学びました。
今回はExcelシートから複数の行と列を取得する方法を学びます。
複数の行と列を取得する方法
import openpyxl
wb=openpyxl.load_workbook('rakuten.xlsx')
Sheet=wb['rakuten'] #ワークブックからシートを取得
print(Sheet['A1':'C3']) #シートA1からC3までのセルを取得
#出力結果は
((<Cell 'rakuten'.A1>, <Cell 'rakuten'.B1>, <Cell 'rakuten'.C1>), (<Cell 'rakuten'.A2>, <Cell 'rakuten'.B2>, <Cell 'rakuten'.C2>), (<Cell 'rakuten'.A3>, <Cell 'rakuten'.B3>, <Cell 'rakuten'.C3>))
shunichi@tamurashu
A1からC3までの領域をSheet[‘A1′:’C3’]というスライスによって指定。
その領域に含まれるcellオブジェクトのタプルを取得しています。
このタプルには、A、B、C列の各1列ごとの合計3つのタプルが格納されています。
取得した複数のセルを1つずつ取り出す方法
import openpyxl
wb=openpyxl.load_workbook('rakuten.xlsx')
Sheet=wb['rakuten'] #ワークブックからシートを取得
for i in Sheet['A1':'C3']: # A1~C3のセル範囲を1行ずつ取り出す
print(i)
for a in i: # 1行の中にあるセルを1つずつ取り出す
print(a)
Sheet['A1':'C3']で取得したデータは、行ごとのタプルが集まったタプルになっています。
最初のfor文では、変数iに1行分のタプルが順番に代入されます。
例えば1回目のループでは、iには「A1・B1・C1」のセルオブジェクトが入ったタプルが代入されます。2回目は「A2・B2・C2」、3回目は「A3・B3・C3」が代入されます。
次に、内側のfor文では、そのiの中に入っているセルオブジェクトを1つずつ取り出し、変数aに代入しています。
そのため、1回目のループではaにA1、次にB1、最後にC1のセルオブジェクトが順番に代入されます。同じように、2回目のループではA2・B2・C2、3回目ではA3・B3・C3が順番にaへ代入されます。
このように、iは「1行分のセル」、aは「その行の中の1つのセル」を表しています。二重のfor文を使うことで、複数のセルを1つずつ順番に処理できるようになります。この書き方は、後でセルの値(.value)を取得したり、セルの内容を書き換えたりする際によく使われます。
list()を使って列データを取得する方法
import openpyxl
wb=openpyxl.load_workbook('rakuten.xlsx')
Sheet=wb['rakuten'] #ワークブックからシートを取得
print(list(Sheet.columns)[1]) #リストの2番目の要素であるB列を取得
#出力結果は
(<Cell 'rakuten'.B1>, <Cell 'rakuten'.B2>,
...
<C <Cell 'rakuten'.B80>, <Cell 'rakuten'.B81>)
Sheet.columnsをlist()でリストに変換すると、各列が要素として格納されたリストになります。
そのため、
list(Sheet.columns)[1]
と書くことで、リストの2番目の要素であるB列を取得できます。
実行結果では、B1からB81までのセルオブジェクトが1つのタプルとして表示されます。
これは、リストの2番目の要素に「B列のすべてのセル」がまとめて格納されているためです。
なお、Pythonのリストはインデックス番号が0から始まるため、
[0]:A列[1]:B列[2]:C列
というように列を指定できます。
このようにlist()へ変換することで、インデックス番号を使って目的の列を簡単に取得できるようになります。
for文を使って列の値を順番に取得する
list(Sheet.columns)[1]を使って、3列目(B列)のセルオブジェクトを取得しました。
今回は、そのセルオブジェクトをfor文で1つずつ取り出し、.valueを使ってセルに入力されている値を取得します。
import openpyxl
wb=openpyxl.load_workbook('rakuten.xlsx')
Sheet=wb['rakuten'] #ワークブックからシートを取得
for c in list(Sheet.columns)[2]:
print(c.value)
list(Sheet.columns)[2]には、C列のセルオブジェクト(C1、C2、C3…)が格納されています。
for文では、それらのセルオブジェクトが1つずつ変数cに代入されます。
そして、c.valueと書くことで、セルオブジェクトではなくセルに入力されている値を取得できます。
このコードを実行すると、C列の値が上から順番に表示されます。
このように、列全体を取得してfor文で繰り返し処理を行い、.valueでセルの値を取り出すという書き方は、Excelのデータを一覧で読み込む際によく使われる基本的な方法です。
まとめ
今回は、openpyxlを使ってExcelシートから複数の行や列を取得する方法を学びました。
今回学んだポイントは次のとおりです。
Sheet['A1':'C3']を使うと、指定した範囲のセルをまとめて取得できる。- 取得したデータは「行ごとのタプル」が集まったタプルになっている。
- 二重の
for文を使うことで、セルを1つずつ順番に処理できる。 Sheet.columnsをlist()へ変換すると、インデックス番号で列を指定できる。list(Sheet.columns)[1]のように書くことで、特定の列を取得できる。.valueを使うと、セルオブジェクトではなくセルに入力されている値を取得できる。
Excelを扱うプログラムでは、「複数のセルを取得して繰り返し処理する」という場面が非常に多くあります。
今回学んだfor文や.valueの使い方は、データの集計や加工、自動化を行う際の基本となる重要な知識です。
今後、さらにExcel操作の幅を広げる便利な機能について学んでいきます。

コメント