範囲書き込みは「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 側に計算を任せられる

