ソニックWord・Excelレポートを自動で作る|月次報告書から解放される
「毎月の報告書を、データを差し替えながら手作業で作っている」「同じフォーマットのレポートを、何十人分も作っている」
そんな業務、ありませんか?
私自身、事務職時代に「毎月の月次報告書」を手作業で作っていました。前月のWordファイルをコピーして、数字を差し替えて、グラフを貼り直して、日付を直して……毎月3時間以上かかる定型業務でした。
そんな業務を変えたのが、Pythonでのレポート自動生成でした。データさえあれば、Word・Excelレポートが「ボタン1つ」で完成します。
この記事では、Pythonで定型レポートを自動生成する方法を、コピペで使えるコード付きで完全解説します。
こんな方におすすめ
- 毎月の定型報告書を手作業で作っている事務職の方
- 同じフォーマットの書類を大量に作るバックオフィスの方
- Python業務自動化を実務レベルで使いたい方
第1章|なぜ定型レポートの自動化が業務を変えるのか
定型レポート業務のリアル
事務職・経理職には「毎月・毎週、決まったフォーマットで作る書類」が山ほどあります。
- 月次売上報告書
- 部署別の予算実績レポート
- 顧客向けの定期報告書
- 勤怠集計レポート
- 在庫状況レポート
これらは「データは毎回変わるが、フォーマットは同じ」という特徴があります。だからこそ、**自動化に最適**なのです。
Before/After|レポート自動化の威力
| 業務 | Before(手作業) | After(Python自動化) |
|---|---|---|
| 月次報告書作成 | 3時間 | 10秒 |
| 50人分の個別レポート | 丸1日 | 1分 |
| 数字の転記ミス | 発生 | ゼロ |
| グラフの更新 | 手で貼り直し | 自動生成 |
第2章|環境準備(uv環境前提)
この記事は、uv環境でPythonを使う前提で進めます。まだuvをインストールしていない方は、別記事「【完全版】uv入門」をご覧ください。
必要なライブラリ
# Word文書とExcel文書を扱うライブラリ
uv add python-docx openpyxl pandas matplotlib| ライブラリ | 役割 |
|---|---|
| python-docx | Word文書(.docx)の生成・編集 |
| openpyxl | Excel文書(.xlsx)の生成・編集 |
| pandas | レポート元データの読み込み・集計 |
| matplotlib | レポートに埋め込むグラフ生成 |
※python-docxはインポート時は「import docx」と書きます(パッケージ名とインポート名が違う点に注意)。
第3章|基本|PythonでWord文書を作る
最小のWord文書生成
# python-docxはimport時「docx」と書く
from docx import Document
# 新しいWord文書を作成
doc = Document()
# 見出しを追加
doc.add_heading("月次売上報告書", level=0)
# 段落を追加
doc.add_paragraph("2026年6月度の売上実績をご報告いたします。")
# 小見出しと本文
doc.add_heading("1. 売上サマリ", level=1)
doc.add_paragraph("当月の売上は目標を達成しました。")
# 保存
doc.save("月次報告書.docx")
print("Word文書を作成しました")よく使う要素
from docx import Document
from docx.shared import Pt, RGBColor
doc = Document()
# 見出しレベル(0が一番大きい)
doc.add_heading("タイトル", level=0)
doc.add_heading("大見出し", level=1)
doc.add_heading("小見出し", level=2)
# 段落と書式
p = doc.add_paragraph("通常のテキスト。")
run = p.add_run("ここは太字。")
run.bold = True
# 箇条書き
doc.add_paragraph("項目1", style="List Bullet")
doc.add_paragraph("項目2", style="List Bullet")
# 番号付きリスト
doc.add_paragraph("手順1", style="List Number")
doc.add_paragraph("手順2", style="List Number")
doc.save("サンプル.docx")

第4章|データを差し込んだWordレポート
テーブル(表)を挿入する
from docx import Document
doc = Document()
doc.add_heading("店舗別売上", level=1)
# データ(実務ではpandasやCSVから取得)
data = [
["店舗", "売上", "前月比"],
["東京店", "1,500,000", "+12%"],
["大阪店", "1,200,000", "+8%"],
["名古屋店", "900,000", "-3%"],
]
# 行数×列数の表を作成
table = doc.add_table(rows=len(data), cols=len(data[0]))
table.style = "Light Grid Accent 1" # 表のスタイル
# データを流し込む
for row_idx, row_data in enumerate(data):
for col_idx, cell_value in enumerate(row_data):
table.cell(row_idx, col_idx).text = str(cell_value)
doc.save("売上表レポート.docx")
print("表付きレポートを作成しました")pandasデータから自動で表を作る
from docx import Document
import pandas as pd
# Excelデータを読み込み
df = pd.read_excel("売上データ.xlsx")
# 店舗別に集計
summary = df.groupby("店舗")["売上"].sum().reset_index()
doc = Document()
doc.add_heading("月次売上報告書", level=0)
doc.add_paragraph(f"集計期間:2026年6月")
doc.add_heading("店舗別売上", level=1)
# ヘッダー+データ行の表を作成
table = doc.add_table(rows=1, cols=len(summary.columns))
table.style = "Light Grid Accent 1"
# ヘッダー行
hdr = table.rows[0].cells
for i, col in enumerate(summary.columns):
hdr[i].text = str(col)
# データ行を追加
for _, row in summary.iterrows():
cells = table.add_row().cells
for i, value in enumerate(row):
# 数値は3桁区切りに整形
if isinstance(value, (int, float)):
cells[i].text = f"{value:,.0f}"
else:
cells[i].text = str(value)
doc.save("月次売上報告書.docx")
print("pandasデータからレポートを生成しました")グラフを埋め込む
from docx import Document
from docx.shared import Inches
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
# 日本語フォント設定(必須)
matplotlib.rcParams["font.family"] = "Meiryo"
# データ
df = pd.DataFrame({
"店舗": ["東京店", "大阪店", "名古屋店"],
"売上": [1500000, 1200000, 900000]
})
# グラフを作成して画像保存
plt.figure(figsize=(6, 4))
plt.bar(df["店舗"], df["売上"], color="#0066ff")
plt.title("店舗別売上")
plt.ylabel("売上(円)")
plt.tight_layout()
plt.savefig("売上グラフ.png", dpi=150)
plt.close()
# Word文書にグラフ画像を埋め込む
doc = Document()
doc.add_heading("売上レポート", level=0)
doc.add_paragraph("店舗別の売上をグラフで示します。")
doc.add_picture("売上グラフ.png", width=Inches(5.5))
doc.save("グラフ付きレポート.docx")
print("グラフ付きレポートを作成しました")第5章|Excelレポートの自動生成(表・グラフ付き)
openpyxlでExcelレポート
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.chart import BarChart, Reference
# 新しいワークブックを作成
wb = Workbook()
ws = wb.active
ws.title = "売上レポート"
# タイトル
ws["A1"] = "月次売上報告書"
ws["A1"].font = Font(size=16, bold=True, color="0066FF")
# ヘッダー行
headers = ["店舗", "売上", "前月比"]
for col, header in enumerate(headers, start=1):
cell = ws.cell(row=3, column=col, value=header)
cell.font = Font(bold=True, color="FFFFFF")
cell.fill = PatternFill("solid", fgColor="0066FF")
cell.alignment = Alignment(horizontal="center")
# データ行
data = [
["東京店", 1500000, "+12%"],
["大阪店", 1200000, "+8%"],
["名古屋店", 900000, "-3%"],
]
for row_idx, row_data in enumerate(data, start=4):
for col_idx, value in enumerate(row_data, start=1):
ws.cell(row=row_idx, column=col_idx, value=value)
# 売上列を3桁区切りに
for row in range(4, 4 + len(data)):
ws.cell(row=row, column=2).number_format = "#,##0"
# 列幅を調整
ws.column_dimensions["A"].width = 15
ws.column_dimensions["B"].width = 15
ws.column_dimensions["C"].width = 10
wb.save("Excelレポート.xlsx")
print("Excelレポートを作成しました")Excelにグラフを追加
from openpyxl.chart import BarChart, Reference
# (前のコードの続き)
# 棒グラフを作成
chart = BarChart()
chart.title = "店舗別売上"
chart.type = "col"
# データ範囲を指定(売上列)
data_ref = Reference(ws, min_col=2, min_row=3, max_row=3 + len(data))
# カテゴリ(店舗名)
cats_ref = Reference(ws, min_col=1, min_row=4, max_row=3 + len(data))
chart.add_data(data_ref, titles_from_data=True)
chart.set_categories(cats_ref)
# グラフをシートに配置(E3セルの位置)
ws.add_chart(chart, "E3")
wb.save("Excelレポート_グラフ付き.xlsx")
print("グラフ付きExcelレポートを作成しました")※openpyxlのグラフは「Excelネイティブのグラフ」として埋め込まれるため、Excelで開いた後もデータ編集に追従します。
第6章|テンプレートを使った差し込み
既存のWordテンプレートに差し込む
「会社で決まったWordテンプレートがある」場合は、テンプレートを読み込んで、特定の文字を置換する方法が便利です。
from docx import Document
# テンプレートを読み込む
# テンプレ内に {{会社名}} {{月}} {{売上}} などの目印を入れておく
doc = Document("報告書テンプレート.docx")
# 置換する値
replacements = {
"{{会社名}}": "株式会社サンプル",
"{{月}}": "2026年6月",
"{{売上}}": "3,600,000円",
"{{担当者}}": "ソニック",
}
# 全段落をチェックして置換
for para in doc.paragraphs:
for key, value in replacements.items():
if key in para.text:
for run in para.runs:
if key in run.text:
run.text = run.text.replace(key, value)
# 表の中のテキストも置換
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
for key, value in replacements.items():
if key in cell.text:
cell.text = cell.text.replace(key, value)
doc.save("報告書_2026年6月.docx")
print("テンプレートから報告書を生成しました")docxtplを使うとさらに簡単
「python-docx-template(docxtpl)」を使うと、HTMLのテンプレートのような感覚で差し込みができます。
# uv add docxtpl
from docxtpl import DocxTemplate
# テンプレートを読み込む(テンプレ内に {{ company }} のように記述)
doc = DocxTemplate("テンプレート.docx")
# 差し込むデータ
context = {
"company": "株式会社サンプル",
"month": "2026年6月",
"sales": "3,600,000",
"items": [
{"name": "東京店", "value": "1,500,000"},
{"name": "大阪店", "value": "1,200,000"},
]
}
# 差し込んで保存
doc.render(context)
doc.save("報告書_完成.docx")
print("docxtplで報告書を生成しました")※docxtplはテンプレ内で {% for item in items %} のようなループも書けるため、明細行が可変のレポートに最適です。
第7章|実務スクリプト|月次レポート一括生成
シナリオ
「複数店舗それぞれの月次レポートを、データから一括生成する」完成スクリプト。
「売上データ.xlsx」(例)
| 日付 | 店舗 | 売上 |
|---|---|---|
| 2026-06-01 | 横浜店 | 244,772 |
| 2026-06-02 | 横浜店 | 267,764 |
| 2026-06-03 | 横浜店 | 258,051 |
| 2026-06-04 | 横浜店 | 178,579 |
| 2026-06-05 | 横浜店 | 149,963 |
| 2026-06-06 | 横浜店 | 191,134 |
| 2026-06-07 | 横浜店 | 184,201 |
| 2026-06-08 | 横浜店 | 175,954 |
| 2026-06-09 | 横浜店 | 282,302 |
| 2026-06-10 | 横浜店 | 272,634 |
| 2026-06-11 | 横浜店 | 191,021 |
| 2026-06-12 | 横浜店 | 240,533 |
| 2026-06-13 | 横浜店 | 202,783 |
| 2026-06-14 | 横浜店 | 278,181 |
| 2026-06-15 | 横浜店 | 211,969 |
完成スクリプト
"""
月次レポート一括生成バッチ
- Excelデータを読み込む
- 店舗ごとにWordレポートを生成
- グラフも自動で埋め込む
"""
from docx import Document
from docx.shared import Inches, Pt, RGBColor
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import os
from datetime import datetime
# 日本語フォント設定
matplotlib.rcParams["font.family"] = "Meiryo"
# === 設定 ===
DATA_PATH = "売上データ.xlsx"
OUTPUT_FOLDER = f"月次レポート_{datetime.now().strftime('%Y%m')}"
os.makedirs(OUTPUT_FOLDER, exist_ok=True)
# === データ読み込み ===
df = pd.read_excel(DATA_PATH)
# === 店舗ごとにレポート生成 ===
for store in df["店舗"].unique():
# その店舗のデータだけ抽出
store_data = df[df["店舗"] == store]
total = store_data["売上"].sum()
# --- グラフ生成 ---
plt.figure(figsize=(6, 4))
daily = store_data.groupby("日付")["売上"].sum()
plt.plot(daily.index, daily.values, marker="o", color="#0066ff")
plt.title(f"{store} 日別売上推移")
plt.xticks(rotation=45)
plt.tight_layout()
graph_path = f"{OUTPUT_FOLDER}/{store}_グラフ.png"
plt.savefig(graph_path, dpi=150)
plt.close()
# --- Word文書生成 ---
doc = Document()
doc.add_heading(f"{store} 月次売上報告書", level=0)
doc.add_paragraph(f"発行日:{datetime.now().strftime('%Y年%m月%d日')}")
doc.add_paragraph(f"対象店舗:{store}")
doc.add_heading("1. 売上サマリ", level=1)
doc.add_paragraph(f"当月の総売上は {total:,.0f} 円でした。")
doc.add_heading("2. 売上推移グラフ", level=1)
doc.add_picture(graph_path, width=Inches(5.5))
# 保存
output_file = f"{OUTPUT_FOLDER}/{store}_月次報告書.docx"
doc.save(output_file)
print(f"生成:{output_file}")
print(f"\n{df['店舗'].nunique()}店舗のレポートを生成しました")

このスクリプトでできること
- Excelデータから店舗ごとのレポートを自動生成
- 各店舗の売上推移グラフを自動で作成・埋め込み
- 発行日・店舗名を自動で差し込み
- 店舗の数だけWordファイルを一括出力
50店舗あっても、実行ボタンを押すだけ。1分で50個のレポートが完成します。
第8章|つまずき対処&まとめ
よくあるトラブル
トラブル1:import docx でエラーが出る
原因:
パッケージ名は「python-docx」だが、インポート名は「docx」。間違えやすいポイント。
対処:
# インストール
uv add python-docx
# インポート(docxと書く)
from docx import Documentトラブル2:グラフの日本語が文字化け
対処:
import matplotlib
matplotlib.rcParams["font.family"] = "Meiryo" # Windows
# matplotlib.rcParams["font.family"] = "Hiragino Sans" # Macトラブル3:テンプレートの置換が効かない
原因:
Wordでは1つの段落が複数の「run」に分割されることがあり、目印({{会社名}})が途中で分断される。
対処:
docxtplライブラリを使うと、この問題を回避できます。複雑な差し込みにはdocxtplを推奨。
トラブル4:Excelのグラフが表示されない
対処:
Referenceの範囲指定(min_row, max_row)が正しいか確認。ヘッダー行を含めるかどうかで titles_from_data の指定が変わります。
この記事のまとめ
- 定型レポートはデータが変わってもフォーマットが同じ → 自動化に最適
- python-docxでWord、openpyxlでExcelレポートを生成
- pandasデータから表を自動作成、matplotlibでグラフ埋め込み
- テンプレート差し込みはdocxtplが便利
- 一括生成スクリプトで、50店舗のレポートも1分で完成
FAQ
次にやるべき3つの行動
- **今すぐ**:自分が毎月作っている「定型レポート」をリストアップ
- **今日中**:第3章の最小コードで、初めてのWord文書を生成してみる
- **今週中**:自分のデータで、表・グラフ付きレポートを1本自動生成する
月3時間のレポート作成が、ボタン1つに。空いた時間を、本当に価値ある仕事に使いましょう。
レポート自動化で、毎月の業務が変わる
月次報告書・顧客レポート・集計資料――定型のレポート業務は、Pythonですべて自動化できます。
データさえ整っていれば、レポートは「生成するもの」になります。「毎月の作業」から解放されて、分析や改善といった本来の価値ある仕事に集中しましょう。
最新の解説記事は、新着記事から順次公開しています。X(旧Twitter)でも更新情報を発信していますので、ぜひフォローしてください。
この記事を書いた人
ソニック|バックオフィス出身の業務効率化ブロガー。事務職時代に毎月3時間かけていた月次報告書作成を、Pythonで自動化した実体験あり。現在のデータサイエンス業務でも、クライアント向けレポートの自動生成にPythonを活用中。リアルな実体験をもとにしたノウハウを発信中。


コメント