基礎から学ぶPython入門 90日コース | 業務自動化 - Day 32:Excelデータ操作

Python 90日で身につけるPython
スポンサーリンク
スポンサーリンク

Day 32:Excelデータ操作で「人の手作業」をコードに置き換える

Day 32では、前回のExcel入門を一歩進めて、 「既存のExcelデータを読み書きし、行・列・シートを自在に扱う」 ことを目標にします。

キーワードは次の4つです。

  • セル取得
  • セル更新
  • 行・列操作
  • シート操作

業務現場でよくある「毎日同じExcelを開いて、同じ場所を直して、同じ集計をする」という作業を、 少しずつPythonに肩代わりさせるイメージで読み進めていただければと思います。

セル取得:欲しいデータをピンポイントで取りに行く

まずはサンプルExcelを用意する

説明を分かりやすくするために、まずはサンプルのExcelファイルを作ります。

# day32_setup.py
from openpyxl import Workbook

def create_sample_excel():
    """Day 32用のサンプルExcelファイルを作成する関数です。"""
    wb = Workbook()
    ws = wb.active
    ws.title = "Sales"

    # ヘッダー行
    ws["A1"] = "商品名"
    ws["B1"] = "数量"
    ws["C1"] = "単価"
    ws["D1"] = "売上"

    # データ行
    ws["A2"] = "りんご"
    ws["B2"] = 10
    ws["C2"] = 120

    ws["A3"] = "みかん"
    ws["B3"] = 8
    ws["C3"] = 100

    ws["A4"] = "ぶどう"
    ws["B4"] = 5
    ws["C4"] = 300

    wb.save("sales.xlsx")
    print("sales.xlsx を作成しました。")


if __name__ == "__main__":
    create_sample_excel()
Python

このファイルを使って、セル取得・更新などを行っていきます。

セルを番地で取得する(”A2″ など)

from openpyxl import load_workbook

def get_cells_by_address():
    """セル番地で値を取得する基本例です。"""
    wb = load_workbook("sales.xlsx")
    ws = wb["Sales"]

    # A2セル(商品名)を取得します。
    product = ws["A2"].value

    # B2セル(数量)を取得します。
    quantity = ws["B2"].value

    # C2セル(単価)を取得します。
    unit_price = ws["C2"].value

    print(f"商品: {product}, 数量: {quantity}, 単価: {unit_price}")


if __name__ == "__main__":
    get_cells_by_address()
Python

ここでのポイントは、

  • ws["A2"].value のように、セル番地で値を取り出せること
  • 「Excelで目で見ている位置」と同じ感覚で指定できるため、初心者にも分かりやすいこと

です。

行・列番号でセルを取得する(cell(row, column))

from openpyxl import load_workbook

def get_cells_by_coordinates():
    """行番号・列番号でセルを取得する例です。"""
    wb = load_workbook("sales.xlsx")
    ws = wb["Sales"]

    # 2行1列(A2)を取得します。
    product = ws.cell(row=2, column=1).value

    # 2行2列(B2)を取得します。
    quantity = ws.cell(row=2, column=2).value

    # 2行3列(C2)を取得します。
    unit_price = ws.cell(row=2, column=3).value

    print(f"商品: {product}, 数量: {quantity}, 単価: {unit_price}")


if __name__ == "__main__":
    get_cells_by_coordinates()
Python

ここでのポイントは、

  • ws.cell(row=行番号, column=列番号) という形式でセルにアクセスできること
  • 行・列をループで回すときに便利な書き方であること

です。

セル更新:既存のデータを計算して書き戻す

売上列(D列)を自動計算して書き込む

「数量 × 単価」を計算して、売上列に書き込む処理を作ってみます。

from openpyxl import load_workbook

def update_sales_amount():
    """数量と単価から売上を計算してセルを更新する例です。"""
    wb = load_workbook("sales.xlsx")
    ws = wb["Sales"]

    # 2行目から4行目までのデータを処理します。
    for row in range(2, 5):
        quantity = ws.cell(row=row, column=2).value  # B列(数量)
        unit_price = ws.cell(row=row, column=3).value  # C列(単価)

        if quantity is None or unit_price is None:
            continue  # データがない場合はスキップします。

        sales_amount = quantity * unit_price  # 売上 = 数量 × 単価

        # D列(売上)に書き込みます。
        ws.cell(row=row, column=4, value=sales_amount)

        print(f"{row}行目: 数量={quantity}, 単価={unit_price}, 売上={sales_amount}")

    wb.save("sales_updated.xlsx")
    print("sales_updated.xlsx を保存しました。")


if __name__ == "__main__":
    update_sales_amount()
Python

ここでの重要ポイントは、

  • cell() を使って行・列をループしながら処理していること
  • 計算結果をそのままセルに書き込んでいること
  • 元のファイルとは別名で保存しているため、元データを壊さないこと

です。

行・列操作:まとめて処理する力を身につける

行をループして一覧表示する

from openpyxl import load_workbook

def print_all_rows():
    """Salesシートの全データ行を表示する例です。"""
    wb = load_workbook("sales_updated.xlsx")
    ws = wb["Sales"]

    print("=== 売上一覧 ===")
    # 2行目以降を対象にします(1行目はヘッダー)。
    for row in ws.iter_rows(min_row=2, values_only=True):
        product, quantity, unit_price, sales_amount = row
        print(f"商品: {product}, 数量: {quantity}, 単価: {unit_price}, 売上: {sales_amount}")


if __name__ == "__main__":
    print_all_rows()
Python

ここでのポイントは、

  • ws.iter_rows(min_row=2, values_only=True) で「2行目以降の行」をまとめて取得していること
  • values_only=True によって、Cell オブジェクトではなく「値だけ」が渡されること
  • 行ごとに処理することで、「表形式データをまとめて扱う」形になっていること

です。

列をループして合計を計算する(売上合計)

from openpyxl import load_workbook

def calculate_total_sales():
    """売上列(D列)の合計を計算する例です。"""
    wb = load_workbook("sales_updated.xlsx")
    ws = wb["Sales"]

    total = 0

    # 2行目から4行目までのD列を合計します。
    for row in range(2, 5):
        value = ws.cell(row=row, column=4).value  # D列(売上)
        if isinstance(value, (int, float)):
            total += value

    # 合計を5行目のD列に書き込みます。
    ws["C5"] = "合計"
    ws["D5"] = total

    wb.save("sales_total.xlsx")
    print(f"売上合計: {total} を sales_total.xlsx に書き込みました。")


if __name__ == "__main__":
    calculate_total_sales()
Python

ここでのポイントは、

  • 列(D列)を対象にして、行をループしていること
  • 合計値を新しい行に書き込んでいること
  • 「人がExcelでやっている集計作業」をそのままコードに置き換えていること

です。

シート操作:複数シートを使って業務っぽくする

シートをコピーして「バックアップ」を作る

from openpyxl import load_workbook

def duplicate_sheet():
    """Salesシートをコピーしてバックアップシートを作る例です。"""
    wb = load_workbook("sales_total.xlsx")
    ws = wb["Sales"]

    # シートをコピーします。
    ws_backup = wb.copy_worksheet(ws)
    ws_backup.title = "SalesBackup"

    wb.save("sales_with_backup.xlsx")
    print("Salesシートのバックアップを作成しました。")


if __name__ == "__main__":
    duplicate_sheet()
Python

ここでのポイントは、

  • wb.copy_worksheet(ws) でシートを丸ごとコピーできること
  • バックアップ用のシートを作ることで、「元データを残しつつ加工する」スタイルに近づくこと

です。

新しいシートに集計結果だけをまとめる

from openpyxl import load_workbook

def create_summary_sheet():
    """集計結果を新しいシートにまとめる例です。"""
    wb = load_workbook("sales_total.xlsx")
    ws_sales = wb["Sales"]

    # 新しいシートを作成します。
    ws_summary = wb.create_sheet(title="Summary")

    # ヘッダー行
    ws_summary["A1"] = "項目"
    ws_summary["B1"] = "値"

    # 売上合計をSalesシートから取得します(D5セル)。
    total_sales = ws_sales["D5"].value

    # Summaryシートに書き込みます。
    ws_summary["A2"] = "売上合計"
    ws_summary["B2"] = total_sales

    wb.save("sales_with_summary.xlsx")
    print("Summaryシートを作成しました。")


if __name__ == "__main__":
    create_summary_sheet()
Python

ここでのポイントは、

  • 元データシート(Sales)から集計結果を取り出し、別シート(Summary)にまとめていること
  • 「入力用シート」と「集計用シート」を分ける、業務でよくある構成に近づいていること

です。

Day 32ミニテンプレート:Excelデータ操作まとめスクリプト

最後に、Day 32で学んだ内容を一通り試せるテンプレートを示します。

# day32_excel_data.py
from openpyxl import Workbook, load_workbook


def setup():
    wb = Workbook()
    ws = wb.active
    ws.title = "Sales"

    ws["A1"] = "商品名"
    ws["B1"] = "数量"
    ws["C1"] = "単価"
    ws["D1"] = "売上"

    ws["A2"] = "りんご"; ws["B2"] = 10; ws["C2"] = 120
    ws["A3"] = "みかん"; ws["B3"] = 8;  ws["C3"] = 100
    ws["A4"] = "ぶどう"; ws["B4"] = 5;  ws["C4"] = 300

    wb.save("sales.xlsx")
    print("sales.xlsx を作成しました。")


def update_sales():
    wb = load_workbook("sales.xlsx")
    ws = wb["Sales"]

    for row in range(2, 5):
        q = ws.cell(row=row, column=2).value
        p = ws.cell(row=row, column=3).value
        if q is None or p is None:
            continue
        ws.cell(row=row, column=4, value=q * p)

    wb.save("sales_updated.xlsx")
    print("sales_updated.xlsx を保存しました。")


def add_total_and_summary():
    wb = load_workbook("sales_updated.xlsx")
    ws_sales = wb["Sales"]

    total = 0
    for row in range(2, 5):
        v = ws_sales.cell(row=row, column=4).value
        if isinstance(v, (int, float)):
            total += v

    ws_sales["C5"] = "合計"
    ws_sales["D5"] = total

    ws_summary = wb.create_sheet(title="Summary")
    ws_summary["A1"] = "項目"
    ws_summary["B1"] = "値"
    ws_summary["A2"] = "売上合計"
    ws_summary["B2"] = total

    wb.save("sales_final.xlsx")
    print("sales_final.xlsx を保存しました。")


def main():
    setup()
    update_sales()
    add_total_and_summary()


if __name__ == "__main__":
    main()
Python

Day 32のまとめ

Day 32では、Excelデータ操作として、

  • セル取得(番地・行列番号)で欲しいデータをピンポイントで取りに行く方法
  • セル更新で「数量 × 単価 → 売上」のような計算結果を書き戻す方法
  • 行・列操作で一覧データをまとめて処理し、合計などの集計を行う方法
  • シート操作で、バックアップシートや集計シートを作り、業務っぽい構成に近づける方法

をステップバイステップで体験していただきました。

ここまで来ると、Excelを「人が手でいじるもの」から、 「Pythonが自動で処理するデータの入れ物」として扱う感覚が少し育っているはずです。 次のDayでは、このExcel操作をさらに発展させて、 より実務に近い「業務自動化シナリオ」に踏み込んでいきます。

タイトルとURLをコピーしました