【完全ガイド】Pythonで定型レポートを自動生成

ソニック

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-docxWord文書(.docx)の生成・編集
openpyxlExcel文書(.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 の指定が変わります。

この記事のまとめ

  1. 定型レポートはデータが変わってもフォーマットが同じ → 自動化に最適
  2. python-docxでWord、openpyxlでExcelレポートを生成
  3. pandasデータから表を自動作成、matplotlibでグラフ埋め込み
  4. テンプレート差し込みはdocxtplが便利
  5. 一括生成スクリプトで、50店舗のレポートも1分で完成

FAQ

Q1. WordとExcel、どちらでレポートを作るべき?

文章中心の報告書ならWord(python-docx)、数字・表中心ならExcel(openpyxl)が向いています。グラフや表を多用するなら、どちらでも対応可能です。

Q2. PDFで出力したい

別記事「Pythonで請求書PDFを自動生成」で解説したreportlabやweasyprintを使うか、生成したWord/ExcelをLibreOfficeのコマンドラインでPDF変換する方法があります。

Q3. 既存の凝ったデザインのテンプレを使いたい

docxtplがおすすめです。会社の既存テンプレに {{ }} の目印を入れるだけで、デザインを保ったまま差し込みできます。

Q4. グラフのデザインをもっと綺麗にしたい

matplotlibの代わりにseabornを使うと、より洗練されたグラフになります。当ブログの「seabornで統計グラフを作る」記事を参照してください。

Q5. メール送信まで自動化したい

技術的には可能ですが、メール送信は環境依存(SMTP設定・セキュリティ)が複雑なため、まずはレポート生成までを自動化し、送信は手動にするのが安全です。

次にやるべき3つの行動

  • **今すぐ**:自分が毎月作っている「定型レポート」をリストアップ
  • **今日中**:第3章の最小コードで、初めてのWord文書を生成してみる
  • **今週中**:自分のデータで、表・グラフ付きレポートを1本自動生成する

月3時間のレポート作成が、ボタン1つに。空いた時間を、本当に価値ある仕事に使いましょう。

レポート自動化で、毎月の業務が変わる

月次報告書・顧客レポート・集計資料――定型のレポート業務は、Pythonですべて自動化できます。

データさえ整っていれば、レポートは「生成するもの」になります。「毎月の作業」から解放されて、分析や改善といった本来の価値ある仕事に集中しましょう。

最新の解説記事は、新着記事から順次公開しています。X(旧Twitter)でも更新情報を発信していますので、ぜひフォローしてください。

この記事を書いた人

ソニック|バックオフィス出身の業務効率化ブロガー。事務職時代に毎月3時間かけていた月次報告書作成を、Pythonで自動化した実体験あり。現在のデータサイエンス業務でも、クライアント向けレポートの自動生成にPythonを活用中。リアルな実体験をもとにしたノウハウを発信中。

→ 詳しいプロフィールはこちら→ はじめての方へ

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次