几十页PPT要写?Python一键批量造
- 2026-11-09 04:22:30
PPT 这活儿,最费人的是重复
你是不是也这样:周会要汇报、上课要讲义、年底要总结,打开 PowerPoint 一页一页建标题、填要点、调格式,三十页做下来眼睛都花了。我以前最怕这种活,明明内容早就准备好了,却要花一下午把字一个个挪进框里。其实你仔细看,大部分 PPT 长一个样——一张封面,后面几页都是"一个小标题配几条要点",结构高度模板化。这种活儿最该交给电脑,你只管把内容清单列好,格式和排版让 Python 批量搞定,省下的时间喝杯水或干点正事不香吗。
先装个"造 PPT 的工厂"
Python 自己不会做 PPT,得请一个专门干这事的帮手库:python-pptx。它负责管幻灯片、文本框、字体、图片这些底层细节,你只用告诉它"加一页、写什么"。
pip install python-pptx
装好就能用,纯本地运行,不用联网、不用开会员,公司电脑也能放心装。下面所有代码你复制过去就能直接跑,建议先建个空文件夹把脚本和生成的 pptx 放一起,免得找不着。
三行代码,造出第一页
先看最小能跑的例子:新建一个演示文稿,加一张标题页,写上主标题和副标题,存成文件。
from pptx import Presentation
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[0])
slide.shapes.title.text = "我的第一份自动 PPT"
slide.placeholders[1].text = "用 Python 造的,2026 版"
prs.save("demo.pptx")
print("已生成 demo.pptx")
跑完你会得到一个 demo.pptx,双击打开就是一张干净的标题页。这里几个词先记一下:slide_layouts[0] 是"标题封面"版式,shapes.title 是那行大标题,placeholders[1] 是下面的副标题框。就这么几行,已经比手动点快太多了,而且改个字重新跑就行,绝不手抖排错版。
一次造十页:把清单变成 PPT
真正省时间的是批量。假设你有一周的工作要点,每条是个小标题加几条内容,用循环就能一页一页自动生成,再也不用一个框一个框地粘。
from pptx import Presentation
pages = [
("周一:环境搭好了", ["装好 Python 3.13", "配好编辑器", "跑通第一个 hello"]),
("周二:自动化脚本", ["写了整理桌面小工具", "加了定时任务", "测试通过"]),
("周三:公众号草稿", ["用模板批量生成", "代码块不塌行", "推送到草稿箱"]),
]
prs = Presentation()
for title, points in pages:
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = title
body = slide.placeholders[1].text_frame
body.text = points[0]
for p in points[1:]:
para = body.add_paragraph()
para.text = p
prs.save("weekly.pptx")
print(f"已生成 weekly.pptx,共 {len(pages)} 页")
slide_layouts[1] 是"标题 + 内容"版式。第一句用 body.text 直接写,后面的要点用 add_paragraph() 一行行加,自动变成项目符号列表。你以后只改最上面那个 pages 列表,PPT 内容全听它的,三十页也就是改三十行的事。
真实场景:把周报要点变成汇报 PPT
写死在代码里不够实用,我们把要点放进一个 txt 文件,脚本读出来造 PPT,这样不太会写代码的同事也能用。week_bullets.txt 这么写,一行一个要点,带"- "的是内容,不带的是新页标题:
周一:环境搭好了
- 装好 Python 3.13
- 配好编辑器
周二:自动化脚本
- 写了整理桌面小工具
- 加了定时任务
然后脚本读它,自动按标题分页:
from pptx import Presentation
prs = Presentation()
current_title = None
buf = []
with open("week_bullets.txt", encoding="utf-8") as f:
for line in f:
line = line.rstrip("\n")
if not line.strip():
continue
if not line.startswith("- "):
if current_title:
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = current_title
tf = slide.placeholders[1].text_frame
tf.text = buf[0] if buf else ""
for b in buf[1:]:
para = tf.add_paragraph()
para.text = b
current_title = line
buf = []
else:
buf.append(line[2:])
if current_title:
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = current_title
tf = slide.placeholders[1].text_frame
tf.text = buf[0] if buf else ""
for b in buf[1:]:
para = tf.add_paragraph()
para.text = b
prs.save("周报.pptx")
print("已生成 周报.pptx")
逻辑很直白:遇到不带"- "的行就当成新页标题,带"- "的归到当前页;读到最后再补一页。周报从"憋一下午"变成"填个清单、跑一下",你只核对内容对不对,排版全交给脚本。
中文别乱码:给字体定个规矩
python-pptx 默认字体在中文系统常显示成方块或跑版,加个统一设置最稳。写一个 set_cjk 帮手,给每个文本框换上微软雅黑。
from pptx import Presentation
from pptx.util import Pt
def set_cjk(shape, font_name="微软雅黑", size=18):
for para in shape.text_frame.paragraphs:
for run in para.runs:
run.font.name = font_name
run.font.size = Pt(size)
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = "中文标题不乱码"
tf = slide.placeholders[1].text_frame
tf.text = "第一点"
p = tf.add_paragraph(); p.text = "第二点"
set_cjk(slide.shapes.title, size=28)
set_cjk(slide.placeholders[1], size=18)
prs.save("cjk.pptx")
print("已生成 cjk.pptx")
注意 run.font.name 改的是"已经有文字"的那部分,所以顺序一定先写文字、再统一调字体,别反了。Windows 用"微软雅黑",Mac 换成"PingFang SC",Linux 用"Noto Sans CJK SC",换名字就行。
常见坑:这几个地方最容易翻车
• 装完 import 报错:确认装的是 python-pptx,可导入名却是 pptx,别写成 import python_pptx。
• 中文变方块:按上面 set_cjk 给每个文本框设中文字体,别只设了标题忘了正文。
• 想加图片:slide.shapes.add_picture("图.png", left, top, width) 直接塞进去,位置用 Inches 或 Pt 定,记得先 from pptx.util import Inches。
• 想换配色:每个 shape 有 fill.fore_color.rgb,可以改背景和方块颜色,轻松做出公司品牌风。
• 保存路径:prs.save 写相对路径就生成在脚本旁边;想放别处写全路径,比如 r"D:/汇报/周报.pptx",Windows 路径前加 r 防转义。
跑通了,接下来怎么玩
你现在手里有了"数据 → PPT"的流水线。可以接 CSV:用 pandas 读一行行记录,循环造页;可以接模板:先把公司 logo、配色定好,每次只换文字;还能定时:每周五下班前自动跑一遍,周一直接拿去讲。我第一个拿它做的是周报,原来憋一下午,现在填完清单喝口水的功夫就出来了。你打算先拿它造点啥?是课件、汇报还是产品介绍,评论区告诉我,下期挑一个手把手教你。