no-image

pythonのopenpyxlモジュールを使ってエクセル操作【5時間目:rows, columns】

iter_cols()とiter_rows()メソッドで全部セルを取る

あまり使い道はわからないですが、iter_cols()とiter_rows()メソッドがあります。この構文を実行したらわかりますが、両者の違いは、値を取る順番が違うということです。引数に範囲を指定すればその分だけ取ります。何も引数を指定しなければ全部をとってきます。

iter_rows()は行を全部とってから次の列に、iter_cols()は列の値を全部取ってから次の行にうつります。forを2回使う理由はcellオブジェクトをとってくるためです。こうしないと.valueが使えないです。

ためしにコード中に含まれるcolはなんなのか調べてみましょう。

print(type(col))#<class 'tuple'>

結果はtuple型になっています。tuple.valueとしてもセルの値は参照できないです。オブジェクトは流れがよく見えないのが辛いですが、一応type()メソッドを使えばそれがなんなのかがわかるようになります。もしくはspyderだったら変数エクスプローラーを使えば、そこに何が入っているか(変数の型も)見ることができます。

import openpyxl, os
wb = openpyxl.load_workbook('example.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')

for col in sheet.iter_cols(min_row=1, max_col=3, max_row=5):
 for cell in col:
 print(cell.value)
print('\n')

for row in sheet.iter_rows(min_row=1, max_col=3, max_row=5):
 for cell in row:
 print(cell.value)
print('\n')

sheet.columnsとsheet.rows

実は似たような機能をもつものにcolumnsとrowsというのがあります。しかしこのメソッドは上のメソッドとほぼ同じ動きをします。しかも引数は使えないので、同じようにforループで回すと全てをとってくるだけのメソッドです。

昔のバージョンですと、columns[1]とすることで特定の列を取ってくることが可能だったようです。(よい機能だったのになんで消した?)openpyxlはモジュールです。現在も常にバグ取りなどで、更新・改良を重ねているようです。

columnsとrowsにかんしては、他にも色々使い方はあるかもしれませんが、初心者のため確認事項だけしかお伝え出来ません。

一応リファレンスっぽいサイトもあります。公式かどうかはよくわかりませんが。この記事をまとめている時点ですとopenpyxlのバージョンは2.4.9でした。

最後にリファレンスっぽいサイトがあったのでリンクを貼っておきます。英語なので辛いですが、翻訳機能などを使って読むと色々わかるかもしれないです。
http://openpyxl.readthedocs.io/en/default/index.html

次は「pythonのopenpyxlモジュールを使ってエクセル操作【6時間目:集計】」です。