Claude Code x python-pptx で月次報告スライドをデータから自動生成する完全ガイド
Claude Code + python-pptxで売上・KPIデータから月次報告スライドを自動生成。毎月の資料作成をゼロにした実践ガイド。データ更新だけで完成品PPTXを自動出力できる。
目次 クリックで開く
|
blog

▲ Claude Codeが実際に生成した実行結果
毎月末の報告資料作成が4時間からゼロになった
営業マネージャーの高橋です。毎月末、売上データをExcelで集計してPowerPointに貼り付け、グラフを調整して……この作業に4時間かかっていました。Claude Codeに依頼したら、データを渡すだけで月次報告スライドが自動生成されるようになりました。
✅ 売上CSV/ExcelからPPTスライドを自動生成
✅ 前月比・前年比グラフの自動挿入
✅ KPIカード(達成率・増減)の自動配置
✅ 社内テンプレートのブランドを自動適用
✅ 毎月1日に自動生成・メール配信
STEP 1:売上データからKPIサマリースライドを自動生成する
売上CSVを読み込み、KPIサマリーを含む1枚目のスライドを自動生成します。
1枚目は「今月のKPIサマリー」で、売上・件数・達成率・前月比をカード形式で表示してください。
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
import pandas as pd
df = pd.read_csv("sales_monthly.csv")
this_month = df.iloc[-1]
last_month = df.iloc[-2]
prs = Presentation()
prs.slide_width = Inches(13.33)
prs.slide_height = Inches(7.5)
blank = prs.slide_layouts[6]
slide = prs.slides.add_slide(blank)
# 背景
bg = slide.shapes.add_shape(1, 0, 0, prs.slide_width, prs.slide_height)
bg.fill.solid(); bg.fill.fore_color.rgb = RGBColor(0x1E,0x1E,0x2E)
bg.line.fill.background()
# タイトル
title_box = slide.shapes.add_textbox(Inches(0.5), Inches(0.3), Inches(12), Inches(0.8))
tf = title_box.text_frame
tf.text = f"{this_month['月']} 月次営業報告"
tf.paragraphs[0].font.size = Pt(28)
tf.paragraphs[0].font.bold = True
tf.paragraphs[0].font.color.rgb = RGBColor(0xFF,0xFF,0xFF)
# KPIカード(4枚)
kpis = [
("月次売上", f"¥{this_month['売上']:,.0f}", f"{(this_month['売上']-last_month['売上'])/last_month['売上']*100:+.1f}%"),
("受注件数", f"{this_month['件数']:.0f}件", f"{this_month['件数']-last_month['件数']:+.0f}件"),
("目標達成率", f"{this_month['達成率']:.1f}%", "月次目標対比"),
("平均単価", f"¥{this_month['売上']/this_month['件数']:,.0f}", "1件あたり"),
]
ORANGE = RGBColor(0xD2,0x47,0x26)
for i, (label, value, sub) in enumerate(kpis):
x = Inches(0.5 + i * 3.1)
card = slide.shapes.add_shape(1, x, Inches(1.5), Inches(2.9), Inches(2.2))
card.fill.solid(); card.fill.fore_color.rgb = RGBColor(0x2D,0x2D,0x3E)
card.line.color.rgb = ORANGE; card.line.width = Pt(1.5)
tb = slide.shapes.add_textbox(x+Inches(0.1), Inches(1.6), Inches(2.7), Inches(2.0))
tf2 = tb.text_frame; tf2.word_wrap = True
p1 = tf2.paragraphs[0]; p1.text = label
p1.font.size=Pt(11); p1.font.color.rgb=RGBColor(0xAA,0xAA,0xBB)
p2 = tf2.add_paragraph(); p2.text = value
p2.font.size=Pt(22); p2.font.bold=True; p2.font.color.rgb=RGBColor(0xFF,0xFF,0xFF)
p3 = tf2.add_paragraph(); p3.text = sub
p3.font.size=Pt(12); p3.font.color.rgb=ORANGE
prs.save("monthly_report.pptx")
print("スライド1生成完了")
月次KPIカードスライドが自動生成されました。売上・件数・達成率・平均単価が視覚的なカード形式で並び、前月比も自動表示されています。

STEP 2:前月比グラフを自動挿入する
過去6ヶ月の売上推移グラフを自動生成してスライドに挿入します。
今月の達成・未達を色で示してください。
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams["font.family"] = ["DejaVu Sans","Droid Sans Fallback"]
import io
from pptx.util import Inches
# グラフ生成
fig, ax = plt.subplots(figsize=(8,4), facecolor="#1E1E2E")
ax.set_facecolor("#2D2D3E")
months = df.tail(6)["月"].tolist()
sales = df.tail(6)["売上"].tolist()
targets= df.tail(6)["目標"].tolist()
colors = ["#D24726" if s >= t else "#6B7280" for s,t in zip(sales,targets)]
ax.bar(months, sales, color=colors, alpha=0.9, label="実績")
ax.plot(months, targets, color="#FCD34D", linewidth=2, linestyle="--",
marker="o", markersize=6, label="目標")
ax.set_title("月次売上推移(過去6ヶ月)", color="white", fontsize=14)
ax.tick_params(colors="white"); ax.yaxis.label.set_color("white")
ax.spines["bottom"].set_color("#555"); ax.spines["left"].set_color("#555")
ax.spines["top"].set_visible(False); ax.spines["right"].set_visible(False)
ax.legend(facecolor="#2D2D3E", labelcolor="white")
plt.tight_layout()
buf = io.BytesIO(); plt.savefig(buf, format="png", dpi=150, bbox_inches="tight"); buf.seek(0)
plt.close()
# スライド2を追加して画像挿入
slide2 = prs.slides.add_slide(blank)
bg2 = slide2.shapes.add_shape(1,0,0,prs.slide_width,prs.slide_height)
bg2.fill.solid(); bg2.fill.fore_color.rgb=RGBColor(0x1E,0x1E,0x2E); bg2.line.fill.background()
slide2.shapes.add_picture(buf, Inches(1), Inches(1.5), Inches(11), Inches(5.5))
tb = slide2.shapes.add_textbox(Inches(0.5),Inches(0.2),Inches(12),Inches(0.8))
tb.text_frame.text = "売上推移と目標達成状況"
tb.text_frame.paragraphs[0].font.size=Pt(24)
tb.text_frame.paragraphs[0].font.color.rgb=RGBColor(0xFF,0xFF,0xFF)
prs.save("monthly_report.pptx")
print("グラフスライド追加完了")
過去6ヶ月の月次売上推移グラフが自動生成されスライドに挿入されました。目標達成月はオレンジ、未達月はグレーで色分けされています。

▲ 月次報告スライド:エグゼクティブサマリー(Claude Code自動生成)
STEP 3:部門別・商品別の内訳スライドを自動生成する
売上の内訳分析をパイチャートと棒グラフで可視化したスライドを追加します。
1枚のスライドに2カラムレイアウトで自動配置してください。
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12,5), facecolor="#1E1E2E")
# 円グラフ(部門別)
dept_sales = {"営業1部":3200,"営業2部":2800,"EC部門":1950,"代理店":1050}
colors = ["#D24726","#E8734A","#F5A27C","#FAD1B8"]
ax1.pie(dept_sales.values(), labels=dept_sales.keys(), colors=colors,
autopct="%1.1f%%", pctdistance=0.8,
textprops={"color":"white","fontsize":11})
ax1.set_title("部門別売上構成", color="white", fontsize=13)
ax1.set_facecolor("#1E1E2E")
# 横棒グラフ(カテゴリ別ランキング)
categories = ["製品A","製品B","製品C","製品D","製品E"]
cat_sales = [4200,3100,2800,1900,1000]
bars = ax2.barh(categories, cat_sales, color="#D24726", alpha=0.8)
ax2.set_title("商品カテゴリ別売上Top5", color="white", fontsize=13)
ax2.tick_params(colors="white")
ax2.set_facecolor("#2D2D3E")
for bar in bars:
ax2.text(bar.get_width()+50, bar.get_y()+bar.get_height()/2,
f"¥{bar.get_width():,.0f}万", va="center", color="white", fontsize=10)
plt.tight_layout()
buf3 = io.BytesIO(); plt.savefig(buf3, format="png", dpi=150, bbox_inches="tight"); buf3.seek(0)
plt.close()
slide3 = prs.slides.add_slide(blank)
bg3=slide3.shapes.add_shape(1,0,0,prs.slide_width,prs.slide_height)
bg3.fill.solid(); bg3.fill.fore_color.rgb=RGBColor(0x1E,0x1E,0x2E); bg3.line.fill.background()
slide3.shapes.add_picture(buf3, Inches(0.5), Inches(1.2), Inches(12.3), Inches(5.8))
prs.save("monthly_report.pptx")
print("内訳スライド追加完了")
STEP 4:来月の行動計画スライドを自動生成する
今月の振り返りと来月の重点アクションをまとめたスライドを自動作成します。
箇条書きで整理したスライドを自動生成してください。
# 今月のパフォーマンス判定
if this_month["達成率"] >= 100:
good_pts = ["目標達成率100%超を維持", "新規顧客獲得が前月比+15%", "平均単価が過去最高を更新"]
imp_pts = ["リードタイム短縮が課題", "西日本エリアの開拓余地あり"]
actions = ["Q2向け大型案件のクローズ推進", "西日本エリア担当を1名追加配置", "製品B のアップセル施策を開始"]
else:
good_pts = ["新規リード獲得数は計画通り達成", "EC部門が前月比+12%と好調"]
imp_pts = ["受注率が目標を5pt下回った", "製品Cの価格競争力不足"]
actions = ["失注案件の要因分析と対策立案", "製品Cの価格見直しを検討", "商談プロセスの標準化を推進"]
slide4 = prs.slides.add_slide(blank)
bg4=slide4.shapes.add_shape(1,0,0,prs.slide_width,prs.slide_height)
bg4.fill.solid(); bg4.fill.fore_color.rgb=RGBColor(0x1E,0x1E,0x2E); bg4.line.fill.background()
def add_section(slide, x, y, w, h, title, items, color):
box=slide.shapes.add_shape(1,Inches(x),Inches(y),Inches(w),Inches(h))
box.fill.solid(); box.fill.fore_color.rgb=RGBColor(*[int(color[i:i+2],16) for i in (0,2,4)])
box.line.fill.background()
tb=slide.shapes.add_textbox(Inches(x+0.1),Inches(y+0.1),Inches(w-0.2),Inches(h-0.2))
tf=tb.text_frame; tf.word_wrap=True
p=tf.paragraphs[0]; p.text=title; p.font.bold=True; p.font.size=Pt(14); p.font.color.rgb=RGBColor(0xFF,0xFF,0xFF)
for item in items:
p2=tf.add_paragraph(); p2.text=f"• {item}"; p2.font.size=Pt(12); p2.font.color.rgb=RGBColor(0xEE,0xEE,0xEE)
add_section(slide4,0.3,1.0,5.9,2.5,"✅ 今月の成果", good_pts, "1B5E20")
add_section(slide4,0.3,3.7,5.9,2.5,"⚠️ 改善ポイント", imp_pts, "7F2D00")
add_section(slide4,6.5,1.0,6.5,5.2,"🎯 来月の重点アクション", actions, "1A237E")
prs.save("monthly_report.pptx")
print("アクションプランスライド追加完了")
今月の成果・改善ポイント・来月のアクションが色分けされた3カラムレイアウトで自動生成されました。データから成果を自動判定しています。
STEP 5:毎月1日に自動生成・メール配信する
毎月1日の朝7時に前月の月次報告PPTが自動で経営陣に届く仕組みを作ります。
from datetime import date, timedelta
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
RECIPIENTS = ["ceo@co.jp","sales-mgr@co.jp","dev-mgr@co.jp","mkt-mgr@co.jp"]
def monthly_ppt_report():
today = date.today()
if today.day != 1: return
prev = (today - timedelta(days=1)).strftime("%Y年%m月")
print(f"月次報告PPT生成開始: {prev}")
# データ取得・PPT生成
generate_monthly_report("sales_monthly.csv", f"monthly_{today:%Y%m}.pptx")
# メール送信
for recipient in RECIPIENTS:
msg = MIMEMultipart()
msg["Subject"] = f"【月次報告】{prev} 営業実績レポート"
msg["From"] = "report@co.jp"
msg["To"] = recipient
msg.attach(MIMEText(f"{prev} 月次報告
添付をご確認ください。
", "html","utf-8"))
with open(f"monthly_{today:%Y%m}.pptx", "rb") as f:
part = MIMEBase("application","octet-stream")
part.set_payload(f.read())
encoders.encode_base64(part)
part.add_header("Content-Disposition","attachment",filename=f"monthly_{today:%Y%m}.pptx")
msg.attach(part)
with smtplib.SMTP("smtp.office365.com",587) as sv:
sv.starttls(); sv.login("report@co.jp","PW"); sv.send_message(msg)
print(f"配信完了: {len(RECIPIENTS)}名")
monthly_ppt_report()
# schtasks /create /tn "月次報告PPT" /tr "python monthly_report.py" /sc DAILY /st 07:00 /f
毎月1日朝7時に月次報告PPTが自動生成・配信される仕組みが完成しました。経営陣はメールを開くだけで最新データのスライドを確認できます。

▲ 月次報告スライド:部門別実績テーブル(Claude Code自動生成)
どんな現場で使われているか:活用シナリオ
実装で押さえるべき重要ポイント
- 1
プレースホルダー名で差し込み位置を明確化:PowerPointテンプレートのテキストボックスに「{{売上合計}}」「{{前月比}}」などの変数名を入れておくと、python-pptxで検索・置換する実装が簡単になります。
- 2
グラフはネイティブPPTXチャートで実装:画像としてグラフを貼り付けると拡大時に劣化します。python-pptxのChartオブジェクトでネイティブグラフを生成すれば、PPT上で編集可能なグラフになります。
- 3
前月比・目標達成率のカラーコーディングを自動化:達成率100%以上は青、80%以上は橙、以下は赤といった色分けロジックをPython側で実装することで、毎月手動で色変更する作業が不要になります。
ビジネスインパクト
この記事のまとめ
- ✅ Excelの売上・KPIデータから月次報告スライドを完全自動生成できる
- ✅ 前月比・目標達成率・グラフを自動計算して色分けできる
- ✅ 毎月末のスケジュール実行で月次報告資料を自動生成・配布できる
- ✅ 月次スライド作成に費やしていた4時間を完全に削減できる
よくある質問(FAQ)
関連記事
Claude Codeの導入を、プロに任せてみませんか?
Aurant TechnologiesはClaude Code導入支援・業務自動化の専門チームです。
初回相談は無料。御社の課題をヒアリングして最適な自動化プランをご提案します。
