📦 create-pptx — 使用 Python 和 python-pptx 创建 PowerPoint 演示文稿
v1.0.0使用 Python 和 python-pptx 库生成 PPTX 文件,支持时间线、图表、图表、自定义布局、颜色、形状、连接器、文本格式和过渡效果。适用于生成复杂的 PowerPoint 演示文稿,特别是需要程序化构建的场景。
详细分析 ▾
运行时依赖
版本
["create-pptx 初始发布:使用 python-pptx 生成 PPTX 演示文稿。","支持时间线、图表、图表、自定义幻灯片布局、主题、颜色、形状、连接器、文本格式和过渡效果。","包含常见绘图任务的帮助器和关于 EMU 单位、幻灯片规划以及 WPS 兼容性的指南。","提供商业和教育模板资产以及模式、图表、标准幻灯片和 WPS 问题的参考。","工作流设计为多幻灯片渐进式揭示,以确保与 WPS 兼容。"]
安装命令
点击复制技能文档
安装配置
pip install python-pptx
# 或者:uv pip install python-pptx
将脚本输出到合理的位置(例如 前端开发/demo/ 或项目文件夹),然后使用 python3 运行并打开结果。
核心辅助函数
读取并导入 scripts/pptx_helpers.py 以获取现成的绘图原语:背景、水平/垂直线条、文本框、椭圆、对角线连接器和淡入过渡。根据需要复制或导入。
关键单位:EMU(英制公制单位)。1 pt = 12700 EMU,1 cm ≈ 360000 EMU。标准 16:9 幻灯片 = 12192000 × 6858000 EMU。
工作流程
- 理解内容 — 里程碑、分类、颜色、幻灯片数量
- 规划布局 — 提前计算 EMU 单位的 X/Y 位置;避免使用魔法数字
- 构建形状 — 使用辅助函数或
slide.shapes.add_shape/add_textbox - 添加过渡 — 始终从辅助函数调用
add_fade_transition(slide) - 运行并打开 —
python3 script.py && open output.pptx
多幻灯片替代点击动画(WPS 安全默认)
WPS 不能可靠地支持点击触发的 PowerPoint 动画。始终使用多张幻灯片来逐步展示内容:
幻灯片 1 → 骨架 / 仅结构
幻灯片 2 → 骨架 + 第一层数据
幻灯片 3 → 骨架 + 所有数据层
为每张幻灯片添加淡入过渡(add_fade_transition)以实现平滑切换。如果用户明确要求动画且他们使用的是 Microsoft PowerPoint(而非 WPS),可以尝试基于 XML 的动画 — 但请先阅读 references/wps-compat.md 了解 XML 结构和已知问题。
常见模式
颜色和主题
在顶部将所有颜色定义为 RGBColor 常量。深色背景看起来更高级 — 使用近黑色(0x06, 0x0D, 0x1E)搭配明亮的高亮色。
时间线布局
TL_L, TL_R = 850000, 11950000 # 左右边距(EMU) TL_W = TL_R - TL_L M_STEP = TL_W // 11 # 12个月 → 11个间隔
def month_x(m): # 1-based month → EMU x-position return TL_L + M_STEP * (m - 1)
碰撞解决
当多张卡片共享相同或相近的 X 位置时,将它们分散开:
def resolve_collisions(events, card_w, gap):
events.sort(key=lambda e: e['cx'])
need = card_w + gap
for _ in range(120):
moved = False
for i in range(len(events) - 1):
a, b = events[i], events[i+1]
if b['cx'] - a['cx'] < need:
push = (need - (b['cx'] - a['cx'])) / 2
a['cx'] -= push
b['cx'] += push
moved = True
if not moved:
break
动画用的形状 ID
python-pptx 自动分配形状 ID。创建后检索它们:
shp = slide.shapes.add_shape(...)
shape_id = shp.shape_id # 在动画 XML 中使用此 ID
对于通过原始 XML 添加的连接器,先读取现有的最大 ID:
def _max_existing_id(slide):
return max((int(el.get('id')) for el in slide.element.iter() if el.get('id') and el.get('id').isdigit()), default=1)
模板资源
assets/ 中有现成的 .pptx 基础文件。将它们用作起始 Presentation() 对象以继承其设计/主题:
from pptx import Presentation
prs = Presentation('/Users/scott/.cursor/skills/create-pptx/assets/business-dark.pptx')
| 文件 | 风格 | 来源 |
|---|---|---|
assets/business-dark.pptx | 深色商务 · Pitch Deck 风格 · 60 slides | Slidesgo "Product Vision Pitch Deck"(需署名) |
assets/education.pptx | 明亮教育 · 笔记本课程风格 · 多 slides | Slidesgo "Notebook Lesson XL"(需署名) |
署名:免费 Slidesgo 模板需要保留署名幻灯片。使用这些文件时,请勿删除最后的"Credits"幻灯片。
参考文件
根据任务阅读相关文件:
references/pptx-patterns.md— EMU 单位速查、预设形状 ID、连接器 XML、 过渡 XML、多段落文字框、典型脚本结构references/charts.md— python-pptx 原生图表 API:柱状、折线、饼图、散点、 多系列、样式设置(当用户需要数据图表时读此文件)references/standard-slides.md— 标准商务幻灯片函数库:标题页、目录页、 要点页、图文并排、数据页、章节分隔页、结尾页(当用户需要完整 PPT 结构时读此文件)references/wps-compat.md— WPS 动画兼容性踩坑记录(当用户提到 WPS 或 动画效果异常时读此文件)