Claude Code x python-pptx で月次報告スライドをデータから自動生成する完全ガイド

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

この記事をシェア:
目次 クリックで開く

2026年4月 | PowerPoint自動化 | 月次報告・経営資料

Claude Codeが生成した月次報告PowerPointスライド

▲ Claude Codeが実際に生成した実行結果

毎月末の報告資料作成が4時間からゼロになった

営業マネージャーの高橋です。毎月末、売上データをExcelで集計してPowerPointに貼り付け、グラフを調整して……この作業に4時間かかっていました。Claude Codeに依頼したら、データを渡すだけで月次報告スライドが自動生成されるようになりました。

この記事で実現すること

✅ 売上CSV/ExcelからPPTスライドを自動生成
✅ 前月比・前年比グラフの自動挿入
✅ KPIカード(達成率・増減)の自動配置
✅ 社内テンプレートのブランドを自動適用
✅ 毎月1日に自動生成・メール配信

STEP 1:売上データからKPIサマリースライドを自動生成する

売上CSVを読み込み、KPIサマリーを含む1枚目のスライドを自動生成します。

💬 私はClaude Codeにこう頼みました:sales_monthly.csvというデータから月次報告PowerPointを自動生成してください。
1枚目は「今月のKPIサマリー」で、売上・件数・達成率・前月比をカード形式で表示してください。
🤖 Claude Codeの回答:python-pptx を使って 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ヶ月の売上推移グラフを自動生成してスライドに挿入します。

💬 私はClaude Codeにこう頼みました:過去6ヶ月の月次売上推移グラフと目標ラインをPowerPointスライドに挿入してください。
今月の達成・未達を色で示してください。
🤖 Claude Codeの回答:python-pptx と matplotlib を使って月次推移グラフをスライドに自動挿入するコードを作成しました。
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自動生成)

▲ 月次報告スライド:エグゼクティブサマリー(Claude Code自動生成)

STEP 3:部門別・商品別の内訳スライドを自動生成する

売上の内訳分析をパイチャートと棒グラフで可視化したスライドを追加します。

💬 私はClaude Codeにこう頼みました:部門別の売上内訳(円グラフ)と商品カテゴリ別の売上ランキング(横棒グラフ)を
1枚のスライドに2カラムレイアウトで自動配置してください。
🤖 Claude Codeの回答:matplotlib で2つのグラフを生成し、スライドに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("内訳スライド追加完了")
✅ 実行結果

部門別円グラフと商品カテゴリ別横棒グラフが2カラムレイアウトで1枚のスライドに自動配置されました。
月次報告スライド:KPIコールアウト(Claude Code自動生成)

▲ 月次報告スライド:KPIコールアウト(Claude Code自動生成)

STEP 4:来月の行動計画スライドを自動生成する

今月の振り返りと来月の重点アクションをまとめたスライドを自動作成します。

💬 私はClaude Codeにこう頼みました:今月の成果(良かった点・改善点)と来月の重点アクション3つを
箇条書きで整理したスライドを自動生成してください。
🤖 Claude Codeの回答:テキストレイアウトのアクションプランスライドを自動生成するコードを作成しました。
# 今月のパフォーマンス判定
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が自動で経営陣に届く仕組みを作ります。

💬 私はClaude Codeにこう頼みました:毎月1日の朝7時に月次報告PPTを自動生成して、社長・部門マネージャー全員にメールで送信する月次自動化スクリプトを作ってください。
🤖 Claude Codeの回答:月次自動実行スクリプトと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自動生成)

▲ 月次報告スライド:部門別実績テーブル(Claude Code自動生成)

どんな現場で使われているか:活用シナリオ

対象者 導入前の課題 Claude Code導入後
営業マネージャー 月次売上スライドをExcelからコピペで作成して毎月4時間かかる Excelデータを置くだけで売上・KPI・グラフ入りスライドが自動生成
経営企画 各部門からデータを集めてPPTに手動で反映する作業が1日 各部門のExcelを読み込んで統合済み月次報告スライドを自動生成
事業部長 月次報告の準備でメンバーが残業して当日の朝まで修正 月次データ確定と同時にスライドが自動生成されて前日に配布完了

実装で押さえるべき重要ポイント

  • 1
    プレースホルダー名で差し込み位置を明確化:PowerPointテンプレートのテキストボックスに「{{売上合計}}」「{{前月比}}」などの変数名を入れておくと、python-pptxで検索・置換する実装が簡単になります。
  • 2
    グラフはネイティブPPTXチャートで実装:画像としてグラフを貼り付けると拡大時に劣化します。python-pptxのChartオブジェクトでネイティブグラフを生成すれば、PPT上で編集可能なグラフになります。
  • 3
    前月比・目標達成率のカラーコーディングを自動化:達成率100%以上は青、80%以上は橙、以下は赤といった色分けロジックをPython側で実装することで、毎月手動で色変更する作業が不要になります。

ビジネスインパクト

4時間→0時間
月次スライド作成時間
前日配布
資料完成のタイミング
全部門統合
自動集計できるデータ範囲

この記事のまとめ

  • ✅ Excelの売上・KPIデータから月次報告スライドを完全自動生成できる
  • ✅ 前月比・目標達成率・グラフを自動計算して色分けできる
  • ✅ 毎月末のスケジュール実行で月次報告資料を自動生成・配布できる
  • ✅ 月次スライド作成に費やしていた4時間を完全に削減できる


よくある質問(FAQ)

A. はい、既存のPPTXファイルを読み込んでテキスト・グラフ・画像を更新できます。スライドマスターのデザインを維持したまま内容だけを差し替えることが可能です。社内ブランドガイドに沿ったテンプレートをそのまま使えるので、デザインの一貫性が保たれます。

A. python-pptxのネイティブチャート機能またはmatplotlibで画像を生成してスライドに挿入する方法があります。データ連携型グラフにはchartオブジェクトを使った実装が確実です。スライド上で編集可能なグラフとして埋め込まれるため、最終調整も容易です。

A. Windowsタスクスケジューラまたはcronジョブで毎月末日に自動実行する設定ができます。社内サーバーまたはクラウド(AWS Lambda/Azure Functions)での定期実行も実装可能です。実行後にメールやTeamsで完了通知を自動送信する仕組みも合わせて構築できます。


関連記事


制作実績サンプル

このクオリティの資料が、あなたの業務でも作れます

Aurant Technologies が実際に制作したコンサルティング資料(全82枚)のサンプルです。Claude Code × AI自動化により、従来の1/5のコスト・時間で同等品質を実現します。

タイトルスライド

タイトル・ダーク背景
3カラム分析

3カラム比較・分析
AI活用フロー

AI活用フロー図解
Before/After

Before/After比較
RFPテンプレート

構造化コンテンツ
全10枚を
見る

御社のテーマでこのレベルの資料を作成できます
制作費・納期・自動化プランは無料相談でご確認いただけます

📊 サンプル全10枚を見る →

Claude Codeの導入を、プロに任せてみませんか?

Aurant TechnologiesはClaude Code導入支援・業務自動化の専門チームです。
初回相談は無料。御社の課題をヒアリングして最適な自動化プランをご提案します。

無料相談を申し込む →


AT
aurant technologies 編集

上場企業からスタートアップまで、数多くのデータ分析基盤構築・AI導入プロジェクトを主導。単なる技術提供にとどまらず、MA/CRM(Salesforce, Hubspot, kintone, LINE)導入によるマーケティング最適化やバックオフィス業務の自動化など、常に「事業数値(売上・利益)」に直結する改善実績多数。

この記事が役に立ったらシェア: