【業務自動化】Chapter1-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:自動化ツールを.exe化して配布しよう
Chapter3:現場で使える便利な自動化ツールを4つ作ろう
Chapter4:Webスクレイピングでデータを自動で集めよう
Chapter5:自動化ツールを作ってお金を稼ごう

前回の記事ではPythonでExcelファイルを新しく作成したり、データを書き込んだりする方法を学んできました。

次のステップは「Excelからデータを読み込む」ことです。

Excelにすでに入力されている表やデータをPythonで取得できれば、集計や加工、レポート作成といった実務に直結する自動化が可能になります。

この記事では、openpyxlを使ってExcelのセルから値を取り出す基本を学び、シンプルなコードでデータを取得する流れを確認していきます。

あわせて読みたい
openpyxl使える関数・メソッド・クラス一覧【Excel自動化の基本リファレンス】
openpyxl使える関数・メソッド・クラス一覧【Excel自動化の基本リファレンス】

<<前のページ

業務自動化の記事一覧

次のページ>>

PythonでExcelのデータを読み込む方法

まずはExcelシートに入力されている特定のセルの値を取得する方法を見ていきます。

openpyxlを使えば、行番号と列番号を指定して簡単にセルのデータを読み取ることができます。

今回は実際にデータを読み込むためのExcelファイルが必要となりますので、まずそれを作成しましょう。

↓↓の「make_workbook1-3.py」をコピーして適切な場所(※)に保存し、実行してください。

そうするとデータが書き込まれたExcelファイルが生成されますので、それを使って学習をすすめましょう。

Q
make_workbook1-3.py
import pathlib
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment
from openpyxl.styles.colors import Color


def create_chapter1_3_workbook():
    file_path = pathlib.Path(__file__).parent / "workbooks"
    file_path.mkdir(exist_ok=True)

    save_path = file_path / "Chapter1-3.xlsx"

    workbook = Workbook()
    sheet = workbook.active
    sheet.title = "Sheet1"

    # 元ファイルに合わせた設定
    sheet.sheet_format.defaultRowHeight = 18.75
    sheet.sheet_format.defaultColWidth = 9
    sheet.column_dimensions["B"].width = 11.625
    sheet.column_dimensions["D"].width = 11.375

    # データ
    rows = [
        ["名前", "性別", "年齢", "年齢区分"],
        ["吉田 彩花", "女", 45, None],
        ["小林 翔太", "男", 21, None],
        ["長谷川 清", "男", 80, None],
        ["山田 大輔", "男", 40, None],
        ["佐藤 陽翔", "男", 1, None],
        ["渡辺 亮", "男", 50, None],
        ["伊藤 陽菜", "女", 12, None],
        ["木村 智子", "女", 75, None],
        ["鈴木 結衣", "女", 3, None],
        ["松本 健太", "男", 30, None],
        ["石井 誠", "男", 70, None],
        ["中村 莉子", "女", 18, None],
        ["高橋 悠真", "男", 6, None],
        ["田中 美月", "女", 9, None],
        ["岡田 隆", "男", 60, None],
        ["藤田 美穂", "女", 55, None],
        ["山本 大和", "男", 15, None],
        ["村上 幸子", "女", 65, None],
        ["佐々木 真由", "女", 35, None],
        ["加藤 愛美", "女", 25, None],
    ]

    # スタイル
    base_font = Font(name="游ゴシック", size=11)
    header_fill = PatternFill(
        patternType="solid",
        fgColor=Color(theme=5, tint=0.4)
    )
    thin = Side(style="thin", color=Color(auto=1))

    header_border = Border(left=thin, right=thin, top=thin, bottom=thin)
    first_row_border_bd = Border(left=thin, right=thin, bottom=thin)
    first_row_border_c = Border(left=thin, bottom=thin)
    body_border_bd = Border(left=thin, right=thin, top=thin, bottom=thin)
    body_border_c = Border(left=thin, top=thin, bottom=thin)
    body_border_e = Border(left=thin, right=thin, top=thin, bottom=thin)

    header_alignment = Alignment(vertical="center")
    body_alignment = Alignment(vertical="center", wrap_text=True)
    empty_alignment = Alignment(vertical="center")

    start_row = 2
    start_col = 2  # B列

    for row_index, row_values in enumerate(rows, start=start_row):
        for col_index, value in enumerate(row_values, start=start_col):
            cell = sheet.cell(row=row_index, column=col_index, value=value)
            cell.font = base_font

            if row_index == 2:
                cell.fill = header_fill
                cell.border = header_border
                cell.alignment = header_alignment
            else:
                if col_index in (2, 4):  # B列、D列
                    cell.border = first_row_border_bd if row_index == 3 else body_border_bd
                    cell.alignment = body_alignment
                elif col_index == 3:  # C列
                    cell.border = first_row_border_c if row_index == 3 else body_border_c
                    cell.alignment = body_alignment
                elif col_index == 5:  # E列
                    cell.border = body_border_e
                    cell.alignment = empty_alignment

    workbook.save(save_path)
    print(f"{save_path} を作成しました。")


if __name__ == "__main__":
    create_chapter1_3_workbook()
Q
(※)コードの保存場所について

コピーしたコードは以下の階層になるように保存して下さい。

この理由については、Chapter1-2 の記事で詳しく解説しています。

業務自動化学習/			  # 学習フォルダ
 ├── Chap1/				 # チャプター1の保存フォルダ
 │   ├── Chap1-3/		# チャプター1-3の保存フォルダ
 │   │   ├── Chapter1-3.py
 │   │   ├── make_workbook1-3.py # ☆ここに保存
 │   │   └── workbooks/
 │   │       └── Chapter1-3.xlsx 
勉強猫
勉強猫

make_workbook1-3.pyの中身については解説しません。

全てのChapterを終えるころには全部分かるようになってるはずだよ!

Excelファイルを読み込むサンプルコード

まずは実際に、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.xlsxの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)

このコードを実行すると、Chapter1-3.xlsx内の各データが順番に出力されます。

以下の解説に進む前に、このコードをコピーして実行してみましょう。

シートの範囲を取得する|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データを取得してみよう

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

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

前の節で作成したプログラム 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自動化学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

業務自動化の記事一覧

次のページ>>

よくある質問(FAQ)|Excelシートからデータを読み込もう

Q1. cell(row, column) で参照する行・列は「どこから数える」の? A1表記との対応は?

本記事の読み込み手順では、行番号・列番号は 1から始まる 前提で解説されています(例:2行目×2列目=B2相当)。

A1のようなセル表記に置き換えると、A→1、B→2…という対応になります。

まずは「番号は1始まり」「行が先・列が後」という基本を押さえれば、特定セルの値取得で迷いません。

Q2. シート全体を読み取るときの「範囲の決め方」は? min_row / max_row と空白セルの扱いの考え方を知りたい

実務では表全体を扱うことが多いため、シートに入力がある最小・最大の行列を基準に範囲を決めるのが定石です。

本記事でも、入力済みセルの最小/最大の行・列を見て走査範囲を組み立てる流れを示しています。

空白セルが途中に混じっても、「最小~最大」の外側に出なければ範囲内として処理されます。

なお、繰り返し処理では 上限に+1を足す という書き方が登場しますが、これは “上端も下端も含めて回す” ための典型的な考え方です。

Q3. どのシートが読み取り対象になる?「アクティブシート」とは何か、意図しないシートを読まないコツは?

本記事の基本手順では、ブックを開いた直後の「アクティブなシート」を対象に値を読み取っています。

アクティブシートとは “現在選択されているシート” のことで、ブック側の状態によって変わる点に注意が必要です。

学習段階ではまずアクティブシートで仕組みを理解し、実務で特定シートを確実に扱いたい場合は「どのシートを読むのか」を明示する設計に切り替えると、読み取り対象のブレを防げます。

<<前のページ

業務自動化の記事一覧

次のページ>>

記事URLをコピーしました