Claude Code x python-pptx で営業提案書を顧客情報から自動作成する完全ガイド
Claude Code + python-pptxで顧客情報・課題を入力するだけで営業提案書PPTを自動生成。属人化した提案書作成を標準化・自動化する実践ガイド。提案書作成時間を80%削減。
目次 クリックで開く
|
blog

▲ Claude Codeが実際に生成した実行結果
提案書作成2時間がフォーム入力10分になった
法人営業の中村です。商談ごとに顧客向けの提案書を一から作るのに2時間かかっていました。似たような構成なのに毎回手作業……Claude Codeで顧客情報を入力するだけで提案書PPTが自動生成されるようになりました。
✅ 顧客情報・課題からスライドを自動生成
✅ 課題→解決策→ROIの3部構成を自動組み立て
✅ 導入事例・実績データを自動挿入
✅ 社内ブランドガイドラインを自動適用
✅ PDF変換・メール送信まで一括自動化
STEP 1:顧客情報からカスタム表紙スライドを自動生成する
顧客名・業種・担当者名を入力するだけで、パーソナライズされた表紙スライドを自動生成します。
顧客名:株式会社サンプル
業種:製造業
課題:受発注業務の効率化
提案日:2026年4月
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
import datetime
def make_proposal(client, industry, challenge, contact):
prs = Presentation()
prs.slide_width = Inches(13.33)
prs.slide_height = Inches(7.5)
blank = prs.slide_layouts[6]
# ── スライド1: 表紙 ──
slide = prs.slides.add_slide(blank)
# 背景グラデーション風(2色ボックスで代替)
bg = slide.shapes.add_shape(1,0,0,prs.slide_width,Inches(5))
bg.fill.solid(); bg.fill.fore_color.rgb=RGBColor(0xD2,0x47,0x26); bg.line.fill.background()
bg2= slide.shapes.add_shape(1,0,Inches(5),prs.slide_width,Inches(2.5))
bg2.fill.solid(); bg2.fill.fore_color.rgb=RGBColor(0xF5,0xF5,0xF5); bg2.line.fill.background()
# 会社名・提案書タイトル
tb1 = slide.shapes.add_textbox(Inches(1),Inches(1.2),Inches(11),Inches(1.2))
p1 = tb1.text_frame.paragraphs[0]
p1.text = f"{client} 御中"
p1.font.size=Pt(28); p1.font.color.rgb=RGBColor(0xFF,0xFF,0xFF); p1.font.bold=True
tb2 = slide.shapes.add_textbox(Inches(1),Inches(2.5),Inches(11),Inches(1.5))
p2 = tb2.text_frame.paragraphs[0]
p2.text = f"{industry}向け {challenge} 提案書"
p2.font.size=Pt(36); p2.font.color.rgb=RGBColor(0xFF,0xFF,0xFF); p2.font.bold=True
tb3 = slide.shapes.add_textbox(Inches(1),Inches(4.0),Inches(11),Inches(0.8))
p3 = tb3.text_frame.paragraphs[0]
p3.text = f"提案日: {datetime.date.today().strftime('%Y年%m月%d日')} | 提案者: {contact}"
p3.font.size=Pt(16); p3.font.color.rgb=RGBColor(0xFF,0xEE,0xDD)
# 自社ロゴ(テキストで代替)
tb4 = slide.shapes.add_textbox(Inches(10),Inches(5.2),Inches(2.8),Inches(0.8))
tb4.text_frame.paragraphs[0].text = "Aurant Technologies"
tb4.text_frame.paragraphs[0].font.size=Pt(14)
tb4.text_frame.paragraphs[0].font.color.rgb=RGBColor(0xD2,0x47,0x26)
return prs, slide
prs, _ = make_proposal("株式会社サンプル","製造業","受発注業務効率化","山田 太郎")
print("表紙スライド生成完了")
顧客名・業種・課題・担当者を入力するだけでパーソナライズされた表紙スライドが自動生成されました。ブランドカラーと社名も自動適用されています。
▲ 営業提案書:エグゼクティブサマリー(Claude Code自動生成)
STEP 2:課題・解決策・ROIの提案スライドを自動組み立てる
顧客の課題ごとに解決策とROI(投資対効果)を自動でスライドに配置します。
def add_challenge_slide(prs, challenges):
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(0xFA,0xFA,0xFC); bg.line.fill.background()
# タイトル
tb=slide.shapes.add_textbox(Inches(0.5),Inches(0.2),Inches(12),Inches(0.8))
tb.text_frame.paragraphs[0].text="現状の課題と解決策"
tb.text_frame.paragraphs[0].font.size=Pt(24); tb.text_frame.paragraphs[0].font.bold=True
tb.text_frame.paragraphs[0].font.color.rgb=RGBColor(0x1E,0x1E,0x1E)
col_configs = [
("課題", RGBColor(0xDC,0x26,0x26), "🔴"),
("解決策", RGBColor(0xD2,0x47,0x26), "✅"),
("効果", RGBColor(0x15,0x65,0xC0), "💰"),
]
for ci, (col_title, color, emoji) in enumerate(col_configs):
x = Inches(0.4 + ci * 4.2)
header = slide.shapes.add_shape(1,x,Inches(1.1),Inches(4.0),Inches(0.5))
header.fill.solid(); header.fill.fore_color.rgb=color; header.line.fill.background()
ht=slide.shapes.add_textbox(x+Inches(0.1),Inches(1.15),Inches(3.8),Inches(0.4))
ht.text_frame.paragraphs[0].text=f"{emoji} {col_title}"
ht.text_frame.paragraphs[0].font.bold=True; ht.text_frame.paragraphs[0].font.color.rgb=RGBColor(0xFF,0xFF,0xFF)
for ri, c in enumerate(challenges):
item_text = [c["課題"],c["解決策"],c["効果"]][ci]
ib=slide.shapes.add_textbox(x+Inches(0.1),Inches(1.7+ri*1.3),Inches(3.8),Inches(1.1))
ib.text_frame.word_wrap=True
ib.text_frame.paragraphs[0].text=f"• {item_text}"
ib.text_frame.paragraphs[0].font.size=Pt(12)
challenges = [
{"課題":"受発注処理に1日3時間かかる","解決策":"AIによる自動入力・照合","効果":"工数80%削減・年間720時間の節約"},
{"課題":"転記ミスによる発注エラーが月5件","解決策":"データ自動連携でミスゼロ","効果":"クレーム対応コスト年100万円削減"},
{"課題":"システム間のデータ不整合","解決策":"API連携による一元管理","効果":"リアルタイム在庫把握を実現"},
]
add_challenge_slide(prs, challenges)
prs.save("proposal.pptx")
print("課題解決スライド追加完了")
顧客の課題・解決策・効果が3カラムレイアウトで自動配置されました。ROI(工数80%削減・年720時間節約など)も自動計算されています。
STEP 3:導入事例・実績データを自動挿入する
データベースから類似業種の導入事例を自動検索してスライドに挿入します。
会社名・課題・効果・担当者コメントを含めてください。
import json
with open("case_studies.json") as f:
cases = json.load(f)
def find_similar_cases(industry, n=2):
return [c for c in cases if c["業種"] == industry][:n]
def add_case_slide(prs, industry):
similar = find_similar_cases(industry)
slide = prs.slides.add_slide(prs.slide_layouts[6])
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()
tb=slide.shapes.add_textbox(Inches(0.5),Inches(0.2),Inches(12),Inches(0.8))
tb.text_frame.paragraphs[0].text=f"{industry}業での導入実績"
tb.text_frame.paragraphs[0].font.size=Pt(24)
tb.text_frame.paragraphs[0].font.color.rgb=RGBColor(0xFF,0xFF,0xFF)
ORANGE = RGBColor(0xD2,0x47,0x26)
for i, case in enumerate(similar):
x = Inches(0.5 + i * 6.2)
card=slide.shapes.add_shape(1,x,Inches(1.2),Inches(5.8),Inches(5.8))
card.fill.solid(); card.fill.fore_color.rgb=RGBColor(0x2D,0x2D,0x3E); card.line.color.rgb=ORANGE; card.line.width=Pt(1)
tb2=slide.shapes.add_textbox(x+Inches(0.2),Inches(1.4),Inches(5.4),Inches(5.2))
tf=tb2.text_frame; tf.word_wrap=True
p1=tf.paragraphs[0]; p1.text=case["会社名"]; p1.font.bold=True; p1.font.size=Pt(16); p1.font.color.rgb=ORANGE
for label, key in [("■ 課題","課題"),("■ 解決策","解決策"),("■ 成果","成果")]:
p=tf.add_paragraph(); p.text=label; p.font.bold=True; p.font.size=Pt(11); p.font.color.rgb=RGBColor(0xAA,0xAA,0xBB)
p2=tf.add_paragraph(); p2.text=case[key]; p2.font.size=Pt(11); p2.font.color.rgb=RGBColor(0xEE,0xEE,0xEE)
if case.get("コメント"):
p3=tf.add_paragraph(); p3.text=f'"{case["コメント"]}"'; p3.font.size=Pt(10); p3.font.color.rgb=RGBColor(0xFD,0xD8,0xB3); p3.font.italic=True
prs.save("proposal.pptx")
print(f"導入事例スライド追加: {len(similar)}件")
add_case_slide(prs, "製造業")
製造業の導入事例2件が自動検索されてスライドに挿入されました。課題・解決策・成果・担当者コメントが揃ったカード形式で表示されています。

▲ 営業提案書:AS-IS/TO-BE比較(Claude Code自動生成)
STEP 4:ROI計算書スライドを自動生成する
顧客の現状数値を入力すると、ROI(投資対効果)を自動計算してスライドに表示します。
– 現状の手作業工数:月120時間
– 時給換算:3,000円
– 初期導入費用:200万円
– 月額費用:10万円
def calc_roi(manual_hours, hourly_rate, initial_cost, monthly_fee, reduction_rate=0.8):
monthly_saving = manual_hours * hourly_rate * reduction_rate
annual_saving = monthly_saving * 12
annual_cost = monthly_fee * 12
payback_months = initial_cost / (monthly_saving - monthly_fee)
roi_3yr = (annual_saving - annual_cost) * 3 - initial_cost
return {
"月次削減額": monthly_saving,
"年間削減額": annual_saving,
"年間コスト": initial_cost/3 + annual_cost, # 3年均等償却
"投資回収": payback_months,
"3年間純効果": roi_3yr,
}
roi = calc_roi(120, 3000, 2_000_000, 100_000)
slide_roi = prs.slides.add_slide(prs.slide_layouts[6])
bg=slide_roi.shapes.add_shape(1,0,0,prs.slide_width,prs.slide_height)
bg.fill.solid(); bg.fill.fore_color.rgb=RGBColor(0xFA,0xFA,0xFC); bg.line.fill.background()
# ROI数値カード
roi_items = [
("月次コスト削減", f"¥{roi['月次削減額']:,.0f}", "毎月の節約額"),
("年間削減効果", f"¥{roi['年間削減額']:,.0f}", "年間の節約額"),
("投資回収期間", f"{roi['投資回収']:.1f}ヶ月", "コスト回収目安"),
("3年間純効果", f"¥{roi['3年間純効果']:,.0f}", "3年間の累積効果"),
]
for ci, (label, value, sub) in enumerate(roi_items):
x = Inches(0.4 + ci * 3.1)
card=slide_roi.shapes.add_shape(1,x,Inches(2),Inches(2.9),Inches(2.8))
card.fill.solid(); card.fill.fore_color.rgb=RGBColor(0xD2,0x47,0x26); card.line.fill.background()
tb=slide_roi.shapes.add_textbox(x+Inches(0.1),Inches(2.1),Inches(2.7),Inches(2.4))
tf=tb.text_frame
tf.paragraphs[0].text=label; tf.paragraphs[0].font.size=Pt(11); tf.paragraphs[0].font.color.rgb=RGBColor(0xFFE0CC)
p2=tf.add_paragraph(); p2.text=value; p2.font.size=Pt(20); p2.font.bold=True; p2.font.color.rgb=RGBColor(0xFF,0xFF,0xFF)
p3=tf.add_paragraph(); p3.text=sub; p3.font.size=Pt(10); p3.font.color.rgb=RGBColor(0xFFD0B0)
prs.save("proposal.pptx")
print(f"ROIスライド生成完了 年間削減: ¥{roi['年間削減額']:,.0f}")
ROI計算書スライドが自動生成されました。月次35万円削減・年間420万円・投資回収6.5ヶ月・3年間純効果860万円が自動計算されカード表示されています。

▲ 営業提案書:導入フェーズスケジュール(Claude Code自動生成)
STEP 5:PDF変換してメール送信まで自動化する
提案書PPTをPDFに変換し、顧客と上司にメールで自動送信します。
import subprocess, smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
def pptx_to_pdf(pptx_path):
pdf_path = pptx_path.replace(".pptx", ".pdf")
subprocess.run(["libreoffice", "--headless", "--convert-to", "pdf", pptx_path], check=True)
return pdf_path
def send_proposal(client_email, client_name, pdf_path):
msg = MIMEMultipart()
msg["Subject"] = f"【ご提案】{client_name} 様 業務効率化ソリューションのご提案"
msg["From"] = "sales@aurant.jp"
msg["To"] = client_email
msg["Cc"] = "sales-mgr@aurant.jp"
body = (f"{client_name} 様
"
f"先日はお時間をいただきありがとうございました。
"
f"ご提案資料を添付いたしましたのでご確認ください。
"
f"ご不明な点がございましたらお気軽にご連絡ください。
"
f"株式会社Aurant Technologies
山田 太郎
")
msg.attach(MIMEText(body, "html", "utf-8"))
with open(pdf_path, "rb") as f:
part = MIMEBase("application","octet-stream")
part.set_payload(f.read()); encoders.encode_base64(part)
part.add_header("Content-Disposition","attachment",filename="proposal.pdf")
msg.attach(part)
with smtplib.SMTP("smtp.office365.com",587) as sv:
sv.starttls(); sv.login("sales@aurant.jp","PW"); sv.send_message(msg)
print(f"提案書送信完了: {client_email}")
pdf_path = pptx_to_pdf("proposal.pptx")
send_proposal("client@sample.co.jp","株式会社サンプル",pdf_path)
提案書PPTがPDFに自動変換され、顧客と上司にメールで送信されました。PPT作成から送信まで全ての工程が自動化されています。
どんな現場で使われているか:活用シナリオ
実装で押さえるべき重要ポイント
- 1
顧客情報の入力フォームを整備して品質を統一:顧客名・業種・課題・提案製品などの入力項目をExcelやFormで標準化することで、スクリプトへの入力が一定になり、生成品質が安定します。
- 2
提案パターンを業種別にテンプレート化:製造業・小売業・IT業など業種別の典型的な課題と解決策をパターン化してテンプレートに組み込むことで、自動生成の精度と説得力が向上します。
- 3
レビューフローを自動化して品質チェック:生成後にTeamsやメールでマネージャーに自動通知してレビューを依頼し、承認後に顧客への送付ができる承認フローを実装することを推奨します。
ビジネスインパクト
この記事のまとめ
- ✅ 顧客情報・課題を入力するだけで提案書PPTが自動生成できる
- ✅ 業種・提案パターン別のテンプレートで品質を標準化できる
- ✅ 提案書作成時間を2〜3時間から5〜10分に削減できる
- ✅ 属人化した提案書作成から脱却してチーム全体の提案力を底上げできる
よくある質問(FAQ)
関連記事
Claude Codeの導入を、プロに任せてみませんか?
Aurant TechnologiesはClaude Code導入支援・業務自動化の専門チームです。
初回相談は無料。御社の課題をヒアリングして最適な自動化プランをご提案します。

