← 返回自动化办公目录
← 返回学习笔记首页
专题: Python 自动化办公系统学习
关键词: Python, 自动化办公, python-pptx, PPT自动化, 幻灯片, 演示文稿, 图表, Python办公
一、python-pptx概述
python-pptx是Python生态中最成熟的PowerPoint文件操作库,支持创建和修改.pptx格式的演示文稿。该库提供了从幻灯片创建、内容填充到样式定制的完整API,让开发者能够用代码完全替代手动制作PPT的繁琐过程。python-pptx的底层基于Open XML标准,直接操作PPTX压缩包中的XML文件,因此能够精确控制演示文稿的每一个细节。
安装python-pptx非常简单,通过pip即可完成:pip install python-pptx。该库依赖较少,安装后即可导入使用。核心模块是pptx包,其中包含Presentation(演示文稿)、Slide(幻灯片)、Shape(形状)、Placeholder(占位符)等核心类。理解python-pptx的对象模型是高效使用的前提:Presentation是整个文档的根对象,包含一组Slide;每个Slide包含多个Shape;Shape可以是文本框、图片、表格、图表等具体类型;Placeholder是SlideLayout中预定义的占位区域。
python-pptx的版本兼容性良好,支持Python 3.6+,并能处理.pptx格式的全部核心功能。值得注意的是,该库不支持.ppt(旧版)格式,因此在处理老文件时需要先通过PowerPoint进行格式转换。在日常办公自动化场景中,python-pptx常用于批量生成汇报材料、自动填充数据报表、创建标准化培训课件等工作,极大提升了演示文稿的制作效率。
# 安装python-pptx
pip install python-pptx
# 验证安装
import pptx
print(pptx.__version__)
# python-pptx 核心对象模型
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
from pptx.enum.chart import XL_CHART_TYPE
# Presentation 是根对象
prs = Presentation() # 新建空白演示文稿
# prs = Presentation('input.pptx') # 打开已有文件
# 通过prs访问所有内容
print(f"幻灯片总数: {len(prs.slides)}")
print(f"幻灯片宽度: {prs.slide_width}")
print(f"幻灯片高度: {prs.slide_height}")
# 保存文件
prs.save('output.pptx')
# Slides -> Shapes -> 层次遍历
from pptx import Presentation
prs = Presentation()
slide_layout = prs.slide_layouts[0] # 标题幻灯片布局
slide = prs.slides.add_slide(slide_layout)
# 遍历幻灯片中的所有形状
for shape in slide.shapes:
print(f"形状名称: {shape.name}")
print(f"形状类型: {shape.shape_type}")
print(f"位置: left={shape.left}, top={shape.top}")
print(f"尺寸: width={shape.width}, height={shape.height}")
if shape.has_text_frame:
print(f"文本: {shape.text_frame.text}")
二、演示文稿操作
演示文稿的基本操作包括新建、打开和保存,这是使用python-pptx的起点。创建Presentation对象时不传参数会生成一个包含一张空白标题幻灯片的演示文稿,传入.pptx文件路径则可打开已有文件进行编辑。保存时调用prs.save('path.pptx'),python-pptx会将所有修改写回文件。如果需要另存为,只需传不同的路径即可。值得注意的是,保存操作会覆盖目标文件,建议在重要操作前备份原始文件。
页面设置是演示文稿创建的关键环节。python-pptx使用prs.slide_width和prs.slide_height控制幻灯片尺寸,单位是英制单位(EMU)。常用尺寸包括标准4:3比例(10 x 7.5英寸)和宽屏16:9比例(13.333 x 7.5英寸)。通过pptx.util.Inches和pptx.util.Cm可以方便地进行单位换算。幻灯片尺寸需要在添加任何内容之前设置,因为后续的布局和占位符位置都依赖于这个基准尺寸。
主题设置可以通过修改幻灯片母版或直接设置形状样式来实现。python-pptx本身不提供直接应用内置主题的API,但可以通过复制已有主题的模板文件,或手动设置各元素的颜色、字体、效果来实现一致的外观风格。实践中更常用的做法是准备一个包含目标主题的空白模板文件,然后在模板基础上添加内容,这样既保留了主题风格,又实现了内容的自动填充。
# 新建演示文稿并设置页面尺寸
from pptx import Presentation
from pptx.util import Inches, Cm, Pt
prs = Presentation()
# 设置宽屏16:9尺寸(默认即为16:9)
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
print(f"宽度: {prs.slide_width} EMU = {prs.slide_width / 914400:.2f} 英寸")
print(f"高度: {prs.slide_height} EMU = {prs.slide_height / 914400:.2f} 英寸")
# 使用厘米单位设置4:3比例
prs.slide_width = Cm(25.4) # 10英寸
prs.slide_height = Cm(19.05) # 7.5英寸
prs.save('sized_presentation.pptx')
# 基于模板创建演示文稿
from pptx import Presentation
# 打开已有模板(包含主题、母版、配色)
prs = Presentation('company_template.pptx')
print(f"模板幻灯片布局数量: {len(prs.slide_layouts)}")
for i, layout in enumerate(prs.slide_layouts):
print(f" 布局 {i}: {layout.name}")
# 基于模板添加内容
slide_layout = prs.slide_layouts[1] # 标题和内容布局
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
title.text = "基于模板创建的新幻灯片"
# 保存为新文件,原模板不受影响
prs.save('report_2026.pptx')
# 完整页面设置参数
from pptx import Presentation
from pptx.util import Inches
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
# 查看所有内置布局
for i, layout in enumerate(prs.slide_layouts):
placeholders = [ph for ph in layout.placeholders]
print(f"布局 {i}: {layout.name} ({len(placeholders)} 个占位符)")
# 常用幻灯片尺寸对照
sizes = {
"4:3 标准": (Inches(10), Inches(7.5)),
"16:9 宽屏": (Inches(13.333), Inches(7.5)),
"16:10": (Inches(13.333), Inches(8.333)),
"A4": (Inches(10.833), Inches(7.5)),
"横幅": (Inches(11.25), Inches(7.5)),
}
for name, (w, h) in sizes.items():
print(f"{name}: {w/914400:.1f}x{h/914400:.1f} 英寸")
三、幻灯片管理
幻灯片管理是PPT自动化的核心功能之一。python-pptx通过prs.slides集合管理所有幻灯片,提供add_slide()方法添加新幻灯片,该方法需要传入一个SlideLayout对象作为布局模板。内置的布局模板通过prs.slide_layouts[index]访问,索引0到10分别对应不同类型的布局,如标题幻灯片(0)、标题和内容(1)、节标题(2)、空白(6)等。选择正确的布局是生成规范PPT的关键一步。
删除幻灯片在python-pptx中并不直接支持,但可以通过操作XML底层来实现。核心思路是获取幻灯片的XML元素,然后从幻灯片树中移除该元素。复制幻灯片的实现也类似,需要深拷贝幻灯片的相关XML节点并插入到合适位置。这些高级操作需要开发者对PPTX的XML结构有一定了解,建议封装成通用工具函数以便复用。幻灯片排序可以通过重新排列prs.slides._sldIdLst中的元素来实现。
幻灯片隐藏功能可以通过设置幻灯片的show属性实现。隐藏后的幻灯片在演示时不会显示,但在编辑界面仍然可见。这在制作包含备用内容或附录的演示文稿时非常有用。批量操作时,可以遍历所有幻灯片,根据条件进行统一设置,如隐藏所有指定章节的幻灯片。
# 添加和管理幻灯片
from pptx import Presentation
from pptx.enum.slides import PP_PLACEHOLDER
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
# 添加不同类型布局的幻灯片
layouts = prs.slide_layouts
slide1 = prs.slides.add_slide(layouts[0]) # 标题幻灯片
slide1.shapes.title.text = "2026年度工作总结"
slide2 = prs.slides.add_slide(layouts[1]) # 标题和内容
slide2.shapes.title.text = "核心业绩指标"
# 填充内容占位符
content = slide2.placeholders[1]
content.text = "• 营收同比增长35%\n• 用户规模突破500万\n• 市场占有率提升至28%"
slide3 = prs.slides.add_slide(layouts[6]) # 空白布局
print(f"幻灯片总数: {len(prs.slides)}")
# 幻灯片删除与复制(通过操作XML)
from pptx import Presentation
from lxml import etree
prs = Presentation()
# 先添加几张幻灯片做测试
for i in range(5):
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide.shapes.title.text = f"第{i+1}页"
print(f"删除前: {len(prs.slides)} 页")
# 删除第2张幻灯片(索引1)
slide_id = prs.slides._sldIdLst[1].get('{http://schemas.openxmlformats.org/officeDocument/2006/relationships}id')
rId = prs.slides._sldIdLst[1].get('r:id')
prs.slides._sldIdLst.remove(prs.slides._sldIdLst[1])
# 同时移除对应的关系和文件引用(简化示例,实际需要更完整处理)
print(f"删除后: {len(prs.slides)} 页")
# 复制幻灯片工具函数(简化版本)
def duplicate_slide(prs, slide_index):
"""复制指定索引的幻灯片"""
template_slide = prs.slides[slide_index]
# 获取布局并新增
layout = prs.slide_layouts[6] # 空白布局
new_slide = prs.slides.add_slide(layout)
# 复制形状(简化处理,需根据实际需求扩展)
return new_slide
# 幻灯片批量操作与隐藏
from pptx import Presentation
from pptx.oxml.ns import qn
prs = Presentation()
for i in range(6):
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide.shapes.title.text = f"章节{i+1}"
# 隐藏指定幻灯片(设置 show=False)
slide_to_hide = prs.slides[2] # 第3张
sld = slide_to_hide._element
sld.set(qn('p:show'), '0')
# 检查幻灯片是否隐藏
for idx, slide in enumerate(prs.slides):
sld = slide._element
show = sld.get(qn('p:show'))
is_hidden = show == '0'
print(f"幻灯片 {idx+1}: {'隐藏' if is_hidden else '可见'}")
# 批量设置:隐藏所有偶数页
for idx, slide in enumerate(prs.slides):
if idx % 2 == 1:
slide._element.set(qn('p:show'), '0')
四、占位符与文本框
占位符(Placeholder)是幻灯片布局中预先定义的内容区域,当开发者添加新幻灯片时,占位符会自动出现在对应位置。通过slide.placeholders可以访问幻灯片上的所有占位符,通常索引0是标题占位符,索引1是内容占位符。设置占位符文本可以直接通过placeholder.text = "内容"完成,但如果需要精细控制文本格式,则必须使用text_frame对象进行操作。值得注意的是,并非所有布局都包含相同数量和类型的占位符,在操作前应先检查占位符是否存在。
文本框(TextBox)是在幻灯片上自由添加文本区域的更灵活方式。通过slide.shapes.add_textbox(left, top, width, height)可以在任意位置创建文本框。每个文本框包含一个TextFrame对象,TextFrame包含多个Paragraph段落,每个Paragraph又包含多个Run文本块。这种三层结构(TextFrame -> Paragraph -> Run)提供了精细的文本控制能力:Paragraph控制段落的整体属性(对齐、缩进、行距),Run控制具体的文本片段格式(字体、大小、颜色、粗细、斜体)。
字体格式设置是PPT美化的关键环节。通过Run对象的font属性,可以设置字体名称(name)、大小(size,使用Pt单位)、颜色(color.rgb,使用RGBColor)、加粗(bold)、斜体(italic)、下划线(underline)等。段落对齐通过paragraph.alignment设置为PP_ALIGN常量(LEFT、CENTER、RIGHT、JUSTIFY)。段落的行距和间距可以通过paragraph.space_before、paragraph.space_after和paragraph.line_spacing控制。这些精细控制让自动化生成的PPT具备专业级的排版效果。
# 占位符基本操作
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
prs = Presentation()
slide_layout = prs.slide_layouts[1] # 标题和内容布局
slide = prs.slides.add_slide(slide_layout)
# 访问占位符
title_placeholder = slide.shapes.title
title_placeholder.text = "产品路线图"
# 通过索引访问内容占位符
content_ph = slide.placeholders[1]
content_ph.text = "2026年Q1核心功能开发计划"
# 检查占位符类型
for ph in slide.placeholders:
print(f"占位符索引 {ph.placeholder_format.idx}: "
f"类型={ph.placeholder_format.type}, "
f"名称={ph.name}")
# 文本框与文本格式精细控制
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6]) # 空白布局
# 添加文本框
left = Inches(1)
top = Inches(1.5)
width = Inches(8)
height = Inches(3)
textbox = slide.shapes.add_textbox(left, top, width, height)
tf = textbox.text_frame
tf.word_wrap = True
# 第一段落(标题风格)
p = tf.paragraphs[0]
p.text = "项目进展报告"
p.alignment = PP_ALIGN.CENTER
p.font.size = Pt(28)
p.font.bold = True
p.font.color.rgb = RGBColor(0x2E, 0x7D, 0x32)
# 第二段落(正文)
from pptx.oxml.ns import qn
new_p = tf.add_paragraph()
new_p.text = "截止2026年4月,所有核心模块已进入测试阶段。"
new_p.font.size = Pt(16)
new_p.font.color.rgb = RGBColor(0x33, 0x33, 0x33)
new_p.alignment = PP_ALIGN.LEFT
new_p.space_before = Pt(12)
# 第三段落(带混合格式的Run)
p3 = tf.add_paragraph()
run1 = p3.add_run()
run1.text = "关键里程碑:"
run1.font.bold = True
run1.font.size = Pt(14)
run1.font.color.rgb = RGBColor(0xC0, 0x39, 0x2B)
run2 = p3.add_run()
run2.text = " 模块A已完成,模块B完成80%"
run2.font.size = Pt(14)
run2.font.color.rgb = RGBColor(0x55, 0x55, 0x55)
prs.save('text_format_demo.pptx')
# 段落与Run的深入操作
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
txBox = slide.shapes.add_textbox(Inches(0.5), Inches(0.5), Inches(9), Inches(5))
tf = txBox.text_frame
# 设置垂直居中
tf.paragraphs[0].alignment = PP_ALIGN.LEFT
# 添加多级列表样式的段落
items = [
("1. 阶段一:需求分析", RGBColor(0x2E, 0x7D, 0x32), True, Pt(18)),
(" - 用户调研与问卷设计", RGBColor(0x55, 0x55, 0x55), False, Pt(14)),
(" - 竞品分析与功能对比", RGBColor(0x55, 0x55, 0x55), False, Pt(14)),
("2. 阶段二:原型设计", RGBColor(0x2E, 0x7D, 0x32), True, Pt(18)),
(" - 低保真线框图", RGBColor(0x55, 0x55, 0x55), False, Pt(14)),
(" - 高保真交互原型", RGBColor(0x55, 0x55, 0x55), False, Pt(14)),
]
for i, (text, color, bold, size) in enumerate(items):
if i == 0:
p = tf.paragraphs[0]
else:
p = tf.add_paragraph()
p.text = text
p.font.size = size
p.font.color.rgb = color
p.font.bold = bold
p.space_after = Pt(6)
tf.vertical_anchor = MSO_ANCHOR.TOP
prs.save('rich_text.pptx')
五、表格与图表
表格是PPT中展示结构化数据的常用元素。python-pptx通过slide.shapes.add_table(rows, cols, left, top, width, height)创建表格,返回一个Table对象。Table对象提供了rows和columns集合,通过table.cell(row, col)访问具体单元格。每个单元格可以设置文本内容、字体格式、填充颜色和对齐方式。表格样式方面,可以设置表头行和隔行变色效果,还能控制表格边框的粗细和颜色。创建专业表格的关键在于合理设置列宽和行高,以及统一的数据格式。
图表是数据可视化的核心元素。python-pptx支持多种图表类型,包括柱状图、折线图、饼图、散点图、面积图等。通过slide.shapes.add_chart(type, left, top, width, height, chart_data)创建图表,其中type使用XL_CHART_TYPE枚举。图表数据通过ChartData对象来组织,调用chart_data.categories设置分类轴,chart_data.add_series()添加数据系列。创建后可通过chart.chart获取Chart对象,进行更多的样式定制。
图表样式定制包括修改图表类型、调整颜色方案、添加数据标签、设置图例位置等。通过chart.has_legend和chart.legend控制图例;通过plot = chart.plots[0]获取绘图区进行细化设置。数据标签可以通过plot.has_data_labels和plot.data_labels进行控制。对于饼图,还可以设置分离效果或显示百分比。图表的颜色可以通过修改图表系列的格式来实现,让图表与PPT的整体主题保持一致。
# 创建并样式化表格
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
# 创建表格 5行4列
rows, cols = 5, 4
table_shape = slide.shapes.add_table(rows, cols,
Inches(1), Inches(1.5), Inches(10), Inches(3.5))
table = table_shape.table
# 设置列宽(EMU单位)
table.columns[0].width = Inches(3)
table.columns[1].width = Inches(2.5)
table.columns[2].width = Inches(2.5)
table.columns[3].width = Inches(2)
# 表头数据
headers = ["部门", "Q1营收(万)", "Q2营收(万)", "同比增长"]
data = [
["技术部", "850", "920", "+8.2%"],
["市场部", "1,200", "1,450", "+20.8%"],
["运营部", "680", "730", "+7.4%"],
["产品部", "950", "1,100", "+15.8%"],
]
# 填充数据并设置格式
def set_cell(cell, text, bold=False, color=None, align=PP_ALIGN.CENTER):
cell.text = text
cell.vertical_anchor = 1 # 居中
for paragraph in cell.text_frame.paragraphs:
paragraph.alignment = align
paragraph.font.size = Pt(14)
paragraph.font.bold = bold
if color:
paragraph.font.color.rgb = color
for col_idx, header in enumerate(headers):
cell = table.cell(0, col_idx)
set_cell(cell, header, bold=True, color=RGBColor(0xFF, 0xFF, 0xFF))
cell.fill.solid()
cell.fill.fore_color.rgb = RGBColor(0x2E, 0x7D, 0x32)
for row_idx, row_data in enumerate(data):
for col_idx, value in enumerate(row_data):
cell = table.cell(row_idx + 1, col_idx)
set_cell(cell, value)
if row_idx % 2 == 0:
cell.fill.solid()
cell.fill.fore_color.rgb = RGBColor(0xE8, 0xF5, 0xE9)
prs.save('table_demo.pptx')
# 创建柱状图
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE, XL_LEGEND_POSITION
from pptx.dml.color import RGBColor
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
# 准备图表数据
chart_data = CategoryChartData()
chart_data.categories = ['1月', '2月', '3月', '4月', '5月', '6月']
chart_data.add_series('营收(万)', [120, 150, 180, 220, 260, 310])
chart_data.add_series('成本(万)', [80, 95, 110, 130, 150, 170])
# 添加图表(柱状图)
chart_frame = slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED,
Inches(1), Inches(1.5), Inches(10), Inches(5),
chart_data
)
chart = chart_frame.chart
chart.has_legend = True
chart.legend.position = XL_LEGEND_POSITION.BOTTOM
chart.legend.font.size = Pt(12)
chart.legend.include_in_layout = False
# 设置图表标题
chart.has_title = True
chart.chart_title.text_frame.paragraphs[0].text = "2026上半年经营数据"
chart.chart_title.text_frame.paragraphs[0].font.size = Pt(16)
prs.save('chart_column_demo.pptx')
# 饼图与折线图
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE, XL_LABEL_POSITION
from pptx.dml.color import RGBColor
prs = Presentation()
# ==== 饼图:市场份额 ====
slide1 = prs.slides.add_slide(prs.slide_layouts[6])
chart_data = CategoryChartData()
chart_data.categories = ['产品A', '产品B', '产品C', '产品D']
chart_data.add_series('市场份额', [35, 28, 22, 15])
chart_frame = slide1.shapes.add_chart(
XL_CHART_TYPE.PIE,
Inches(1), Inches(1), Inches(6), Inches(5),
chart_data
)
chart = chart_frame.chart
chart.has_legend = True
# 显示数据标签且带百分比
plot = chart.plots[0]
plot.has_data_labels = True
data_labels = plot.data_labels
data_labels.show_percentage = True
data_labels.show_category_name = True
data_labels.font.size = Pt(11)
# ==== 折线图:趋势分析 ====
slide2 = prs.slides.add_slide(prs.slide_layouts[6])
chart_data2 = CategoryChartData()
chart_data2.categories = ['Q1', 'Q2', 'Q3', 'Q4']
chart_data2.add_series('用户增长(万)', [50, 120, 200, 350])
chart_frame2 = slide2.shapes.add_chart(
XL_CHART_TYPE.LINE_MARKERS,
Inches(1), Inches(1), Inches(10), Inches(5),
chart_data2
)
chart2 = chart_frame2.chart
chart2.has_title = True
chart2.chart_title.text_frame.text = "2026年度用户增长趋势"
plot2 = chart2.plots[0]
plot2.has_data_labels = True
plot2.data_labels.show_value = True
prs.save('chart_pie_line.pptx')
六、图片与形状
图片是PPT演示中不可或缺的视觉元素。python-pptx通过slide.shapes.add_picture(image_path, left, top, width, height)在任意位置插入图片。支持常见的图片格式如JPEG、PNG、GIF、BMP等。插入时可以指定位置和尺寸,如果只提供width或height而不提供另一个,python-pptx会自动按比例缩放以保持图片的宽高比。裁剪功能可以通过设置图片的crop_left、crop_top、crop_right、crop_bottom属性来实现,这些属性值范围是0.0到1.0,表示裁剪掉图片对应边缘的比例。
形状绘制是丰富幻灯片视觉效果的重要手段。python-pptx支持多种预设形状,包括矩形(RECTANGLE)、圆角矩形(ROUNDED_RECTANGLE)、椭圆(OVAL)、三角形(ISOSCELES_TRIANGLE)、箭头(RIGHT_ARROW、LEFT_ARROW)、连接线(LINE)、五角星(STAR_5_POINT)等。通过slide.shapes.add_shape(type, left, top, width, height)创建形状,类型使用MSO_SHAPE枚举。每个形状都有自己的填充(fill)、轮廓(line)和阴影(shadow)样式,可以进行丰富的视觉定制。
形状的填充和轮廓设置是定制幻灯片外观的核心。填充方式包括纯色填充(solid)、渐变填充(gradient)、图案填充(pattern)和图片填充(picture)。通过shape.fill.solid()启用纯色填充,然后用fore_color.rgb设置颜色。轮廓设置通过shape.line对象控制,可以设置轮廓颜色、宽度(宽度越大越粗)和样式(实线、虚线等)。形状还可以添加文本,通过shape.text_frame操作,让形状成为图文结合的信息载体。
# 图片插入与调整
from pptx import Presentation
from pptx.util import Inches, Pt
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
# 插入图片(指定位置和尺寸)
img_path = 'company_logo.png'
try:
# 固定尺寸
pic = slide.shapes.add_picture(
img_path,
Inches(1), Inches(1),
Inches(3), Inches(2)
)
print(f"图片尺寸: {pic.width}x{pic.height}")
except FileNotFoundError:
print("图片文件未找到,请检查路径")
# 创建一个替代形状
shape = slide.shapes.add_shape(
1, Inches(1), Inches(1), Inches(3), Inches(2))
shape.fill.solid()
shape.fill.fore_color.rgb = RGBColor(0xCC, 0xCC, 0xCC)
# 图片裁剪示例(当图片存在时)
# pic.crop_left = 0.1 # 左边裁剪10%
# pic.crop_top = 0.05 # 上边裁剪5%
# pic.crop_right = 0.1 # 右边裁剪10%
# pic.crop_bottom = 0.05 # 下边裁剪5%
# 等比缩放插入(只指定宽度)
pic2 = slide.shapes.add_picture(
img_path,
Inches(5), Inches(1),
width=Inches(4) # 高度自动等比
)
prs.save('image_demo.pptx')
# 形状绘制与样式
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.shapes import MSO_SHAPE
from pptx.dml.color import RGBColor
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
# 绘制矩形 - 填充色+边框
rect = slide.shapes.add_shape(
MSO_SHAPE.RECTANGLE,
Inches(1), Inches(1), Inches(3), Inches(1.5)
)
rect.fill.solid()
rect.fill.fore_color.rgb = RGBColor(0x2E, 0x7D, 0x32)
rect.line.color.rgb = RGBColor(0x1B, 0x5E, 0x20)
rect.line.width = Pt(2)
# 添加文本到形状
rect.text_frame.text = "核心模块"
rect.text_frame.paragraphs[0].font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
rect.text_frame.paragraphs[0].font.size = Pt(16)
rect.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
# 绘制圆角矩形
round_rect = slide.shapes.add_shape(
MSO_SHAPE.ROUNDED_RECTANGLE,
Inches(5), Inches(1), Inches(3), Inches(1.5)
)
round_rect.fill.solid()
round_rect.fill.fore_color.rgb = RGBColor(0x34, 0x98, 0xDB)
round_rect.line.fill.background() # 无边框
round_rect.text_frame.text = "辅助功能"
# 绘制圆形
circle = slide.shapes.add_shape(
MSO_SHAPE.OVAL,
Inches(1), Inches(3.5), Inches(1.5), Inches(1.5)
)
circle.fill.solid()
circle.fill.fore_color.rgb = RGBColor(0xE7, 0x4C, 0x3C)
circle.line.color.rgb = RGBColor(0xC0, 0x39, 0x2B)
circle.line.width = Pt(3)
# 绘制右箭头
arrow = slide.shapes.add_shape(
MSO_SHAPE.RIGHT_ARROW,
Inches(3.5), Inches(4), Inches(2), Inches(1)
)
arrow.fill.solid()
arrow.fill.fore_color.rgb = RGBColor(0xF3, 0x9C, 0x12)
prs.save('shapes_demo.pptx')
# 连接线与流程图元素
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.shapes import MSO_SHAPE, MSO_CONNECTOR_TYPE
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
from pptx.oxml.ns import qn
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
# 创建流程图的各个节点
def add_flow_box(slide, text, left, top, width, height, color):
shape = slide.shapes.add_shape(
MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height)
shape.fill.solid()
shape.fill.fore_color.rgb = color
shape.line.color.rgb = RGBColor(0x33, 0x33, 0x33)
shape.line.width = Pt(1)
tf = shape.text_frame
tf.word_wrap = True
p = tf.paragraphs[0]
p.text = text
p.font.size = Pt(12)
p.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
p.alignment = PP_ALIGN.CENTER
return shape
# 创建3个流程节点
box1 = add_flow_box(slide, "数据采集",
Inches(0.5), Inches(2), Inches(3), Inches(1), RGBColor(0x2E, 0x7D, 0x32))
box2 = add_flow_box(slide, "数据处理",
Inches(4.5), Inches(2), Inches(3), Inches(1), RGBColor(0x29, 0x80, 0xB9))
box3 = add_flow_box(slide, "结果输出",
Inches(8.5), Inches(2), Inches(3), Inches(1), RGBColor(0xE7, 0x4C, 0x3C))
# 添加连接线(箭头通过直接绘制方式)
# 使用矩形旋转模拟箭头
connector_style = {
'fill': RGBColor(0x7F, 0x8C, 0x8D),
'width': Inches(0.08)
}
prs.save('flowchart_demo.pptx')
七、母版与布局
幻灯片母版(SlideMaster)和布局(SlideLayout)是PPT统一风格的核心机制。SlideMaster定义了整个演示文稿的全局样式,包括背景、字体方案、颜色方案和效果方案。每个Presentation有且仅有一个SlideMaster,通过prs.slide_masters访问。SlideLayout是基于母版的具体页面模板,定义了特定类型幻灯片的占位符布局和样式。python-pptx允许开发者创建和使用自定义布局,这对于需要统一品牌风格的场景尤为重要。
使用现有的SlideLayout是最简单的入门方式。python-pptx创建新演示文稿时,默认提供11个内置布局(索引0-10),涵盖了标题页、内容页、节标题、空白页等常见类型。通过prs.slide_layouts[index]可以获取特定的布局对象。每个布局包含预设的占位符(Placeholder),包括标题、正文、日期、页脚等。选择合适的布局是生成规范幻灯片的基础,可以避免繁琐的手动位置计算。
自定义布局是进阶应用的核心能力。通过创建包含自定义占位符的布局模板,可以实现高度自动化的内容填充。在实践中,常见的做法是先在PowerPoint中设计好自定义布局,将其保存为模板文件(.potx),然后基于该模板创建演示文稿。python-pptx也可以代码方式向布局添加占位符,但较为复杂。更实用的方法是准备多个精心设计的模板文件,在自动化生成时选择合适的模板,这样可以平衡灵活性与开发效率。
# 查看与管理布局
from pptx import Presentation
prs = Presentation()
# 遍历所有布局
for i, layout in enumerate(prs.slide_layouts):
ph_count = len(layout.placeholders)
ph_info = []
for ph in layout.placeholders:
ph_info.append(f" idx={ph.placeholder_format.idx}, "
f"type={ph.placeholder_format.type}, "
f"name='{ph.name}'")
print(f"布局 {i}: {layout.name} ({ph_count} 个占位符)")
for info in ph_info:
print(info)
# 使用特定布局添加幻灯片
layouts = prs.slide_layouts
slides_info = [
(layouts[0], "封面页 - 标题布局"),
(layouts[1], "内容页 - 标题+内容布局"),
(layouts[6], "自定义页 - 空白布局"),
(layouts[8], "结束页 - 仅标题布局"),
]
for layout, desc in slides_info:
slide = prs.slides.add_slide(layout)
print(f"已添加: {desc}")
if slide.shapes.title:
slide.shapes.title.text = desc
# 基于模板文件使用自定义布局
from pptx import Presentation
# 打开包含自定义布局的模板文件
# 先在PowerPoint中设计好需要的布局,保存为.potx或.pptx
prs = Presentation('custom_template.pptx')
# 查看自定义布局
print("可用布局:")
for i, layout in enumerate(prs.slide_layouts):
print(f" [{i}] {layout.name}")
# 使用自定义的"公司财报封面"布局(假设索引2)
cover_layout = prs.slide_layouts[2]
cover_slide = prs.slides.add_slide(cover_layout)
# 填充自定义布局中的占位符
for ph in cover_slide.placeholders:
if ph.placeholder_format.idx == 0: # 标题占位符
ph.text = "2026年度财务报告"
elif ph.placeholder_format.idx == 10: # 副标题或自定义占位符
ph.text = "财务部 · 2026年5月"
# 使用另一个布局添加内容页
content_layout = prs.slide_layouts[3]
content_slide = prs.slides.add_slide(content_layout)
content_slide.shapes.title.text = "营收分析"
for ph in content_slide.placeholders:
if ph.placeholder_format.idx == 1:
ph.text = ("• 全年营收同比增长25.3%\n"
"• 净利润突破2亿元\n"
"• 三大业务线均实现盈利")
prs.save('report_with_template.pptx')
# 编程方式定制布局占位符
from pptx import Presentation
from pptx.oxml.ns import qn
from lxml import etree
prs = Presentation()
# 获取空白布局
blank_layout = prs.slide_layouts[6]
# 可以直接修改布局中的占位符属性
for ph in blank_layout.placeholders:
# 可以操作占位符的XML设置默认值
sp = ph._element
# 例如设置占位符的提示文本
# 实际开发中更推荐直接操作幻灯片级别的占位符
# 基于布局添加幻灯片并调整占位符
slide = prs.slides.add_slide(blank_layout)
# 动态添加内容到幻灯片(不使用占位符)
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor
txBox = slide.shapes.add_textbox(
Inches(0.5), Inches(0.3), Inches(9), Inches(1))
tf = txBox.text_frame
p = tf.paragraphs[0]
p.text = "这是一个使用空白布局动态添加内容的示例"
p.font.size = Pt(24)
p.font.color.rgb = RGBColor(0x2E, 0x7D, 0x32)
p.font.bold = True
p.alignment = PP_ALIGN.CENTER
print("布局定制完成")
prs.save('custom_layout_demo.pptx')
八、切换与动画
幻灯片切换效果控制幻灯片之间的过渡方式,能为演示增添流畅的视觉效果。python-pptx通过slide._element操作底层XML来设置切换效果。常见的切换效果包括淡入淡出(Fade)、推入(Push)、擦除(Wipe)、分割(Split)、随机(Random)等。切换效果可以通过设置transition元素的属性来控制持续时间和方向。虽然python-pptx没有提供高级的枚举常量来直接设置切换类型,但通过操作XML可以访问所有PowerPoint支持的切换效果。
元素动画(动画效果)控制幻灯片内各个元素的进入、退出和强调效果。在python-pptx中设置动画同样需要操作XML命名空间。常见的动画类型包括进入动画(淡入、飞入、缩放)、强调动画(脉冲、旋转)和退出动画(淡出、飞出)。每个动画可以有触发条件(单击时、与上一动画同时、上一动画之后)、持续时间和延迟时间等参数。通过精细的动画设置,可以让演示内容的呈现更加生动有序。
动画时序设置是控制演示节奏的关键。每个动画的时序参数包括:dur(持续时间,以毫秒为单位)、delay(延迟时间)、trigger(触发方式)。触发方式通常有三种:onClick(单击时触发)、withPrevious(与上一个动画同时播放)、afterPrevious(在上一动画之后自动播放)。合理组合不同触发方式可以创建自动播放的演示序列,或者交互式点击展示的内容结构。在数据汇报场景中,逐条显示的数据动画能够引导观众的注意力。
# 设置幻灯片切换效果
from pptx import Presentation
from pptx.oxml.ns import qn
from lxml import etree
import copy
prs = Presentation()
for i in range(5):
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide.shapes.title.text = f"第{i+1}页"
# 为第1张幻灯片设置"淡入淡出"切换效果
slide1 = prs.slides[0]
transition = slide1._element.get_or_add_transition()
transition.set(qn('p:advTm'), '5000') # 5秒后自动切换
# 设置切换类型为淡入淡出
trans_type = etree.SubElement(transition, qn('p:fade'))
trans_type.set('dur', '1000') # 切换持续1秒
# 为第2张幻灯片设置"推入"效果
slide2 = prs.slides[1]
transition2 = slide2._element.get_or_add_transition()
push = etree.SubElement(transition2, qn('p:push'))
push.set('dir', 'ltr') # 从左到右
push.set('dur', '800')
# 设置自动翻页时间
transition2.set(qn('p:advTm'), '3000') # 3秒后自动切换
# 批量设置:所有幻灯片使用淡入淡出
for slide in prs.slides:
trans = slide._element.get_or_add_transition()
fade = etree.SubElement(trans, qn('p:fade'))
fade.set('dur', '500')
print(f"已为 {len(prs.slides)} 张幻灯片设置切换效果")
prs.save('transition_demo.pptx')
# 为元素添加动画效果
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.oxml.ns import qn
from lxml import etree
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
# 添加三个文本框作为动画对象
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
shapes_data = [
("标题:市场分析报告", Inches(1), Inches(0.5), Inches(10), Inches(1),
RGBColor(0x2E, 0x7D, 0x32), Pt(28)),
("核心发现:用户需求持续增长", Inches(1), Inches(2), Inches(10), Inches(0.8),
RGBColor(0x29, 0x80, 0xB9), Pt(20)),
("建议:加大研发投入,优化产品体验", Inches(1), Inches(3.5), Inches(10), Inches(0.8),
RGBColor(0xE7, 0x4C, 0x3C), Pt(20)),
]
for text, left, top, width, height, color, size in shapes_data:
txBox = slide.shapes.add_textbox(left, top, width, height)
tf = txBox.text_frame
p = tf.paragraphs[0]
p.text = text
p.font.size = size
p.font.color.rgb = color
p.font.bold = True
# 通过操作XML添加动画效果
# 获取或创建timing元素
cSld = slide._element.find(qn('p:cSld'))
spTree = cSld.find(qn('p:spTree'))
timing = slide._element.find(qn('p:timing'))
if timing is None:
timing = etree.SubElement(slide._element, qn('p:timing'))
# 为每个形状创建动画
for idx, shape in enumerate(slide.shapes):
# 创建动画构建元素(简化示例)
# 完整的动画设置需要创建复杂的XML结构
pass # 完整动画XML构建较复杂,建议查阅python-pptx高级文档
print("动画设置示例完成(生产环境需构建完整XML结构)")
prs.save('animation_demo.pptx')
# 批量设置自动播放与动画时序
from pptx import Presentation
from pptx.oxml.ns import qn
from lxml import etree
prs = Presentation()
# 创建3页自动播放的演示
for i in range(3):
slide = prs.slides.add_slide(prs.slide_layouts[6])
txBox = slide.shapes.add_textbox(Inches(2), Inches(3), Inches(8), Inches(1.5))
tf = txBox.text_frame
p = tf.paragraphs[0]
p.text = f"自动播放页面 #{i+1}"
p.font.size = Pt(36)
p.alignment = PP_ALIGN.CENTER
# 设置切换效果和自动翻页
transition = slide._element.get_or_add_transition()
transition.set(qn('p:advTm'), '4000') # 4秒后自动切换
fade = etree.SubElement(transition, qn('p:fade'))
fade.set('dur', '800')
# 设置切到下一张的触发方式:自动(advMouse设置为false禁用单击切换)
transition.set(qn('p:advMouse'), '0') # 禁用鼠标单击切换
# 如果想保留鼠标单击切换功能,设置 '1' 或不设置
# 设置整个演示文稿的自动循环播放
sldShow = prs.presentation.find(qn('p:sldShow'))
if sldShow is not None:
sldShow.set(qn('p:loop'), '1') # 循环播放
# 设置第一张幻灯片开始
sldShow = prs.presentation.find(qn('p:sldShow'))
if sldShow is None:
sldShow = etree.SubElement(prs.presentation, qn('p:sldShow'))
sldShow.set(qn('p:showType'), 'browse') # 浏览模式
prs.save('auto_play_demo.pptx')
print("自动播放演示文稿创建完成")
九、实战案例
在本节中,我们将通过三个完整的实战案例展示python-pptx在实际工作中的应用。第一个案例是数据汇报PPT的自动生成,从Excel或数据库读取数据,自动创建包含表格和图表的多页演示文稿。这种自动化方案可以将原本需要数小时的手工制作压缩到几秒钟完成,特别适合周报、月报、季报等周期性汇报场景。关键要点在于建立数据源与PPT元素之间的映射关系,确保数据更新时PPT内容也随之更新。
第二个案例是培训课件的批量制作。在企业培训和在线教育场景中,经常需要基于标准模板生成大量内容相似的课件。通过python-pptx,可以构建一个课件生成引擎,只需提供课程大纲和内容数据,即可自动生成包含标题页、学习目标、知识要点、案例分析和课后练习等完整结构的课件。这种方式不仅保证了课件风格的统一,还大大降低了课件制作的人力成本。
第三个案例是产品介绍幻灯片的批量生成。在产品运营中,经常需要为不同的客户或渠道定制产品介绍PPT。通过python-pptx可以实现:读取产品数据库,针对不同客户的需求筛选相应内容,自动填充到预设计的模板中,并生成个性化的介绍文档。这种方案特别适合电商平台上的商品详情展示、展会材料准备和销售提案制作等场景,能够显著提升销售团队的响应速度和专业形象。
# 案例一:数据汇报PPT自动生成
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
def generate_report_pptx(data_dict, output_path):
"""自动生成数据汇报PPT"""
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
# 第1页:封面
cover = prs.slides.add_slide(prs.slide_layouts[0])
cover.shapes.title.text = f"{data_dict['title']}"
cover.placeholders[1].text = f"报告周期: {data_dict['period']}"
# 第2页:概览数据
summary_slide = prs.slides.add_slide(prs.slide_layouts[1])
summary_slide.shapes.title.text = "核心指标概览"
content = summary_slide.placeholders[1]
metrics = data_dict.get('metrics', [])
content.text = "\n".join([f"• {m['name']}: {m['value']} ({m['change']})"
for m in metrics])
# 第3页:趋势图表
chart_slide = prs.slides.add_slide(prs.slide_layouts[6])
chart_slide.shapes.title.text = "关键趋势分析"
chart_data = CategoryChartData()
chart_data.categories = data_dict['trend']['months']
for series in data_dict['trend']['series']:
chart_data.add_series(series['name'], series['values'])
chart_frame = chart_slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED,
Inches(0.5), Inches(1.5), Inches(12), Inches(5.5),
chart_data
)
# 第4页:总结
end_slide = prs.slides.add_slide(prs.slide_layouts[1])
end_slide.shapes.title.text = "总结与下一步计划"
end_content = end_slide.placeholders[1]
end_content.text = data_dict.get('summary', '')
prs.save(output_path)
return output_path
# 示例数据
sample_data = {
'title': '2026年Q2运营数据汇报',
'period': '2026年4月 - 2026年6月',
'metrics': [
{'name': '月活跃用户', 'value': '128万', 'change': '+15.3%'},
{'name': '营收总额', 'value': '3,850万', 'change': '+22.7%'},
{'name': '客户满意度', 'value': '94.5%', 'change': '+2.1%'},
],
'trend': {
'months': ['4月', '5月', '6月'],
'series': [
{'name': '营收(万)', 'values': [1100, 1280, 1470]},
{'name': '成本(万)', 'values': [650, 720, 780]},
]
},
'summary': 'Q2整体表现良好,营收稳步增长。\n'
'建议Q3重点关注:用户留存优化和新市场开拓。'
}
generate_report_pptx(sample_data, 'quarterly_report.pptx')
print("季度汇报PPT已生成")
# 案例二:培训课件批量制作
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
def create_training_course(course_data, output_path):
"""批量生成培训课件"""
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
# 封面页
cover = prs.slides.add_slide(prs.slide_layouts[0])
cover.shapes.title.text = course_data['title']
cover.placeholders[1].text = course_data['subtitle']
# 学习目标页
objectives = prs.slides.add_slide(prs.slide_layouts[1])
objectives.shapes.title.text = "学习目标"
obj_text = "\n".join([f"• {obj}" for obj in course_data['objectives']])
objectives.placeholders[1].text = obj_text
# 知识章节
for i, chapter in enumerate(course_data['chapters']):
# 节标题页
sec_slide = prs.slides.add_slide(prs.slide_layouts[2])
sec_slide.shapes.title.text = f"第{i+1}节 {chapter['title']}"
# 内容页
for content in chapter['contents']:
content_slide = prs.slides.add_slide(prs.slide_layouts[6])
# 标题
title_box = content_slide.shapes.add_textbox(
Inches(0.5), Inches(0.3), Inches(12), Inches(0.8))
title_box.text_frame.text = content['title']
title_box.text_frame.paragraphs[0].font.size = Pt(24)
title_box.text_frame.paragraphs[0].font.bold = True
title_box.text_frame.paragraphs[0].font.color.rgb = RGBColor(0x2E, 0x7D, 0x32)
# 正文
body_box = content_slide.shapes.add_textbox(
Inches(0.8), Inches(1.5), Inches(11.5), Inches(5))
tf = body_box.text_frame
tf.word_wrap = True
p = tf.paragraphs[0]
p.text = content['body']
p.font.size = Pt(16)
# 课后练习页
exercise = prs.slides.add_slide(prs.slide_layouts[1])
exercise.shapes.title.text = "课后练习"
q_text = "\n".join([f"{i+1}. {q}" for i, q in enumerate(course_data['questions'])])
exercise.placeholders[1].text = q_text
# 结束页
end = prs.slides.add_slide(prs.slide_layouts[0])
end.shapes.title.text = "谢谢学习"
end.placeholders[1].text = course_data.get('footer', '')
prs.save(output_path)
return output_path
# 示例数据
course = {
'title': 'Python数据分析入门',
'subtitle': '从零开始掌握数据分析核心技能',
'objectives': [
'了解Python数据分析生态系统',
'掌握Pandas数据处理基础',
'学会使用Matplotlib绘制图表',
'能够独立完成简单的数据分析项目',
],
'chapters': [
{
'title': 'Python基础回顾',
'contents': [
{'title': '1.1 数据类型与结构',
'body': 'Python内置了多种数据类型,包括整数(int)、浮点数(float)、字符串(str)、布尔值(bool)等。\n\n容器类型包括列表(list)、元组(tuple)、字典(dict)、集合(set)。每种类型都有其特点和使用场景。\n\n列表是可变的序列类型,支持增删改查操作;元组是不可变的,适合存储固定数据;字典以键值对形式存储数据,查找速度快;集合用于去重和集合运算。'},
{'title': '1.2 控制流与函数',
'body': '控制流语句包括if-elif-else条件判断、for循环和while循环。\n\n函数使用def关键字定义,支持默认参数、可变参数和关键字参数。\n\n理解作用域规则(LEGB)对编写正确的Python代码非常重要。'},
]
},
{
'title': 'Pandas数据处理',
'contents': [
{'title': '2.1 DataFrame基础',
'body': 'DataFrame是Pandas的核心数据结构,类似于电子表格或SQL表。\n\n可以从多种数据源创建DataFrame,包括CSV、Excel、JSON、数据库等。\n\nDataFrame支持丰富的索引、筛选、分组和聚合操作,是数据分析的主力工具。'},
]
}
],
'questions': [
'DataFrame和Series的区别是什么?',
'如何使用Pandas读取CSV文件?',
'groupby方法的常见用法有哪些?',
],
'footer': '上海佼艾科技 · 内部培训资料'
}
create_training_course(course, 'python_training.pptx')
print("培训课件已生成")
# 案例三:产品介绍幻灯片生成
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
def generate_product_deck(product_data, template_path=None, output_path='product_intro.pptx'):
"""生成产品介绍演示文稿"""
if template_path:
prs = Presentation(template_path)
else:
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
# 封面
cover = prs.slides.add_slide(prs.slide_layouts[0])
cover.shapes.title.text = product_data['name']
cover.placeholders[1].text = product_data['tagline']
# 产品概述
overview = prs.slides.add_slide(prs.slide_layouts[1])
overview.shapes.title.text = "产品概述"
overview.placeholders[1].text = (
f"产品定位:{product_data['positioning']}\n\n"
f"目标用户:{product_data['target_users']}\n\n"
f"核心理念:{product_data['philosophy']}"
)
# 核心功能(多个幻灯片)
for i, feature in enumerate(product_data['features']):
feat_slide = prs.slides.add_slide(prs.slide_layouts[1])
feat_slide.shapes.title.text = f"核心功能 {i+1}:{feature['title']}"
# 创建左右分栏的效果(手动布局)
# 左侧:功能描述
desc_box = feat_slide.shapes.add_textbox(
Inches(0.5), Inches(1.5), Inches(6), Inches(5))
tf = desc_box.text_frame
tf.word_wrap = True
p = tf.paragraphs[0]
p.text = feature['description']
p.font.size = Pt(14)
# 右侧:关键优势
adv_box = feat_slide.shapes.add_textbox(
Inches(7), Inches(1.5), Inches(5.5), Inches(5))
tf2 = adv_box.text_frame
tf2.word_wrap = True
p2 = tf2.paragraphs[0]
p2.text = "关键优势:"
p2.font.bold = True
p2.font.size = Pt(16)
p2.font.color.rgb = RGBColor(0x2E, 0x7D, 0x32)
for adv in feature['advantages']:
p_adv = tf2.add_paragraph()
p_adv.text = f" ✓ {adv}"
p_adv.font.size = Pt(14)
p_adv.space_after = Pt(6)
# 客户案例
cases = prs.slides.add_slide(prs.slide_layouts[1])
cases.shapes.title.text = "客户案例"
cases_text = "\n\n".join([
f"案例{i+1}:{c['name']}\n{c['description']}"
for i, c in enumerate(product_data['cases'])
])
cases.placeholders[1].text = cases_text
# 结语
end = prs.slides.add_slide(prs.slide_layouts[0])
end.shapes.title.text = "感谢关注"
end.placeholders[1].text = f"联系方式:{product_data['contact']}"
prs.save(output_path)
return output_path
# 示例数据
product = {
'name': 'DataViz Pro 数据可视化平台',
'tagline': '让数据讲述故事 - 企业级可视化分析解决方案',
'positioning': '面向中大型企业的全功能数据可视化与商业智能平台',
'target_users': '数据分析师、业务决策者、IT管理员',
'philosophy': '零代码拖拽式操作,让每个人都能成为数据分析师',
'features': [
{
'title': '智能仪表盘',
'description': '支持拖拽式仪表盘设计,内置50+可视化组件,包括柱状图、折线图、地图、热力图等。支持实时数据刷新和多维度交互筛选。',
'advantages': ['零代码操作,3分钟创建仪表盘', '支持SQL和API实时数据源', '多端自适应显示']},
{
'title': '自动报告生成',
'description': '一键生成结构化数据分析报告,支持PDF、PPT、Excel等多种导出格式。支持定时发送和异常预警通知。',
'advantages': ['报告模板自定义', '自动数据更新', '多格式导出']},
],
'cases': [
{'name': '某电商平台', 'description': '通过DataViz Pro搭建运营监控中心,数据处理效率提升300%,决策响应时间缩短至分钟级。'},
{'name': '某金融机构', 'description': '实现风控数据的实时可视化监控,异常检测准确率提升至99.2%。'},
],
'contact': '上海市浦东新区 · 上海佼艾科技 · contact@shjiaoai.com'
}
generate_product_deck(product, output_path='product_intro.pptx')
print("产品介绍PPT已生成")