
年次報告書自動化の効果
- アニュアルレポート自動生成の完全自動化を実現するPythonスクリプトを5ステップで解説
- 「担当者2名・3週間の手作業」という課題を根本から解消する
- Claude Codeへの自然言語指示だけでスクリプトを生成できる
- 月・週・日単位の定期実行で完全無人化を実現する方法も紹介
以下のステップを順番に実行することで、今日から業務自動化を始められます。コピーして使えるコードと、Claude Codeへの指示文をセットで解説します。
年次報告書(アニュアルレポート)やIR資料の作成は、数値更新・グラフ差し替え・デザイン統一の繰り返し作業です。Claude Code + python-pptx + pandas を組み合わせれば、Excelの財務データを読み込んで報告書スライドを自動生成できます。
ステップ1:財務サマリースライドを自動生成
IR向けの財務サマリースライドをpython-pptxで自動生成して
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
import pandas as pd
prs = Presentation()
prs.slide_width = Inches(13.33)
prs.slide_height = Inches(7.5)
NAVY = RGBColor(0x1A, 0x37, 0x6B)
ORANGE = RGBColor(0xE8, 0x52, 0x0A)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
LGRAY = RGBColor(0xF5, 0xF5, 0xF5)
# データ読み込み
df = pd.read_excel("年次財務データ.xlsx")
latest = df.iloc[-1]
slide = prs.slides.add_slide(prs.slide_layouts[6])
# 紺色ヘッダー
hdr = slide.shapes.add_shape(1, 0, 0, prs.slide_width, Inches(1.5))
hdr.fill.solid(); hdr.fill.fore_color.rgb = NAVY
hdr.line.fill.background()
# 社名・タイトル
title_tb = slide.shapes.add_textbox(Inches(0.5), Inches(0.2), Inches(10), Inches(0.6))
title_tb.text_frame.text = "株式会社サンプル 2025年度 財務ハイライト"
title_tb.text_frame.paragraphs[0].runs[0].font.size = Pt(20)
title_tb.text_frame.paragraphs[0].runs[0].font.bold = True
title_tb.text_frame.paragraphs[0].runs[0].font.color.rgb = WHITE
# KPI カード4枚
kpi_items = [
{"label": "売上高", "value": f"¥{latest['売上高']/1e8:.1f}億", "yoy": f"+{latest['売上成長率']:.1f}%"},
{"label": "営業利益", "value": f"¥{latest['営業利益']/1e8:.1f}億","yoy": f"+{latest['利益成長率']:.1f}%"},
{"label": "EPS", "value": f"¥{latest['EPS']:.0f}", "yoy": f"+{latest['EPS成長率']:.1f}%"},
{"label": "配当金", "value": f"¥{latest['配当金']:.0f}/株", "yoy": "連続増配"},
]
for i, kpi in enumerate(kpi_items):
x = 0.4 + i * 3.15
card = slide.shapes.add_shape(1, Inches(x), Inches(1.7), Inches(2.9), Inches(2.5))
card.fill.solid(); card.fill.fore_color.rgb = LGRAY
card.line.color.rgb = RGBColor(0xE0, 0xE0, 0xE0)
tb = slide.shapes.add_textbox(Inches(x+0.1), Inches(1.85), Inches(2.7), Inches(0.35))
tb.text_frame.text = kpi["label"]
tb.text_frame.paragraphs[0].runs[0].font.size = Pt(11)
tb.text_frame.paragraphs[0].runs[0].font.color.rgb = RGBColor(0x80, 0x80, 0x80)
val_tb = slide.shapes.add_textbox(Inches(x+0.05), Inches(2.2), Inches(2.8), Inches(0.8))
val_tb.text_frame.text = kpi["value"]
val_tb.text_frame.paragraphs[0].runs[0].font.size = Pt(26)
val_tb.text_frame.paragraphs[0].runs[0].font.bold = True
val_tb.text_frame.paragraphs[0].runs[0].font.color.rgb = NAVY
val_tb.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
yoy_tb = slide.shapes.add_textbox(Inches(x+0.1), Inches(3.05), Inches(2.7), Inches(0.35))
yoy_tb.text_frame.text = f"前期比 {kpi['yoy']}"
yoy_tb.text_frame.paragraphs[0].runs[0].font.size = Pt(10)
yoy_tb.text_frame.paragraphs[0].runs[0].font.color.rgb = ORANGE
yoy_tb.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
prs.save("IR財務サマリー.pptx")
print("IR財務サマリースライド生成完了")
Excelの財務データを読み込み、KPIカード付きIRスライドを自動生成。決算報告書作成(1日)がスクリプト実行1分に。
年次報告書のスライド作成に数日かかり、数値修正のたびにデザイナーへ差し戻し。最終確認まで3往復が常態化。
財務データをインプットするだけで業績サマリー・5年トレンド・セグメント別スライドを自動生成。修正もコード変更のみ。
ステップ2:5カ年業績推移グラフを自動生成
from pptx.chart.data import ChartData
from pptx.enum.chart import XL_CHART_TYPE
import pandas as pd
df = pd.read_excel("年次財務データ.xlsx")
slide2 = prs.slides.add_slide(prs.slide_layouts[6])
cd = ChartData()
cd.categories = df["年度"].astype(str).tolist()
cd.add_series("売上高(百万円)", (df["売上高"] / 1e6).round(0).tolist())
cd.add_series("営業利益(百万円)", (df["営業利益"] / 1e6).round(0).tolist())
chart = slide2.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED,
Inches(0.4), Inches(1.0), Inches(8.5), Inches(6.0), cd
).chart
chart.has_legend = True
chart.has_title = True
chart.chart_title.text_frame.text = "5カ年 業績推移"
prs.save("IR財務サマリー.pptx")
print("5カ年業績グラフ追加完了")
5カ年の業績推移グラフスライドを自動追加。IR資料の数値更新作業が毎年ゼロになる。
ステップ3:事業セグメント別スライドを一括生成
import json
with open("segments.json", encoding="utf-8") as f:
segments = json.load(f)
for seg in segments:
slide = prs.slides.add_slide(prs.slide_layouts[6])
# セグメント名タイトル
tb = slide.shapes.add_textbox(Inches(0.4), Inches(0.2), Inches(12), Inches(0.6))
tb.text_frame.text = f"{seg['name']} セグメント概況"
tb.text_frame.paragraphs[0].runs[0].font.size = Pt(20)
tb.text_frame.paragraphs[0].runs[0].font.bold = True
# 売上・利益を自動配置(省略)
# ...
prs.save("IR報告書_全スライド.pptx")
print(f"{len(segments)}セグメントのスライドを一括生成")
JSONデータを更新するだけで全セグメントのスライドを一括再生成。年次IR資料作成が完全自動化。
このシステムが解決する課題
年次報告書・決算プレゼンをデータから自動作成。この自動化が特に効果的な場面と、解決できる課題を整理します。
- 年次報告書の作成に1〜2ヶ月かかり、担当者が他業務に集中できない
- 売上・利益・KPIデータをスライドに手動で転記するミスが発生している
- 前年比較・CAGR計算などの数値処理を手作業で行うのに時間がかかっている
- 役員・投資家・従業員向けのバージョン違いを管理するのが困難になっている
実務での活用シナリオ
導入前後の効果比較
Excelの決算データをPowerPointへ手動転記。グラフ作成・数値確認・デザイン調整に担当者2名が3週間かけていた。転記ミスが毎年数件発生し、差し戻しによるロスも大きかった。
ExcelデータをPythonが読み込み、前年比・CAGR・累計などを自動計算してスライドへ直接出力。グラフ生成・数値挿入・デザイン適用まで一括処理。所要時間:数時間→30分に短縮。
導入のポイントと注意事項
- 前年比計算は (当年値 – 前年値) / 前年値 * 100 の式をPythonで自動化し、スライドに「前年比○%増」と動的に挿入する
- 数値のフォーマット(¥1,234,567千円 vs ¥1.2百万円)は用途(役員向け・IR向け)で統一ルールを設けて定義しておく
- グラフの色は決算数値のポジティブ・ネガティブに応じて自動切り替え(増加→緑、減少→赤)すると視認性が向上する
- 最終版のPDFへの変換・パスワード設定・メール送信まで一連のパイプラインとして実装すると完全自動化できる
よくある質問(FAQ)
まとめ
✅ Excelデータから財務KPIカードスライドを自動生成
✅ 5カ年業績推移グラフを自動作成
✅ セグメント別スライドをJSONデータから一括生成
✅ 決算期ごとのIR資料作成作業を完全自動化
どんな現場で使われているか:活用シナリオ
実装で押さえるべき重要ポイント
- 1
データ収集フェーズと資料生成フェーズを分離:データ収集を終えてCSV/Excelに格納してから資料生成スクリプトを実行するフローを設計することで、データ更新時の再実行が簡単になります。
- 2
年次データの時系列比較グラフを自動化:過去5年・10年のトレンドグラフは年次報告書の定番です。pandas + matplotlibで時系列データを自動整形・可視化してスライドに自動挿入できます。
- 3
グラフのブランドカラー・フォントを統一:年次報告書はブランドの一貫性が重要です。matplotlibのrcParamsでカラーパレット・フォントをブランドガイドに固定して全グラフを統一します。
ビジネスインパクト
この記事のまとめ
- ✅ 年間の財務・業績データから年次報告書PPTを自動生成できる
- ✅ 時系列比較グラフ・KPIサマリーを自動計算・挿入できる
- ✅ 2週間かかる報告書作成のうちデータ収集以外を完全自動化できる
- ✅ 数値更新のたびに報告書を再生成するサイクルが確立できる
関連記事