Python 業務自動化 | Excel業務自動化:Excel基本操作 - 範囲書き込み

Python Python
スポンサーリンク

範囲書き込みは「Excelの表にまとめてデータを流し込み、テンプレートを一気に完成させる」ための最重要スキル

Excel業務自動化では、複数セルにまとめてデータを書き込む(範囲書き込み)ことが非常に多く登場します。
例えば次のような場面です。

  • 明細表に複数行・複数列のデータを一括で書き込みたい
  • テンプレートの表部分にデータを流し込みたい
  • Pythonで作ったリストや辞書をExcelに反映したい
  • pandas を使わず openpyxl だけで表を作りたい

Pythonでは openpyxl を使うことで、Excelの範囲に柔軟にデータを書き込めます。
初心者でも理解しやすいように、基本から実務テンプレートまで丁寧に解説します。


openpyxlで範囲に書き込む基本(最も実務向け)

二次元リストを Excel の範囲に書き込む

from openpyxl import load_workbook

wb = load_workbook("sample.xlsx")
ws = wb["Sheet1"]

data = [
    ["商品", "数量", "金額"],
    ["A", 10, 1000],
    ["B", 20, 2000],
    ["C", 30, 3000]
]

start_row = 1
start_col = 1

for r_idx, row in enumerate(data, start=start_row):
    for c_idx, value in enumerate(row, start=start_col):
        ws.cell(row=r_idx, column=c_idx, value=value)

wb.save("sample.xlsx")
Python

深掘りポイント

  • 二次元リスト(リストのリスト)をそのまま表として書き込める
  • enumerate(start=…) を使うことで開始位置を自由に指定できる
  • pandas を使わずに Excel 表を作りたいときに最適

append() を使って行単位で範囲書き込みする(最も簡単)

行ごとに追加して表を作る

ws.append(["商品", "数量", "金額"])
ws.append(["A", 10, 1000])
ws.append(["B", 20, 2000])
Python

深掘りポイント

  • append() は「1行追加」するメソッド
  • 表形式のデータを扱うときに非常に便利
  • 行追加と範囲書き込みを組み合わせると効率的

特定の範囲に上書きする(テンプレートに埋め込む)

A5 から書き込みたい場合

start_row = 5
start_col = 1

for r_idx, row in enumerate(data, start=start_row):
    for c_idx, value in enumerate(row, start=start_col):
        ws.cell(row=r_idx, column=c_idx, value=value)
Python

深掘りポイント

  • テンプレートの「明細部分」など、開始位置が決まっている場合に必須
  • 行番号・列番号で柔軟に制御できる

pandas と組み合わせて範囲書き込みする(実務で最強)

pandas の DataFrame を openpyxl で書き込む

import pandas as pd
from openpyxl import load_workbook

df = pd.read_excel("sales.xlsx")

wb = load_workbook("template.xlsx")
ws = wb["明細"]

start_row = 5
start_col = 1

for r_idx, row in enumerate(df.values, start=start_row):
    for c_idx, value in enumerate(row, start=start_col):
        ws.cell(row=r_idx, column=c_idx, value=value)

wb.save("report.xlsx")
Python

深掘りポイント

  • pandas でデータ加工 → openpyxl で書式付きテンプレートに書き込み
  • 実務で最も使われる組み合わせ
  • DataFrame の .values を使うと二次元配列として扱える

例題①:売上明細をテンプレートの表に流し込む

シナリオ

テンプレートの A5 から明細を書き込みたい。

from openpyxl import load_workbook

wb = load_workbook("template.xlsx")
ws = wb["明細"]

details = [
    ["A001", "商品A", 10, 1000],
    ["A002", "商品B", 20, 2000],
    ["A003", "商品C", 30, 3000]
]

for r_idx, row in enumerate(details, start=5):
    for c_idx, value in enumerate(row, start=1):
        ws.cell(row=r_idx, column=c_idx, value=value)

wb.save("report.xlsx")
Python

深掘りポイント

  • テンプレートの表部分にデータを流し込む典型的なパターン
  • 行番号・列番号を固定することで安定した書き込みができる

例題②:範囲に数式をまとめて書き込む

シナリオ

合計列(D列)に計算式を一括で入れたい。

for row in range(2, ws.max_row + 1):
    ws[f"D{row}"] = f"=B{row}*C{row}"
Python

深掘りポイント

  • 数式は文字列として書き込むだけでOK
  • Excel側で自動計算される
  • 計算列を自動生成する業務で非常に便利

例題③:範囲書き込みで入力フォームを自動生成する

シナリオ

A1〜C1 にヘッダー、A2〜C10 に空欄を作りたい。

headers = ["日付", "担当者", "内容"]
ws.append(headers)

for _ in range(9):
    ws.append(["", "", ""])

wb.save("form.xlsx")
Python

深掘りポイント

  • append() を使うとフォームの枠組みを簡単に作れる
  • 入力フォームの自動生成に最適

pathlib を使った読みやすい範囲書き込みコード

Pathオブジェクトで直感的に書ける

from pathlib import Path
from openpyxl import load_workbook

path = Path("sample.xlsx")
wb = load_workbook(path)
ws = wb.active

ws.append(["A", "B", "C"])
ws.append([1, 2, 3])

wb.save(path)
Python

メリット

  • パス結合が / で直感的
  • 大規模プロジェクトでも保守性が高い

範囲書き込みを業務で設計するときの視点

  • 二次元リストを書き込むと表を一気に作れる
  • append() は行追加に最適で、範囲書き込みと相性が良い
  • pandas と組み合わせると「加工 → 書き込み」が圧倒的に効率化
  • テンプレートの指定位置に書き込むとレポート自動化が完成する
  • 数式を範囲に書き込むことで Excel 側に計算を任せられる

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