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

スポンサーリンク

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

あまり使い道はわかりませんが、iter_cols()iter_rows()メソッドがあります。この構文を実行すると理解できますが、両者の違いは、値を取る順番が異なるということです。引数に範囲を指定すればその範囲のセルだけを取得します。何も引数を指定しなければすべてのセルを取得します。

iter_rows()は行をすべて取得してから次の列に移りますが、iter_cols()は列の値をすべて取得してから次の行に移ります。2回forループを使う理由は、cellオブジェクトを取得するためです。このようにしないと、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)

for row in sheet.iter_rows(min_row=1, max_col=3, max_row=5):
    for cell in row:
        print(cell.value)
スポンサーリンク

sheet.columnsとsheet.rows

実は似たような機能を持つものにcolumnsrowsというのがあります。しかしこのメソッドは先ほど紹介したiter_cols()iter_rows()メソッドとほぼ同じ動きをします。さらに、引数は使えないため、同じようにforループを使用して回すと全てのセルを取得するだけのメソッドです。

昔のバージョンでは、columns[1]とすることで特定の列を取得することが可能だったようです。(なぜその機能が削除されたのかは不明です。)openpyxlはモジュールであり、現在もバグ修正や改良が継続的に行われているようです。

一応リファレンス的なサイトも存在します。公式であるかは確証がありませんが、この記事をまとめている時点ではopenpyxlのバージョンは2.4.9でした。

最後に、リファレンス的なサイトへのリンクを貼っておきます。英語なので理解が難しいかもしれませんが、翻訳機能などを使って読むとさまざまな情報が得られるかもしれません。: http://openpyxl.readthedocs.io/en/default/index.html

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

コメント

タイトルとURLをコピーしました