1. 什么是 python-pptx? #

2. 核心概念 #

对象 含义 常用操作
Presentation 整个 PPT 文件 Presentation()、save()
Slide 一张幻灯片 slides.add_slide(layout)
Layout 幻灯片版式 slide_layouts[0] 标题页、[1] 标题+内容
Shape 幻灯片上的元素 标题、文本框、图片、表格

3. 环境准备 #

3.1 安装 #

# 说明:安装 python-pptx 和 pillow
py -m pip install python-pptx pillow

3.2 验证安装 #

# -*- coding: utf-8 -*-
# 说明:从 pptx 导入 Presentation
from pptx import Presentation

# 说明:创建空白演示文稿
doc = Presentation()

# 说明:添加一张标题版式幻灯片
doc.add_slide(doc.slide_layouts[0])

# 说明:保存为 test.pptx
doc.save("test.pptx")

# 说明:打印成功提示
print("已创建 test.pptx,安装成功")

4. 创建与读取 PPT #

# -*- coding: utf-8 -*-
# 说明:从 pptx 导入 Presentation
from pptx import Presentation

# 说明:创建空白 PPT
prs = Presentation()

# 说明:添加封面页(版式 0)
slide = prs.slides.add_slide(prs.slide_layouts[0])
slide.shapes.title.text = "Python 自动化 PPT"
slide.placeholders[1].text = "基于 python-pptx"

# 说明:添加「标题+内容」页(版式 1)
slide2 = prs.slides.add_slide(prs.slide_layouts[1])
slide2.shapes.title.text = "项目概述"
slide2.placeholders[1].text = "第一条要点\n第二条要点"

# 说明:保存 PPT
prs.save("demo.pptx")
print(f"已保存 demo.pptx,共 {len(prs.slides)} 页")

# 说明:重新打开并读取标题
prs2 = Presentation("demo.pptx")
for i, s in enumerate(prs2.slides, 1):
    title = s.shapes.title.text if s.shapes.title else "(无标题)"
    print(f"第 {i} 页:{title}")

5. 文本格式 #

# -*- coding: utf-8 -*-
# 说明:导入 Presentation
from pptx import Presentation

# 说明:导入 Inches 和 Pt 尺寸单位
from pptx.util import Inches, Pt

# 说明:导入文本对齐枚举
from pptx.enum.text import PP_ALIGN

# 说明:导入 RGB 颜色
from pptx.dml.color import RGBColor

# 说明:创建 PPT
prs = Presentation()

# 说明:添加空白幻灯片(版式 6)
slide = prs.slides.add_slide(prs.slide_layouts[6])

# 说明:添加文本框,参数为左、上、宽、高(英寸)
box = slide.shapes.add_textbox(Inches(1), Inches(1), Inches(8), Inches(3))
tf = box.text_frame

# 说明:设置第一段为居中蓝色标题
p1 = tf.paragraphs[0]
p1.text = "报告标题"
p1.alignment = PP_ALIGN.CENTER
p1.runs[0].font.size = Pt(28)
p1.runs[0].font.bold = True
p1.runs[0].font.color.rgb = RGBColor(0, 102, 204)

# 说明:添加正文段落
p2 = tf.add_paragraph()
p2.text = "正文内容"
p2.level = 0

# 说明:添加二级项目符号段落
p3 = tf.add_paragraph()
p3.text = "二级要点"
p3.level = 1

# 说明:保存 PPT
prs.save("text_format.pptx")
print("已保存 text_format.pptx")

6. 插入图片 #

# -*- coding: utf-8 -*-
# 说明:导入 os
import os

# 说明:导入 Presentation
from pptx import Presentation

# 说明:导入 Inches
from pptx.util import Inches

# 说明:创建 PPT
prs = Presentation()

# 说明:添加空白页
slide = prs.slides.add_slide(prs.slide_layouts[6])

# 说明:图片路径
img_path = "logo.png"

# 说明:存在则插入图片,否则写占位文字
if os.path.exists(img_path):
    slide.shapes.add_picture(img_path, Inches(1), Inches(1), width=Inches(4))
else:
    slide.shapes.add_textbox(Inches(1), Inches(1), Inches(4), Inches(1)).text = "请放置 logo.png"

# 说明:保存 PPT
prs.save("image.pptx")
print("已保存 image.pptx")

7. 表格 #

# -*- coding: utf-8 -*-
# 说明:导入 Presentation
from pptx import Presentation

# 说明:导入 Inches
from pptx.util import Inches

# 说明:表格数据(含表头)
rows = [
    ["产品", "Q1", "Q2", "Q3"],
    ["A", "120", "150", "180"],
    ["B", "90", "110", "140"],
]

# 说明:创建 PPT
prs = Presentation()

# 说明:添加空白页
slide = prs.slides.add_slide(prs.slide_layouts[6])

# 说明:添加表格,参数:行数、列数、位置、宽高
table_shape = slide.shapes.add_table(
    len(rows), len(rows[0]), Inches(0.5), Inches(1.5), Inches(9), Inches(3)
)
table = table_shape.table

# 说明:逐单元格写入数据
for r, row in enumerate(rows):
    for c, val in enumerate(row):
        table.cell(r, c).text = val

# 说明:保存 PPT
prs.save("table.pptx")
print("已保存 table.pptx")

8. 实战:批量生成报告 #

# -*- coding: utf-8 -*-
# 说明:导入 Presentation
from pptx import Presentation


def build_report(title: str, bullets: list[str], table_rows: list[list], output: str):
    """根据数据生成含封面、摘要、表格的报告 PPT。"""
    # 说明:创建空白演示文稿
    prs = Presentation()

    # 说明:添加封面页
    s0 = prs.slides.add_slide(prs.slide_layouts[0])
    s0.shapes.title.text = title
    s0.placeholders[1].text = "自动生成"

    # 说明:添加摘要要点页
    s1 = prs.slides.add_slide(prs.slide_layouts[1])
    s1.shapes.title.text = "摘要"
    tf = s1.placeholders[1].text_frame
    tf.text = bullets[0]
    for b in bullets[1:]:
        tf.add_paragraph().text = b

    # 说明:添加表格页
    from pptx.util import Inches
    s2 = prs.slides.add_slide(prs.slide_layouts[6])
    t = s2.shapes.add_table(
        len(table_rows), len(table_rows[0]),
        Inches(0.5), Inches(1.5), Inches(9), Inches(3)
    ).table
    for r, row in enumerate(table_rows):
        for c, val in enumerate(row):
            t.cell(r, c).text = str(val)

    # 说明:保存到指定文件
    prs.save(output)


# 说明:待生成的报告数据
reports = [
    {
        "title": "华东区 Q1 报告",
        "bullets": ["营收增长 12%", "新客户 320 家"],
        "table": [["指标", "数值"], ["营收", "1200万"], ["客户", "320"]],
        "file": "report_east.pptx",
    },
    {
        "title": "华南区 Q1 报告",
        "bullets": ["营收增长 8%", "新客户 210 家"],
        "table": [["指标", "数值"], ["营收", "980万"], ["客户", "210"]],
        "file": "report_south.pptx",
    },
]

# 说明:循环生成每份报告
for r in reports:
    build_report(r["title"], r["bullets"], r["table"], r["file"])
    print("已生成:", r["file"])

9. 常见问题 #

9.1 无法删除幻灯片 #

9.2 布局编号对不上 #

9.3 图表与复杂排版 #

9.4 字体与路径 #

10. API 速查 #

操作 写法
创建 PPT prs = Presentation()
打开 PPT prs = Presentation("a.pptx")
添加幻灯片 prs.slides.add_slide(prs.slide_layouts[1])
设标题 slide.shapes.title.text = "标题"
设正文占位符 slide.placeholders[1].text = "内容"
添加文本框 slide.shapes.add_textbox(Inches(1), Inches(1), Inches(8), Inches(2))
插入图片 slide.shapes.add_picture("a.png", Inches(1), Inches(1), width=Inches(4))
添加表格 slide.shapes.add_table(rows, cols, ...)
写单元格 table.cell(0, 0).text = "值"
保存 prs.save("out.pptx")
字体大小 run.font.size = Pt(24)
字体颜色 run.font.color.rgb = RGBColor(255, 0, 0)