python-pptx 库(最常用,适合生成/修改 PPT 文件)
1. 使用 python-pptx
库(最常用,适合生成/修改 PPT 文件)
📦 安装:
pip install python-pptx
📌 功能:
创建新的 PPT
新增/删除幻灯片
插入文字、图片、表格、图表
设置文字样式、布局
🔧 示例:
from pptx import Presentation from pptx.util import Inches, Pt # 创建 PPT prs = Presentation() # 添加一张幻灯片 slide_layout = prs.slide_layouts[0] # 标题页 slide = prs.slides.add_slide(slide_layout) # 设置标题和副标题 title = slide.shapes.title subtitle = slide.placeholders[1] title.text = "Python 操作 PPT" subtitle.text = "使用 python-pptx" # 再加一张幻灯片(空白) blank_slide_layout = prs.slide_layouts[6] slide2 = prs.slides.add_slide(blank_slide_layout) # 添加文本框 left = top = Inches(2) width = height = Inches(4) txBox = slide2.shapes.add_textbox(left, top, width, height) tf = txBox.text_frame tf.text = "这是一个文本框" # 改变字体 p = tf.add_paragraph() p.text = "Hello PowerPoint!" p.font.bold = True p.font.size = Pt(28) # 保存 prs.save("demo.pptx")
2. 使用 win32com(仅限 Windows)
如果你需要 控制已经安装的 PowerPoint 软件(比如打开 PPT,播放幻灯片),可以用 pywin32
。
📦 安装:
pip install pywin32
🔧 示例:
import win32com.client # 打开 PowerPoint ppt = win32com.client.Dispatch("PowerPoint.Application") ppt.Visible = True # 新建演示文稿 presentation = ppt.Presentations.Add() # 添加一张幻灯片 slide = presentation.Slides.Add(1, 1) # 1: ppLayoutTitle slide.Shapes.Title.TextFrame.TextRange.Text = "Python 控制 PPT" slide.Shapes.Placeholders(2).TextFrame.TextRange.Text = "副标题" # 保存 presentation.SaveAs(r"C:\Users\YourName\Desktop\demo_win32.pptx") presentation.Close() ppt.Quit()
对比
python-pptx
:跨平台,适合 批量生成 和 修改文件。win32com
:只能在 Windows 上用,适合 操作 PowerPoint 软件 本身(比如打开、播放、截图)。
from pptx import Presentation prs = Presentation()
这里的 prs
不是一个包,而是 Presentation
类的实例。
真正的包是 python-pptx
,它的顶层模块是 pptx
。
1. python-pptx
包的结构
当你 import pptx
的时候,里面主要包含这些子模块:
pptx.presentation
提供
Presentation
类(整个 PPT 文档对象)
pptx.slide
提供
Slide
(幻灯片对象)、SlideLayout
、SlideMaster
pptx.shapes
shapes.autoshape
:常规形状(矩形、圆形等)shapes.picture
:图片shapes.graphfrm
:图表shapes.table
:表格shapes.text
:文本框、段落、字体
pptx.chart
图表相关(柱状图、折线图、饼图等)
pptx.dml
绘图和格式(颜色、线条、填充)
pptx.enum
枚举类型(对齐方式、占位符类型等)
pptx.oxml
低层级的 XML 元素(对应 Office OpenXML)
pptx.parts
文档部件(PPTX 文件内部的部分)
pptx.util
工具(
Inches
,Pt
,Cm
等单位换算)
2. Presentation
(也就是 prs
)对象的属性
当你写 prs = Presentation()
后,prs
就是 演示文稿对象,里面有几个核心属性:
prs.slides
幻灯片集合(Slide
对象列表).add_slide(layout)
:新增幻灯片[i]
:按索引取幻灯片
prs.slide_layouts
可用的幻灯片布局集合(标题页、标题+内容、空白页等)prs.core_properties
文档属性(作者、标题、关键词)prs.save("file.pptx")
保存为 PPTX 文件
3. Slide
对象的子内容
slide.shapes
:所有形状(文本框、图片、表格等)slide.placeholders
:占位符(标题、副标题等)slide.notes_slide
:备注页
4. Shape
对象常用分类
.text_frame
:文本框.table
:表格.chart
:图表.picture
:图片
📌 总结一下:
prs
其实是pptx.Presentation
的实例,不是包。真正的包是
pptx
,它下面有presentation
、slide
、shapes
、chart
、util
等子模块。
要不要我给你画一张 结构图(包 → 类 → 方法),这样你能直观看到 pptx
里的层次关系?
您说:
我现在想要实现所有的内容全部使用占位符,那么这个时候我该怎么实现呢
ChatGPT 说:
好问题 👍
如果你希望 所有内容都通过占位符(placeholder)来填充,核心思路就是:
先准备一个 PPT 模板(.pptx),里面定义好所有版式(标题、副标题、内容、图片位置、表格位置……)。
因为
python-pptx
只能填充已有占位符,不能自己新建“真正的占位符”。占位符是在 PowerPoint 里由版式 (Slide Layout) 定义的。
在 Python 中加载模板,按需要选择对应的版式。
通过
slide.placeholders
来填充内容。
基础用法
from pptx import Presentation # 打开已有模板 prs = Presentation("template.pptx") # 选择第一个版式(比如标题页) slide_layout = prs.slide_layouts[0] slide = prs.slides.add_slide(slide_layout) # 填充标题占位符(一般是 0) title = slide.placeholders[0] title.text = "这是标题" # 填充副标题(一般是 1) subtitle = slide.placeholders[1] subtitle.text = "这是副标题" # 再添加一个内容页(例如第 1 号版式:标题+内容) content_layout = prs.slide_layouts[1] slide2 = prs.slides.add_slide(content_layout) # 填充内容占位符 title2 = slide2.placeholders[0] content = slide2.placeholders[1] title2.text = "内容页标题" content.text = "这里是内容占位符的文字"
检查占位符 ID
有时候不知道模板里 哪个编号对应哪个占位符,可以打印出来:
for idx, placeholder in enumerate(slide.placeholders): print(f"索引 {idx}, 占位符类型: {placeholder.placeholder_format.type}")
输出会显示每个占位符的 索引 和 类型(标题、副标题、正文、图片等)。
这样你就能确认用 placeholders[i]
来填充。
填充表格、图片占位符
如果模板里有表格或图片占位符,也能直接填充:
# 表格占位符 table_ph = slide.placeholders[2] # 具体索引要用上面的打印确认 table = table_ph.insert_table(rows=3, cols=3).table table.cell(0,0).text = "表头1" table.cell(1,0).text = "数据1" # 图片占位符 img_ph = slide.placeholders[3] img_ph.insert_picture("example.png")
总结
✅ 步骤:
在 PPT 模板 里设计好占位符。
在 Python 里通过
slide_layouts
选择版式。用
slide.placeholders[i].text / insert_picture / insert_table
来填充内容。
要不要我帮你写一个 通用函数,比如传入一个字典 {占位符编号: 内容}
,就能自动把一页幻灯片填好?这样就可以灵活批量生成。