【業務自動化】チャプター1-3|Excelシートからデータを読み込もう
一つ前のページでは PythonでExcelファイルを作成する方法 について学習しました。
今回は Excelシートからデータを読み込む方法 について見ていきましょう。
Chapter1:PythonでExcelを操作しよう
・Chapter1-1:openpyxlとは何か|インストールと動作確認
・Chapter1-2:PythonでExcelファイルを作成しよう
・Chapter1-3:Excelシートからデータを読み込もう ◁今回はここ
・Chapter1-4:Excelシートにデータを書き込もう
・Chapter1-5:データを新規シートへ自動振り分けしよう
・Chapter1-6:簡単なExcel自動化を体験しよう
Chapter2:PyInstallerで自動化ツール(.exe)を作ろう
Chapter3:ファイル・フォルダを操作しよう
Chapter4:メール送信を自動化しよう
Chapter5:Webスクレイピング
前回の記事ではPythonでExcelファイルを新しく作成したり、データを書き込んだりする方法を学んできました。
次のステップは「Excelからデータを読み込む」ことです。
Excelにすでに入力されている表やデータをPythonで取得できれば、集計や加工、レポート作成といった実務に直結する自動化が可能になります。
この記事では、openpyxlを使ってExcelのセルから値を取り出す基本を学び、シンプルなコードでデータを取得する流れを確認していきます。
PythonでExcelを読み込む基本解説
まずはExcelシートに入力されている特定のセルの値を取得する方法を見ていきます。
openpyxlを使えば、行番号と列番号を指定して簡単にセルのデータを読み取ることができます。
今回は実際にデータを読み込むExcelファイルが必要となりますので、記事を読み進める前に↓↓のダウンロードリンクからファイルをダウンロードし、workbooksフォルダ内に保存してください。
- Excelファイルの保存場所について
-
ダウンロードしたExcelファイルは以下の階層になるように保存して下さい。
この理由については、Chapter1-2 の記事で詳しく解説しています。
Excel自動化学習 # 学習フォルダ ├── Chap1/ # チャプター1の保存フォルダ │ ├── app1-1.py │ ├── app1-2.py │ ├── ・・・ │ └── workbooks/ # チャプター1のエクセルファイルの保存フォルダ │ ├── sample1-1.xlsx │ ├── sample2-1.xlsx │ ├── ・・・ │ ├── Chap2/ # チャプター2の保存フォルダ │ ├── app2-1.py │ ├── ・・・ │ └── workbooks/ # チャプター2のエクセルファイルの保存フォルダ │ ├── ・・・
セルの値を取得する|cell()とvalueの基本
まずは実際に、Excelシートからセルの値を取り出すシンプルなコードを紹介します。
以下のサンプルプログラムでは、2行目・2列目のセルの値を取得して、画面に出力しています。
import openpyxl, pathlib # openpyxlとpathlibのインポート file_path = pathlib.Path(__file__).parent / "workbooks" # エクセルファイルの保存フォルダの相対パスを作成 book = openpyxl.load_workbook(file_path / "Chapter1-3.xlsx") # ワークブックの読み込み sheet = book.active # アクティブなシートを取得 print(sheet.cell(2, 2).value) # 2行目、2列目のセルの値を出力
このコードの1・2・5行目は前回のチャプターと同様です。
この部分に分からないところがある人は、Chapter1-2 の記事に戻って復習しましょう。
ワークブックを開く|load_workbook()関数
book = openpyxl.load_workbook(file_path / "Chapter1-3.xlsx") # ワークブックの読み込み
load_workbook()
関数 は既存の Excel ファイル(.xlsx)を読み込む関数です。
この部分ではPathlibライブラリでパスを指定したExcelファイルを読み込み、ワークブックオブジェクトとして変数bookに代入しています。
セルの値を読む|cell()メソッドとvalueプロパティの使い方
print(sheet.cell(2, 2).value) # sheet内の2行目2列目のセルの値を取得して出力
- cell(行番号, 列番号)メソッド :シート内の特定のセルを指定するメソッド
value
プロパティ :セルの中身を取得するプロパティ
すなわちこの例では「2行目・2列目」のセルの値を取得しています。
Chapter1-3.pyの2行目・2列目には「名前」という文字列が書き込まれているので、このコードを実行すると「名前」と出力されます。
シート全体を読み込む方法(行・列・範囲)
先ほどは特定のセルだけを指定して値を取得しましたが、実務では「表全体」や「シートに入力されているすべてのデータ」を読み込みたいケースが多くあります。
openpyxlでは、シートの最小行・最大行、最小列・最大列を確認しながらループ処理を行うことで、セルを順番に読み取ることが可能です。
これにより、Excelの表データをそのままPythonで扱えるようになります。
以下のサンプルでは、シートに入力されている範囲を自動的に判定し、すべてのセルの値を順番に表示しています。
import openpyxl, pathlib # openpyxlとpathlibのインポート file_path = pathlib.Path(__file__).parent / "workbooks" # エクセルファイルの保存フォルダの相対パスを作成 book = openpyxl.load_workbook(file_path / "Chapter1-3.xlsx") # ワークブックの読み込み sheet = book.active # アクティブなシートを取得 min_row = sheet.min_row # アクティブなシート内の、データが入力されている最小の行の番号を変数に代入 min_column = sheet.min_column # 最小の列の番号を変数に代入 max_row = sheet.max_row # 最大の行の番号を変数に代入 max_column = sheet.max_column # 最大の列の番号を変数に代入 for row_no in range(min_row, max_row+1): for col_no in range(min_column, max_column+1): print(sheet.cell(row_no, col_no).value)
5行目までの解説は省略します。
シートの範囲を取得する|min_row
/max_row
/min_column
/max_column
min_row = sheet.min_row # アクティブなシート内の、データが入力されている最小の行の番号を変数に代入 min_column = sheet.min_column # 最小の列の番号を変数に代入 max_row = sheet.max_row # 最大の行の番号を変数に代入 max_column = sheet.max_column # 最大の列の番号を変数に代入
min_row
/max_row
は、シート内の「最初の行」と「最後の行」を示します。min_column
/max_column
は、「最初の列」と「最後の列」を示します。- これにより、入力されているデータの範囲を自動的に特定できます。
二重ループでセルを走査する
for row_no in range(min_row, max_row+1): for col_no in range(min_column, max_column+1): print(sheet.cell(row_no, col_no).value)
- 行番号と列番号をループで回し、表全体を走査しています。
sheet.cell(row_no, col_no).value
で各セルの値を取得し、print
で表示しています。
max_row+1の「+1」の部分の意味は分かりますか?
分からない人はrange()関数を用いたfor文について復習しましょう。
まとめ|セル単体からシート全体の読み込みまで
この記事では、openpyxlを使ってExcelシートからデータを読み込む方法を学びました。
- 特定のセルの値を取得する方法
sheet.cell(行番号, 列番号).value
を使えば、任意のセルの値を簡単に取得できる。
- シート全体を走査してデータを読み込む方法
min_row
やmax_row
、min_column
やmax_column
を利用してデータ範囲を特定し、ループで全セルを処理できる。
これらを組み合わせれば、Excelに入力された表やリストをそのままPythonで扱えるようになります。
実務の現場では、売上データや在庫リストなどを読み込んで自動的に集計・加工するケースに直結します。
次の記事では、この読み込んだデータを活用して、Excelへの書き込みやコピー&ペーストの自動化 へと進んでいきましょう。
練習問題|PythonでExcelデータを取得してみよう
今回学習した内容を復習する練習問題に挑戦しましょう。
問題|条件に合うデータのみ表示しよう
前の節で作成したプログラム c1-3-2.py では、シート内のすべてのセルを順番に走査し、表示しました。
このコードを書き換えて、シートにあるデータの中から条件に合う行だけを取り出し、必要な情報を表示するプログラムを作りましょう。
以下の要件に従ってコードを完成させて下さい。
- 元になるコードは c1-3-2.py を利用すること
- 「性別」が「女」の行について、その「名前」だけを出力すること
ヒント|コードの構成と穴埋め問題化
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント① コードの構成を見る
-
正解のコードは上から順に以下のような構成となっています。
1.Excelファイルを開き、シートを使えるように準備する
・Excelを操作するには専用のライブラリを読み込む必要があります
・ファイルを指定するときは、プログラムと同じ場所からのパスを組み立てます
・開いたファイルの中で最初に表示されるシートを操作対象にします2.シートのデータが入っている範囲を調べる
・シートから最初の行番号や列番号を取得します
・同じように最後の行番号や列番号も取得します
・この情報を使って、後でデータを順番に読み取ります3.条件に合う行を探して名前を表示する
・データのある行を順番に繰り返し処理します
・特定の列から「名前」と「性別」を読み取ります
・if文で条件が一致したときだけ出力します
- ヒント② 穴埋め問題にする
-
以下のコードをコピーし、穴埋め部に適切なコードを書きこんで下さい。
import openpyxl, pathlib file_path = pathlib.Path(__file__).parent / "'''(穴埋め)'''" book = openpyxl.load_workbook(file_path / "Chapter1-3.xlsx") sheet = '''(穴埋め)''' # データが入力されている範囲を取得 '''(穴埋め)行と列の最小値・最大値を取得するコードを書く ''' for row_no in range(2, max_row + 1): name = sheet.cell(row_no, '''(穴埋め)''').value # 2列目 → 名前 gender = sheet.cell(row_no, 3).value # 3列目 → 性別 if '''(穴埋め)''' == "女": print(name)
正解サンプルコードと詳細解説
例えば以下のようなプログラムが考えられます。
- 正解コード例
-
import openpyxl, pathlib file_path = pathlib.Path(__file__).parent / "workbooks" book = openpyxl.load_workbook(file_path / "Chapter1-3.xlsx") sheet = book.active # データが入力されている範囲を取得 min_row = sheet.min_row min_column = sheet.min_column max_row = sheet.max_row max_column = sheet.max_column for row_no in range(2, max_row + 1): name = sheet.cell(row_no, 2).value # 2列目 → 名前 gender = sheet.cell(row_no, 3).value # 3列目 → 性別 if gender == "女": print(name)
- 正解コードの解説
-
Excelファイルを開き、シートを使えるように準備する
import openpyxl, pathlib file_path = pathlib.Path(__file__).parent / "workbooks" book = openpyxl.load_workbook(file_path / "Chapter1-3.xlsx") sheet = book.active
まずはPythonからExcelファイルを扱えるようにするために必要な準備をしています。
Excelを操作するためのライブラリを読み込み、プログラムと同じフォルダの中にあるExcelファイルを開いて、その中の一番最初のシートを操作対象に設定しています。
これで、後の処理でシートのデータを読み取れるようになります。シートのデータが入っている範囲を調べる
# データが入力されている範囲を取得 min_row = sheet.min_row min_column = sheet.min_column max_row = sheet.max_row max_column = sheet.max_column
ここでは、シートのどこからどこまでにデータが入っているのかを確認しています。
行や列の最小の位置と最大の位置を調べて、後の処理でどこまで読み取ればいいかを決めるために使います。
こうすることで、データが何行何列あっても柔軟に対応できます。条件に合う行を探して名前を表示する
for row_no in range(2, max_row + 1): name = sheet.cell(row_no, 2).value # 2列目 → 名前 gender = sheet.cell(row_no, 3).value # 3列目 → 性別 if gender == "女": print(name)
ここではシートの2行目から順番にデータを読み取っています。
各行について「名前」と「性別」のセルを取り出し、性別が「女」の場合にだけ名前を画面に表示しています。
こうすることで、必要な条件に合うデータだけを取り出すことができます。