一句话需求做成PPT:先写结论式大纲,再交给AI排版
- 2026-11-06 13:18:05
周四下午四点,领导路过工位丢下一句:“下周例会讲讲工单为啥越来越多,弄个 PPT。”说完人就走了。
要是把这句话原样丢给 AI,最常见的回法是:背景、现状分析、原因分析、下一步计划、总结,五页,每页三条。挑不出错,也用不上。领导翻到第三页还不知道我想让他干什么,“预计下降 30%”这种数,我自己都说不出是哪来的。
我现在换了个顺序:先让 AI 反问我,再要一份“每页标题就是结论”的大纲,最后才交给 WPS AI 或 Kimi 去排版。这篇给你三段提问、两个出稿入口的用法,文末附一个查大纲的小脚本。
两份大纲,差在标题
同一件事,两种大纲放在一起看:

示例数据:左边是手写的“目录式”大纲,用来模拟常见的第一版
右边那份,只读五个标题就能听懂:工单涨了 43%,涨在两类问题,原因是什么,下月做三件事,需要您定两件事。领导开会时多半只看标题,正文是给追问准备的。
左边的问题不在 AI 笨,在于我只给了一句话。它不知道给谁看、要谁拍板、手上有什么数,只能套最安全的目录。
【可复制】第一步:先让 AI 问你
领导原话:「______」
我要做一份汇报 PPT。先别写大纲,请先问我问题,一次最多 5 个,
只问会改变 PPT 结构的:给谁看、看完要他们做什么决定、讲几分钟、
我手上有哪些材料和数字、有没有必须出现或不能出现的内容。
我答完后,你用一句话复述“这份 PPT 要让谁看完后做什么”,我确认了再往下走。
最后那句复述最有用。它要是复述成“向领导汇报工单情况”,说明你还没想清楚要什么,回去补一句“我需要他批研发排期”,整份 PPT 的方向就变了。
材料贴进去之前,客户姓名、手机号先删掉;公司规定不能外传的数据,别往外部 AI 里放。
【可复制】第二步:要一份结论式大纲
根据上面确认的信息和我贴的材料,写 PPT 大纲,Markdown 格式:
1. 共 X 页(不含封面),第一页正文就是结论和需要领导决定的事
2. 每页用「## 页码 标题」,标题写成一句完整的结论,不超过 28 字,
不要用“背景”“现状分析”“总结”这类目录词
3. 每页 2 到 4 条要点,数字只能来自我给的材料,最后一行写“来源:……”
4. 材料里没有的数字或事实,写【待补:缺什么、找谁要】,不许估算
5. 需要图表的页加一行“图表:类型|数据”
6. 写完把所有标题按顺序单独列一遍,看连起来读是不是一段完整的话
第 4 条最容易被省掉,偏偏最要紧。不给它留“待补”这个出口,它会顺手填一个看起来合理的数。“能降多少工单”这种问题,试运行之前谁也答不了,大纲里写【待补】,汇报时当面说“一周后给数”,比 PPT 上印个编的 30% 安全得多。
第 6 条是“标题串读”。五个标题连起来读不顺,说明页序有问题,改大纲比改 PPT 便宜。
第三步:大纲交给 WPS AI 或 Kimi 出稿
大纲定了,排版这种体力活再交出去。两个常见入口,官方说明整理在这:

整理自 WPS 官网演示页、WPS 社区 WPS AI 教程、Kimi 帮助中心(2026-10-24 查阅),入口名称以你看到的版本为准
两边都能吃“已有大纲”,这点最关键:WPS AI 的一键生成支持输入主题或已有大纲,生成后能在预览里改,确认再点「立即创建」;Kimi PPT 可以粘贴一段文字或上传文档。公司有固定模板的,Kimi 可以直接上传 PPTX 模板;文字多的汇报,帮助中心建议用经典模板模式。
粘贴大纲时,前面加一句:
请严格按下面的大纲逐页生成:不增删页面,不改页面标题,
不添加大纲里没有的数字、案例和百分比,【待补】原样保留并标红。
【可复制】第四步:成稿后对着大纲核一遍
工具会帮你“丰富内容”,这正是要盯的地方。把生成的每页文字复制出来,连同大纲一起发给 AI:
下面是我的大纲和生成的 PPT 文字。请逐页对照,只列问题,不要改稿:
1. 有没有大纲里没有的数字、百分比、案例(列出页码和原句)
2. 有没有把【待补】填成了具体内容
3. 有没有页面标题从结论改回了目录词
页数不多的话,自己扫一遍也行,重点看第 1 条。
进阶:大纲直接变 PPTX,再自动查一遍(可跳过)
每周都要做类似汇报的,可以把上面的 Markdown 大纲存成 outline.md,用两个小脚本:一个查大纲,一个直接生成可编辑的 PPTX。下面是我在示例大纲上实际跑出来的效果,LibreOffice 25.2 打开渲染:

示例数据:python-pptx 生成,柱形图是可编辑的原生图表,【待补】自动标红
样子朴素,但结构、数字、图表都对,拿去套公司模板或交给上面两个工具美化就行。
查大纲的脚本,运行 python outline_check.py outline.md:
import re, sys
pages = []
for line in open(sys.argv[1], encoding="utf-8"):
line = line.rstrip()
if line.startswith("## "): pages.append({"t": line[3:], "items": []})
elif line.startswith("- ") and pages: pages[-1]["items"].append(line[2:])
print("【标题串读】连起来读,应该是一段完整的话:")
for p in pages: print(" " + p["t"])
print(f"\n共 {len(pages)} 页(不含封面)")
todo = [(p["t"].split()[0], m) for p in pages for i in p["items"] for m in re.findall(r"【待补[::]([^】]*)】", i)]
print(f"\n【待补】{len(todo)} 处,交稿前要么补上,要么当面说明:")
for n, m in todo: print(f" 第{n}页:{m}")
print("\n【其他提醒】")
hit = 0
for p in pages:
n = p["t"].split()[0]; title = p["t"][len(n):].strip()
nums = [i for i in p["items"] if re.search(r"\d", i) and not i.startswith(("来源:", "图表:"))]
if nums and not any(i.startswith("来源:") for i in p["items"]):
print(f" 第{n}页:有数字但没写来源"); hit += 1
if len(title) > 28: print(f" 第{n}页:标题 {len(title)} 字,偏长"); hit += 1
for i in p["items"]:
if re.search(r"预计|约|左右|大概|(提升|下降|增长|减少)[^,。]{0,6}\d+%", i) and not i.startswith("来源:"):
print(f" 第{n}页:像估算的数,问清出处:{i}"); hit += 1
if re.fullmatch(r"(背景|现状|现状分析|问题|原因分析|下一步|下一步计划|总结|计划|概述)", title):
print(f" 第{n}页:标题是目录词,改成一句结论"); hit += 1
if not hit: print(" 无")
拿左边那份目录式大纲跑,输出是这样:

示例数据:Python 3 实际运行输出
右边那份跑出来是另一个样子:“其他提醒”为无,只列出 4 处【待补】,正好是汇报前要去找人要的东西。
生成 PPTX 的脚本要先装 python-pptx(pip install python-pptx),运行 python make_ppt.py outline.md 汇报.pptx:
import re, sys
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE, XL_LEGEND_POSITION
src, out = sys.argv[1], sys.argv[2]
FONT = "微软雅黑" # Mac 可改成 "PingFang SC"
NAVY, RED, GRAY = RGBColor(0x10,0x24,0x3e), RGBColor(0xc0,0x39,0x2b), RGBColor(0x6b,0x72,0x80)
title, pages = "", []
for line in open(src, encoding="utf-8"):
line = line.rstrip()
if line.startswith("# "): title = line[2:]
elif line.startswith("## "): pages.append({"title": re.sub(r"^\d+\s*", "", line[3:]), "items": []})
elif line.startswith("- ") and pages: pages[-1]["items"].append(line[2:])
prs = Presentation(); prs.slide_width, prs.slide_height = Inches(13.333), Inches(7.5)
blank = prs.slide_layouts[6]
def text(slide, x, y, w, h, s, size, color=NAVY, bold=False):
tf = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)).text_frame
tf.word_wrap = True
for i, part in enumerate(s if isinstance(s, list) else [s]):
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
p.space_after = Pt(10)
for seg in re.split(r"(【待补[^】]*】)", part): # 待补内容标红
if not seg: continue
r = p.add_run(); r.text = seg; r.font.size = Pt(size); r.font.bold = bold; r.font.name = FONT
r.font.color.rgb = RED if seg.startswith("【待补") else color
return tf
s = prs.slides.add_slide(blank)
s.shapes.add_shape(1, 0, 0, prs.slide_width, prs.slide_height).fill.solid()
s.shapes[0].fill.fore_color.rgb = NAVY; s.shapes[0].line.fill.background()
main, _, sub = title.partition("(") # 括号里的内容当副标题
text(s, 0.9, 2.5, 11.5, 1.6, main, 40, RGBColor(255,255,255), True)
if sub: text(s, 0.9, 3.9, 11.5, 0.8, sub.rstrip(")"), 20, RGBColor(0xfc,0xa3,0x11))
for n, pg in enumerate(pages, 1):
s = prs.slides.add_slide(blank)
text(s, 0.7, 0.45, 12, 1.0, pg["title"], 30, NAVY, True)
bar = s.shapes.add_shape(1, Inches(0.7), Inches(1.45), Inches(1.2), Inches(0.08))
bar.fill.solid(); bar.fill.fore_color.rgb = RGBColor(0xfc,0xa3,0x11); bar.line.fill.background()
body = [i for i in pg["items"] if not i.startswith(("来源:", "备注:", "图表:"))]
chart = next((i for i in pg["items"] if i.startswith("图表:")), None)
text(s, 0.7, 1.8, 5.6 if chart else 12, 4.6, ["• " + i for i in body], 20 if chart else 24, RGBColor(0x1f,0x29,0x37))
if chart: # 图表:类型|分类|系列名 数值,数值
parts = chart[3:].split("|")
cd = CategoryChartData(); cd.categories = parts[1].split(",")
for ser in parts[2:]:
name, vals = ser.split(" ", 1); cd.add_series(name, [float(v) for v in vals.split(",")])
gf = s.shapes.add_chart(XL_CHART_TYPE.COLUMN_CLUSTERED, Inches(6.6), Inches(1.7), Inches(6.2), Inches(4.8), cd)
gf.chart.has_legend = True; gf.chart.legend.position = XL_LEGEND_POSITION.BOTTOM; gf.chart.legend.include_in_layout = False
gf.chart.legend.font.size = Pt(14); gf.chart.font.name = FONT
pl = gf.chart.plots[0]; pl.has_data_labels = True; pl.data_labels.font.size = Pt(11)
srcs = [i for i in pg["items"] if i.startswith("来源:")]
if srcs: text(s, 0.7, 6.7, 12, 0.5, srcs[0], 12, GRAY)
notes = [i[3:] for i in pg["items"] if i.startswith("备注:")]
if notes: s.notes_slide.notes_text_frame.text = notes[0] # “备注:”写进演讲者备注
text(s, 12.3, 6.9, 0.8, 0.4, str(n + 1), 12, GRAY)
prs.save(out); print(f"已生成 {out}:封面 + {len(pages)} 页")
阿进的判断
值得用,但顺序别反。AI 最省时间的地方是排版和把要点写顺,最不该交出去的是“这份 PPT 要让谁做什么决定”和里面的数字。适合经常被一句话派活的人:要做例会汇报、项目复盘、方案申请的职员和小组长。坑有三个:只给一句话,必然拿到目录式大纲;不留【待补】,AI 会替你编数;成稿工具一“丰富内容”,大纲里没有的百分比就冒出来了,交之前对着大纲再看一遍。
你被一句话派过最离谱的 PPT 需求是什么?
本文信息来源:WPS 官网 WPS Presentation 页面(wps.com/office/presentation)、WPS 社区《【WPS AI教程】一文看懂演示AI》、Kimi 帮助中心「Kimi PPT」「如何选择 PPT 创作模式」页面(2026-10-24 查阅)。文中工单数字、大纲、PPT 均为示例数据;左侧目录式大纲为手写,用来模拟常见写法。PPT 由文中脚本在示例大纲上实际生成,LibreOffice 25.2 渲染;检查结果为实际运行输出。