【業務自動化】チャプター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フォルダ内に保存してください。

Q
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のエクセルファイルの保存フォルダ
 │       ├── ・・・
【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

セルの値を取得する|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_rowmax_rowmin_columnmax_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文について復習しましょう。

あわせて読みたい
【Python】レッスン2-5:for文による繰り返し処理を理解しよう
【Python】レッスン2-5:for文による繰り返し処理を理解しよう

まとめ|セル単体からシート全体の読み込みまで

この記事では、openpyxlを使ってExcelシートからデータを読み込む方法を学びました。

  • 特定のセルの値を取得する方法
    • sheet.cell(行番号, 列番号).value を使えば、任意のセルの値を簡単に取得できる。
  • シート全体を走査してデータを読み込む方法
    • min_rowmax_rowmin_columnmax_column を利用してデータ範囲を特定し、ループで全セルを処理できる。

これらを組み合わせれば、Excelに入力された表やリストをそのままPythonで扱えるようになります。

実務の現場では、売上データや在庫リストなどを読み込んで自動的に集計・加工するケースに直結します。

次の記事では、この読み込んだデータを活用して、Excelへの書き込みやコピー&ペーストの自動化 へと進んでいきましょう。

練習問題|PythonでExcelデータを取得してみよう

今回学習した内容を復習する練習問題に挑戦しましょう。

【Python】勉強猫がノートパソコンに向かい、練習問題に挑戦する様子。記事内の休憩用イラスト

問題|条件に合うデータのみ表示しよう

前の節で作成したプログラム c1-3-2.py では、シート内のすべてのセルを順番に走査し、表示しました。

このコードを書き換えて、シートにあるデータの中から条件に合う行だけを取り出し、必要な情報を表示するプログラムを作りましょう。

以下の要件に従ってコードを完成させて下さい。

  • 元になるコードは c1-3-2.py を利用すること
  • 「性別」が「女」の行について、その「名前」だけを出力すること

ヒント|コードの構成と穴埋め問題化

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント① コードの構成を見る

正解のコードは上から順に以下のような構成となっています。

1.Excelファイルを開き、シートを使えるように準備する
 ・Excelを操作するには専用のライブラリを読み込む必要があります
 ・ファイルを指定するときは、プログラムと同じ場所からのパスを組み立てます
 ・開いたファイルの中で最初に表示されるシートを操作対象にします

2.シートのデータが入っている範囲を調べる
 ・シートから最初の行番号や列番号を取得します
 ・同じように最後の行番号や列番号も取得します
 ・この情報を使って、後でデータを順番に読み取ります

3.条件に合う行を探して名前を表示する
 ・データのある行を順番に繰り返し処理します
 ・特定の列から「名前」と「性別」を読み取ります
 ・if文で条件が一致したときだけ出力します

Q
ヒント② 穴埋め問題にする

以下のコードをコピーし、穴埋め部に適切なコードを書きこんで下さい。

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)

正解サンプルコードと詳細解説

例えば以下のようなプログラムが考えられます。

Q
正解コード例
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)
Q
正解コードの解説

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行目から順番にデータを読み取っています。
各行について「名前」と「性別」のセルを取り出し、性別が「女」の場合にだけ名前を画面に表示しています。
こうすることで、必要な条件に合うデータだけを取り出すことができます。

もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいExcel自動化学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

業務自動化の記事一覧

次のページ>>

記事URLをコピーしました