前言
在办公场景中,PPT 演示文稿的批量生成与修改是常见需求。Python 凭借其丰富的生态库,成为实现此类自动化的首选工具。本文将深入讲解如何使用 python-pptx 库进行 PPT 的基础操作,涵盖文档结构、幻灯片管理、文本样式设置以及媒体元素插入。
本文介绍如何使用 Python 的 python-pptx 库进行 PPT 自动化操作。内容涵盖 PPT 文档结构解析、幻灯片创建与删除、文本框插入及样式配置。通过详细代码示例,演示了如何设置字体、颜色、对齐方式及背景填充。此外还补充了图片与表格插入的完整实现方案,并提供了一个综合性的项目实战脚本,帮助开发者快速掌握批量生成 PPT 文件的核心技巧。

在办公场景中,PPT 演示文稿的批量生成与修改是常见需求。Python 凭借其丰富的生态库,成为实现此类自动化的首选工具。本文将深入讲解如何使用 python-pptx 库进行 PPT 的基础操作,涵盖文档结构、幻灯片管理、文本样式设置以及媒体元素插入。
操作 PPT 最核心的依赖库是 python-pptx。请在虚拟环境中安装该库:
pip3 install python-pptx
在编写代码前,需要导入必要的模块:
from pptx import Presentation
from pptx.util import Inches, Cm, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
from pptx.enum.shapes import MSO_SHAPE_TYPE
理解 PPT 的对象模型是自动化操作的前提。一个 PPT 文件对应一个 Presentation 对象,它包含多个 Slide(幻灯片)对象。每张幻灯片的内容由各种形状 Shape 组成,包括文字框、图片、占位符、表格和普通形状等。
使用 Presentation 对象的 slide_layouts 属性可以获取内置的母版样式。通常有 11 种标准版式,索引从 0 开始:
开发者也可以通过自定义占位符 (PlaceHolder) 来满足特定场景需求。获取版式示例如下:
# 获取第 1 个版式(索引从 0 开始)
slide_layout = presentation.slide_layouts[1]
添加幻灯片需遵循三步走策略:实例化 Presentation 对象 -> 选择版式 Layout -> 调用 add_slide 方法。
def add_slide(presentation, slide_style_index):
"""
在 PPT 文档中,以内置的版式添加幻灯片
:param presentation: 文档对象
:param slide_style_index: 版式索引
:return: 新创建的幻灯片对象
"""
# 获取指定索引的版式
slide_layout = presentation.slide_layouts[slide_style_index]
# 通过样式 Layout 新增一张幻灯片
slide = presentation.slides.add_slide(slide_layout)
return slide
# 使用示例
# slide1 = add_slide(self.presentation, 0) # 标题页
# slide2 = add_slide(self.presentation, 1) # 标题 + 内容
Presentation 对象的 slides 属性返回所有幻灯片对象的列表。可以通过索引访问特定幻灯片。
def get_slides(presentation):
"""获取所有的幻灯片及数量"""
slides = list(presentation.slides)
slide_num = len(slides)
return slides, slide_num
def get_slide(presentation, slide_index):
"""根据索引获取某一个幻灯片"""
slides, _ = get_slides(presentation=presentation)
if 0 <= slide_index < len(slides):
return slides[slide_index]
return None
# 使用示例
slides, count = get_slides(presentation)
print(f'当前共有 {count} 张幻灯片')
current_slide = get_slide(presentation, 1)
删除幻灯片需要直接操作底层的 _sldIdLst 列表,移除指定索引的元素。
def del_slide(presentation, slide_index=0):
"""删除某一张幻灯片"""
# 获取所有幻灯片的 ID 列表
slides = list(presentation.slides._sldIdLst)
# 检查索引有效性
if 0 <= slide_index < len(slides):
presentation.slides._sldIdLst.remove(slides[slide_index])
return True
return False
# 使用示例:删除第 4 张幻灯片 (索引为 3)
del_slide(presentation, 3)
首先需要指定幻灯片对象 Slide,利用 slide.shapes 属性获取形状队列,然后调用 add_textbox 函数。
def insert_textbox(slide, left, top, width, height, unit=Cm):
"""
幻灯片中添加文本框
:param unit: 单位,默认设置为 Cm (厘米)
:param slide: 幻灯片对象
:param left: 左边距
:param top: 上边距
:param width: 宽度
:param height: 高度
:return: 文本框对象,文本框形状对象
"""
textbox = slide.shapes.add_textbox(
left=unit(left),
top=unit(top),
width=unit(width),
height=unit(height)
)
tf = textbox.text_frame
return textbox, tf
文本框创建后自带一个段落对象。可以直接设置 .text 属性,或使用 add_paragraph() 添加新段落。
# 插入文本框
textbox, tf = insert_textbox(slide, 8, 2, 10, 4, unit=Cm)
# 设置默认段落内容
paragraph_default = tf.paragraphs[0]
paragraph_default.text = "这是第一段内容"
# 添加新段落
paragraph_new = tf.add_paragraph()
paragraph_new.text = "这是第二段内容"
支持设置字体名称、颜色、大小、加粗、斜体以及对齐方式。
def set_font_style(font, font_name=None, font_color=None, font_size=-1, font_bold=False, font_italic=False):
"""设置字体样式"""
if font_name:
font.name = font_name
if font_color and len(font_color) == 3:
font.color.rgb = RGBColor(font_color[0], font_color[1], font_color[2])
if font_size != -1:
font.size = Pt(font_size)
font.bold = font_bold
font.italic = font_italic
def set_paragraph_style(paragraph, alignment=PP_ALIGN.LEFT):
"""设置段落样式"""
paragraph.alignment = alignment
for run in paragraph.runs:
set_font_style(run.font, font_name='Microsoft YaHei', font_color=(0, 0, 0), font_size=14)
可以为文本框、表格单元格或普通形状设置纯色背景。
def set_widget_bg(widget, bg_rgb_color=None):
"""设置【文本框/单元格/形状】的背景颜色"""
if bg_rgb_color and len(bg_rgb_color) == 3:
widget.fill.solid()
widget.fill.fore_color.rgb = RGBColor(bg_rgb_color[0], bg_rgb_color[1], bg_rgb_color[2])
# 设置绿色背景
set_widget_bg(textbox, [0, 255, 0])
当文字过长时,可通过设置 word_wrap 属性实现自动换行。
tf.word_wrap = True
除了文本,PPT 自动化常涉及图片和表格的处理。
使用 add_picture 方法,需指定图片路径和尺寸。
def add_image(slide, image_path, left, top, width, height):
"""在幻灯片插入图片"""
slide.shapes.add_picture(
image_path,
left=Inches(left),
top=Inches(top),
width=Inches(width),
height=Inches(height)
)
使用 add_table 方法,可指定行数、列数及位置。
def add_table(slide, rows, cols, left, top, width, height):
"""在幻灯片插入表格"""
table = slide.shapes.add_table(rows, cols, Inches(left), Inches(top), Inches(width), Inches(height)).table
# 填充数据示例
for i in range(rows):
for j in range(cols):
cell = table.cell(i, j)
cell.text = f'Row {i}, Col {j}'
return table
以下是一个综合脚本,演示如何创建一个包含标题页、内容页、图片和表格的完整 PPT 文件。
from pptx import Presentation
from pptx.util import Inches, Cm, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
def create_ppt_demo(output_path):
prs = Presentation()
# 1. 添加标题页
slide_layout = prs.slide_layouts[0] # Title Slide
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
subtitle = slide.placeholders[1]
title.text = "Python 自动化演示"
subtitle.text = "基于 python-pptx 库"
# 2. 添加内容页
slide_layout = prs.slide_layouts[1] # Title and Content
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
title.text = "功能概览"
body = slide.placeholders[1]
tf = body.text_frame
p = tf.paragraphs[0]
p.text = "1. 幻灯片管理"
p.font.bold = True
p2 = tf.add_paragraph()
p2.text = "2. 文本样式控制"
p2.font.bold = True
p3 = tf.add_paragraph()
p3.text = "3. 多媒体元素插入"
p3.font.bold = True
# 3. 保存文件
prs.save(output_path)
print(f'PPT 已保存至:{output_path}')
if __name__ == '__main__':
create_ppt_demo('demo_output.pptx')
python-pptx 默认支持 Inches (英寸)、Cm (厘米)、Pt (磅)。建议统一使用一种单位以避免布局错乱。本文详细讲解了 Python 操作 PPT 的基础架构与核心 API。掌握了幻灯片增删改查、文本样式配置以及基础媒体插入后,即可应对大部分办公自动化场景。后续章节将深入探讨图表绘制、动画效果及复杂报表生成等高级主题。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online