こんにちは。かつひさ(@katsuhisa__)です。
PythonのOpenPyXLモジュールを使い、面倒で退屈なExcel作業をPythonで自動化する方法をお伝えする連載の二記事目です!
連載一記事目はこちら。
前回は、OpenPyXLを使用するための事前準備と、試しにExcelのセルを1つ取得する方法をお伝えしました。二記事目となる今回は、OpenPyXLで複数のセルの値を取得する方法をご紹介します。
最後までお付き合いください。
複数のセル値をまとめて取得する
さて、前回はExcelのセルの値を1つだけ取得する方法をお伝えしました。今回は、複数のセルの値を取得するにはどのように考えれば良いかを、まずはお伝えします。
今回も前回のExcelシートをサンプルとして使用します。
では、B列をすべて取得してみましょう。
B列をすべて取得するPythonのコードは以下です。
import openpyxl
wb =openpyxl.load_workbook('example.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
for i in range(1,8):
print(sheet.cell(row=i, column=2).value)
Apples
Cherries
Pears
Oranges
Apples
Bananas
Strawberries
という結果が返ってくれば成功です。
では、具体的にコードの中身を解説します。
大きく分けると以下の2つで構成されています。
- セルの値を取得するコード
- 繰り返し実行するコード
セルの値を取得するコード
こちらは前回の復習ですので、詳細な説明は省略します。
このように記述すると、指定した行数番号と列数番号に対応するセルのオブジェクトが取得できましたね。また、セルオブジェクトにはvalue属性があるので、シートオブジェクト.cell(row=行数番号, column=列数番号).valueと記述すると、セルの値を取得できます。
また、列数番号は、ABC… ➔ 123…に対応しているのでしたね。今回はB列を取得したいので、column=2を指定すればよいですね。
繰り返し実行するコード
ここでは、for文を用いています。
for文は、
# 処理
と書けば、変数を開始値から終了値まで1ずつ繰り上げながら、処理を繰り返し実行できます。
Pythonのfor文の使い方は、タカハシさんの記事で詳しく解説されていますので、よければご参照ください。
今回は、「 for i in range(1,8): 」と書いたので、変数iを1から8まで1ずつ繰り上げながら処理を繰り返します。
また、処理の中身は、「 print(sheet.cell(row=i, column=2).value) 」なので、
row(行数番号)を1から8まで1ずつ繰り上げながら、column(列数番号)が2、すなわちB列の値を出力する処理を実行しました。
つまり、
print(sheet.cell(row=1, column=1).value)
print(sheet.cell(row=2, column=1).value)
print(sheet.cell(row=3, column=1).value)
〜
print(sheet.cell(row=7, column=1).value)
を行ったことになります。
「1〜8まで」=「1,2,3,4,5,6,7」なのでご注意くださいね。
ここまでで、複数のセルの値をまとめて取得する方法の概要を説明しました。
行や列単位でExcelデータを取得しよう
さて、前述のコードですが、「毎回、行数番号の終点を指定するのは面倒だ」と思いませんでしたか?
新しく8行目や9行目を追加すると、そのたびにfor文の終了値を9や10に変更しなければなりません。みなさんが業務で扱うExcelシートは一度作成した後はずっと更新されない、なんてことはないはずです。
つまり、前述したコードのままであれば、Excelシートが更新される度に、コードをメンテナンスする羽目になりますね。こんなめんどくさいこと誰もやりたくないでしょう。
そこで、OpenPyXLでは、Excelの行や列単位でまとめて取得するための書き方が存在します。
Excelシートの行や列をまとめて取得するコード
では、早速コードをみてみましょう
import openpyxl
wb =openpyxl.load_workbook('example.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
for cell_obj in list(sheet.columns)[1]:
print(cell_obj.value)
今回も
Apples
Cherries
Pears
Oranges
Apples
Bananas
Strawberries
と表示されれば成功です。
さっそく解説します。
列単位でセルオブジェクトを取得する
list関数を使えば、指定した列数番号に存在するExcelのセルオブジェクトをまとめて取得できます。なお、行単位でExcelのセルオブジェクトを取得するには、columnsをrows、列数番号を行数番号に変えれば良いです。
今回のサンプルコードでは、具体的に以下の値が返り値として得られます。
<Cell Sheet1.B1>,
<Cell Sheet1.B2>,
<Cell Sheet1.B3>,
<Cell Sheet1.B4>,
<Cell Sheet1.B5>,
<Cell Sheet1.B6>,
<Cell Sheet1.B7>
さらに、上述したサンプルコードでは、この返り値をfor文で処理をしています。
for cell_obj in list(sheet.columns)[1]:
print(cell_obj.value)
取得したB列のセルオブジェクト(list(sheet.columns)[1])に対し、for文でprint(cell_obj.value)を繰り返し実行することで、B列のセルの値を1つずつ出力しています。
さいごに
以上、OpenPyXLで複数のセルの値を取得する方法でした。
前記事に比べると、ややプログラムが複雑なので、難しいと感じた方もいらっしゃったかもしれませんが、何度か読めば必ず理解できる内容だと思いますので、ぜひがんばって取り組んでいただければ幸いです。
次回は、ついにOpenPyXLを使ってExcelにデータを書き込む方法について学んでいきます。ここまで理解すれば、異なるExcelシート間のデータコピーを行う基礎が完成するので楽しみにしていてください。
本連載の更新情報は、管理人のタカハシ(@ntakahashi0505)さんのTwitterアカウントや、もちろん私のアカウント(@katsuhisa__)で配信していくので、もしよければ、フォローをお願いします!
書籍『Pythonでかなえる Excel作業効率化』発売のお知らせ
この連載が『Pythonでかなえる Excel作業効率化』という本になりました! Pythonの使い方の基本からだけでなく、Pythonでオフィス業務を効率化するために必要な知識をたくさん詰め込みました!ぜひお買い求めください。連載目次:PythonでExcelを操作するモジュールOpenPyXL
OpenPyXLというモジュールを使うことでPythonでExcelファイルを操作することができます。本シリーズでは初心者向けにExcelファイルの作業をPythonで自動化する方法をお伝えします。- PythonでExcel作業を自動化するOpenPyXLのはじめての使い方
- OpenPyXLで複数のセルの値を取得する方法
- OpenPyXLでExcelファイルの新規作成・保存を行う方法
- PythonでOpenPyXLを使ってExcelのシートを追加・削除する方法
- PythonでOpenPyXLでExcelのセルに値を入力する方法と編集する方法
- PythonでOpenPyXLを使いExcelのフォントを設定する方法
- PythonでOpenPyXLを使いExcelに数式を入力する方法
- PythonでOpenPyXLを使いExcelの行と列について色々な設定をする方法
- PythonでOpenPyXLを使いExcelの行と列を固定する方法
- PythonでOpenPyXLを使いExcelのグラフを作成する〜Chart関連オブジェクトの紹介〜
- PythonでOpenPyXLを使いExcelのグラフを作成する〜グラフのつくりかた編〜