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()
PythonDay 32のまとめ
Day 32では、Excelデータ操作として、
- セル取得(番地・行列番号)で欲しいデータをピンポイントで取りに行く方法
- セル更新で「数量 × 単価 → 売上」のような計算結果を書き戻す方法
- 行・列操作で一覧データをまとめて処理し、合計などの集計を行う方法
- シート操作で、バックアップシートや集計シートを作り、業務っぽい構成に近づける方法
をステップバイステップで体験していただきました。
ここまで来ると、Excelを「人が手でいじるもの」から、 「Pythonが自動で処理するデータの入れ物」として扱う感覚が少し育っているはずです。 次のDayでは、このExcel操作をさらに発展させて、 より実務に近い「業務自動化シナリオ」に踏み込んでいきます。
