用途
该技能用于以编程方式创建、读取和编辑 PowerPoint(.pptx)文件,基于 python-pptx 库实现。它处理幻灯片创建、文本格式化、图片、表格、图表、形状、幻灯片版式以及演讲者备注。无需安装 PowerPoint,直接读写 Open XML 格式。
主要能力
- 创建演示文稿:添加标题幻灯片、内容幻灯片,设置标题与占位符文本,添加项目符号段落并控制层级。
- 编辑现有文件:遍历幻灯片与形状,替换文本(如模板填充 {{COMPANY}}),批量更新品牌名称与 Logo。
- 添加元素:图片(add_picture)、表格(add_table)、图表(add_chart,如柱状图)、演讲者备注(notes_slide)。
- 文本格式化:设置字号(Pt)、加粗、颜色(RGBColor)、字体名称、段落对齐(PP_ALIGN)。
- 提取内容:将演示文稿内容导出为 Markdown,包括标题、段落层级与备注。
- 对象模型:Presentation 包含 slide_layouts[]、slides[](含 shapes[]、notes_slide)与 core_properties。
使用方式
安装:pip install python-pptx
基本流程:
from pptx import Presentation from pptx.util import Inches, Pt from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN
prs = Presentation() slide = prs.slides.add_slide(prs.slide_layouts[0]) slide.shapes.title.text = "Q4 Revenue Report" slide.placeholders[1].text = "Finance Team — January 2025" prs.save("report.pptx")
版式索引因模板而异,使用前应先枚举确认:
for i, layout in enumerate(prs.slide_layouts): print(i, layout.name)
常见默认:0 = 标题幻灯片,1 = 标题和内容,5 = 仅标题,6 = 空白。
添加图片:slide.shapes.add_picture("photo.png", Inches(1), Inches(1.5), width=Inches(8))
添加表格:tbl = slide.shapes.add_table(rows, cols, Inches(1), Inches(2), Inches(8), Inches(3)).table;tbl.cell(0, 0).text = "Header"
添加图表:使用 CategoryChartData 设置 categories 与 add_series,再调用 slide.shapes.add_chart(XL_CHART_TYPE.COLUMN_CLUSTERED, ...)。
演讲者备注:slide.notes_slide.notes_text_frame.text = "Key talking point here."
文本格式化:run.font.size = Pt(28);run.font.bold = True;run.font.color.rgb = RGBColor(0x1A, 0x73, 0xE8);run.font.name = "Calibri";paragraph.alignment = PP_ALIGN.CENTER
替代方案:若需从文本提示全自动生成幻灯片,可使用开源工具 Presenton(github.com/presenton/presenton),它通过 OpenAI、Gemini、Claude 或 Ollama 生成 PPTX,并通过 Docker 本地运行。当需要精确控制内容、格式和数据驱动生成时,使用 python-pptx。
生成幻灯片的设计原则
- 排版:使用 Inter、Poppins 或 Montserrat 替代默认 Calibri;每个演示文稿只用一种字体家族;标题最小 36pt,正文最小 24pt;正文行距 1.2–1.3,大号展示文字 0.8–0.9。
- 布局:正文左对齐(仅短标题居中);四周留白至少 Inches(1);使用多栏布局提升可读性;在保持一致风格的同时变化幻灯片设计。
- 内容密度:每页一个观点;最多 6 行文字、每行 6 个词;将密集内容拆分到多页(每页约 30 秒);用字号、字重和间距建立视觉层级替代项目符号列表。
- 留白:将空白视为设计元素;在框和形状内应用内边距,至少 Inches(0.3)。
- 视觉:每页一张主图或图表;在背景上使用高对比度文字;来自 Noun Project(thenounproject.com)的 SVG 图标可增强幻灯片而不显杂乱;可从 Slidesgo(slidesgo.com)下载 PPTX 模板作为起点,用 Presentation("template.pptx") 加载。
适用场景
- 从 JSON 等数据生成销售报告(标题页、摘要页、图表页、表格页)。
- 批量更新 PPTX 模板中的品牌名称与 Logo。
- 将演示文稿内容提取为 Markdown。
- 基于模板进行占位符填充式生成。
限制
- python-pptx 不支持动画、切换效果或嵌入视频;需先生成基础 PPTX,再让用户在 PowerPoint 中添加这些内容。
- 编辑现有文件时,应遍历 paragraph.runs 以保留格式;直接设置 text_frame.text 会破坏所有现有字体样式。
- 使用硬编码版式索引前,应先用 enumerate(prs.slide_layouts) 检查可用版式,因其因模板而异。
- 基于模板生成时,应使用占位符形状(slide.placeholders[idx])而非添加新形状,以保留模板设计。
- 构建表格时需显式设置列宽,不支持自动调整大小,默认会产生不均匀的列。
- 从零生成时,应在每个 run 上显式设置 font.name,默认 Calibri 显得通用。
- 编辑时应保存到新文件名,避免在开发过程中损坏源文件。
- 定位应使用 from pptx.util import Inches, Pt,除非进行精确计算,否则不要使用原始 EMU 值。