前回の続き
毎度牛歩のように進めている勉強会ももう8回目ですね。コードに触れるという大目標をクリアし続けてるのは良いことだと思います。(思いたいw)
セルの取得方法
- 前提としてエクセルを触る。→セルを扱えるようにならないと始まらない。
- 扱い方はスプレッドシートと似ている。
- 3つも取得方法がある。
その①~rangeとfor文でがんばる作戦~
縦と横方向(行と列)になるようにfor文を重ねることでセルを取得できる。
- メリット
for文なので何をやってるか初心者にはわかりやすい。 - デメリット
「Dは何列目か」など位置情報を正確に変換をしないと欲しい情報が得られない。
# A1~Z10まで
for y in range(1,11):
for x in range(1,27):
cell = sheet.cell(row=y, column=x)
その②~左上と右下のセル名でラクラク指定~
左上と右下を選択すると範囲が選択できるのと同様に取得できる。
- メリット
コードを見れば範囲が一目でわかる。 - デメリット
動的な範囲指定には少しコツが必要。
for rows in sheet["B2:D4"]:
for cell in rows:
print(cell)
for rows in sheet["B2":"D4"]:
for cell in rows:
print(cell)
sheetのセルの範囲指定には2パターンの書き方がある。どちらでもよい。
- 全部文字列パターン("B2:D4")
- セル名だけ文字列パターン("B2":"D4")
その③~イテレータで繰り返し範囲から取得~
イテレータは基本的にfor文と組み合わせて使う前提で、特定の要素を反復して値を取り出せる。
今回はsheetのiter_rowsメソッドを使う。
- メリット
直接セル名指定ではなくなるので、どんな状況下でも扱いやすい。 - デメリット
メソッドの中身を理解していないと思った通りの範囲を取得できない。
# A1~Z10
it = sheet.iter_rows(1,10,1,26)
for row in it:
print([c.value for c in row])
iter_rowsの引数は順番に「最小行、最大行、最小列、最大列」となる。
リスト内包表記
その③でしれっと書いていたこのprintの中の部分をリスト内包表記という。
[c.value for c in row]
for文の前に変数が出てきてるのがとても気持ち悪いなんとも言えない。。。
とはいえ、これにより毎回空配列を準備してという手間がなくなるので楽になりそう。
こういうPythonの記法は学んでいかないとな・・・
まとめ
- エクセルのセルを範囲指定してセルを取得する方法は3つある。
- その②とその③のやってることは左上と右下の把握なので、範囲が固定化されているならその②のセル名指定、柔軟に対応するならその③のイテレータを使うとよい。
- リスト内包記法というPythonの記法。