pptx-manipulation

pptx-manipulation

热门

>

310Star
68Fork
更新于 2026/1/31
SKILL.md
readonly只读
name
pptx-manipulation
description

>

version
1.0

PPTX 操作技能

概述

本技能支持使用 python-pptx 库以编程方式创建、编辑和操作 Microsoft PowerPoint (.pptx) 演示文稿。无需手动编辑即可创建包含文本、形状、图片、图表和表格的专业幻灯片。

使用方法

  1. 描述您想要创建或修改的演示文稿
  2. 提供要包含的内容、数据或图片
  3. 我将生成 python-pptx 代码并执行

示例提示:

  • "根据这个大纲创建一个 10 页的融资演示文稿"
  • "在第三页添加一个图表,数据如下"
  • "提取此演示文稿中的所有文本"
  • "根据此 Markdown 内容生成幻灯片"

领域知识

python-pptx 基础

from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.shapes import MSO_SHAPE
from pptx.enum.text import PP_ALIGN

# 创建新演示文稿
prs = Presentation()

# 或打开现有演示文稿
prs = Presentation('existing.pptx')

演示文稿结构

Presentation
├── slide_layouts (预定义布局)
├── slides (单个幻灯片)
│   ├── shapes (文本、图片、图表)
│   │   ├── text_frame (段落)
│   │   └── table (行、单元格)
│   └── placeholders (标题、内容)
└── slide_masters (模板)

幻灯片布局

# 常用布局索引(可能因模板而异)
TITLE_SLIDE = 0
TITLE_CONTENT = 1
SECTION_HEADER = 2
TWO_CONTENT = 3
COMPARISON = 4
TITLE_ONLY = 5
BLANK = 6

# 使用布局添加幻灯片
slide_layout = prs.slide_layouts[TITLE_CONTENT]
slide = prs.slides.add_slide(slide_layout)

添加内容

标题幻灯片
slide_layout = prs.slide_layouts[0]  # 标题幻灯片
slide = prs.slides.add_slide(slide_layout)

title = slide.shapes.title
subtitle = slide.placeholders[1]

title.text = "季度报告"
subtitle.text = "2024 年第四季度绩效回顾"
文本内容
# 使用占位符
body = slide.placeholders[1]
tf = body.text_frame
tf.text = "第一点"

# 添加更多段落
p = tf.add_paragraph()
p.text = "第二点"
p.level = 0

p = tf.add_paragraph()
p.text = "子要点"
p.level = 1
文本框
from pptx.util import Inches, Pt

left = Inches(1)
top = Inches(2)
width = Inches(4)
height = Inches(1)

txBox = slide.shapes.add_textbox(left, top, width, height)
tf = txBox.text_frame

p = tf.paragraphs[0]
p.text = "自定义文本框"
p.font.bold = True
p.font.size = Pt(18)
形状
from pptx.enum.shapes import MSO_SHAPE

# 矩形
shape = slide.shapes.add_shape(
    MSO_SHAPE.RECTANGLE,
    Inches(1), Inches(2),  # left, top
    Inches(3), Inches(1.5) # width, height
)
shape.text = "带文本的矩形"

# 常用形状:
# MSO_SHAPE.RECTANGLE, ROUNDED_RECTANGLE
# MSO_SHAPE.OVAL, CHEVRON, ARROW_RIGHT
# MSO_SHAPE.CALLOUT_ROUNDED_RECTANGLE
图片
# 添加图片
slide.shapes.add_picture(
    'image.png',
    Inches(1), Inches(2),  # 位置
    width=Inches(4)        # 自动调整高度
)

# 或指定宽高
slide.shapes.add_picture(
    'logo.png',
    Inches(8), Inches(0.5),
    Inches(1.5), Inches(0.75)
)

表格

# 创建表格
rows, cols = 4, 3
left = Inches(1)
top = Inches(2)
width = Inches(8)
height = Inches(2)

table = slide.shapes.add_table(rows, cols, left, top, width, height).table

# 设置列宽
table.columns[0].width = Inches(2)
table.columns[1].width = Inches(3)
table.columns[2].width = Inches(3)

# 添加表头
headers = ['产品', '第三季度销售额', '第四季度销售额']
for i, header in enumerate(headers):
    cell = table.cell(0, i)
    cell.text = header
    cell.text_frame.paragraphs[0].font.bold = True

# 添加数据
data = [
    ['Widget A', '$10,000', '$12,500'],
    ['Widget B', '$8,000', '$9,200'],
    ['Widget C', '$15,000', '$18,000'],
]
for row_idx, row_data in enumerate(data, 1):
    for col_idx, value in enumerate(row_data):
        table.cell(row_idx, col_idx).text = value

图表

from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE

# 图表数据
chart_data = CategoryChartData()
chart_data.categories = ['Q1', 'Q2', 'Q3', 'Q4']
chart_data.add_series('销售额', (19.2, 21.4, 16.7, 23.8))
chart_data.add_series('支出', (12.1, 15.3, 14.2, 18.1))

# 添加图表
x, y, cx, cy = Inches(1), Inches(2), Inches(8), Inches(4)
chart = slide.shapes.add_chart(
    XL_CHART_TYPE.COLUMN_CLUSTERED,
    x, y, cx, cy, chart_data
).chart

# 自定义
chart.has_legend = True
chart.legend.include_in_layout = False

格式化

文本格式化
from pptx.dml.color import RGBColor

run = p.runs[0]
run.font.name = 'Arial'
run.font.size = Pt(24)
run.font.bold = True
run.font.italic = True
run.font.color.rgb = RGBColor(0x00, 0x66, 0xCC)
形状填充与线条
from pptx.dml.color import RGBColor

shape.fill.solid()
shape.fill.fore_color.rgb = RGBColor(0x00, 0x80, 0x00)

shape.line.color.rgb = RGBColor(0x00, 0x00, 0x00)
shape.line.width = Pt(2)
段落对齐
from pptx.enum.text import PP_ALIGN

p.alignment = PP_ALIGN.CENTER  # LEFT, RIGHT, JUSTIFY

最佳实践

  1. 使用模板:从 .pptx 模板开始,保持品牌一致性
  2. 先规划布局:在编码前规划幻灯片结构
  3. 重用幻灯片母版:保持演示文稿间的一致性
  4. 优化图片:添加前压缩图片
  5. 测试输出:始终验证生成的演示文稿

常见模式

幻灯片生成器

def create_deck(title, slides_content):
    prs = Presentation()
    
    # 标题幻灯片
    slide = prs.slides.add_slide(prs.slide_layouts[0])
    slide.shapes.title.text = title
    
    # 内容幻灯片
    for slide_data in slides_content:
        slide = prs.slides.add_slide(prs.slide_layouts[1])
        slide.shapes.title.text = slide_data['title']
        
        body = slide.placeholders[1]
        tf = body.text_frame
        for i, point in enumerate(slide_data['points']):
            if i == 0:
                tf.text = point
            else:
                p = tf.add_paragraph()
                p.text = point
    
    return prs

数据驱动图表

def add_bar_chart(slide, title, categories, values):
    from pptx.chart.data import CategoryChartData
    from pptx.enum.chart import XL_CHART_TYPE
    
    chart_data = CategoryChartData()
    chart_data.categories = categories
    chart_data.add_series('值', values)
    
    chart = slide.shapes.add_chart(
        XL_CHART_TYPE.BAR_CLUSTERED,
        Inches(1), Inches(2),
        Inches(8), Inches(4),
        chart_data
    ).chart
    
    chart.chart_title.text_frame.text = title
    return chart

示例

示例 1:创建融资演示文稿

from pptx import Presentation
from pptx.util import Inches, Pt

prs = Presentation()

# 幻灯片 1:标题
slide = prs.slides.add_slide(prs.slide_layouts[0])
slide.shapes.title.text = "StartupX"
slide.placeholders[1].text = "革新文档处理"

# 幻灯片 2:问题
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = "问题"
body = slide.placeholders[1].text_frame
body.text = "手动文档处理每年耗费企业 1 万亿美元"
p = body.add_paragraph()
p.text = "普通员工花费 20% 的时间在文档任务上"
p.level = 1

# 幻灯片 3:解决方案
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = "我们的解决方案"
body = slide.placeholders[1].text_frame
body.text = "AI 驱动的文档自动化"
body.add_paragraph().text = "处理速度提升 90%"
body.add_paragraph().text = "准确率达 99.5%"
body.add_paragraph().text = "兼容现有工具"

# 幻灯片 4:市场
slide = prs.slides.add_slide(prs.slide_layouts[5])  # 仅标题
slide.shapes.title.text = "市场机会:到 2028 年达 500 亿美元"

# 添加图表
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE

data = CategoryChartData()
data.categories = ['2024', '2025', '2026', '2027', '2028']
data.add_series('市场规模(十亿美元)', [30, 35, 40, 45, 50])

slide.shapes.add_chart(
    XL_CHART_TYPE.LINE,
    Inches(1), Inches(1.5),
    Inches(8), Inches(5),
    data
)

prs.save('pitch_deck.pptx')

示例 2:带数据表格的报告

from pptx import Presentation
from pptx.util import Inches, Pt

prs = Presentation()

# 标题幻灯片
slide = prs.slides.add_slide(prs.slide_layouts[0])
slide.shapes.title.text = "销售业绩报告"
slide.placeholders[1].text = "2024 年第四季度"

# 数据幻灯片
slide = prs.slides.add_slide(prs.slide_layouts[5])
slide.shapes.title.text = "区域业绩"

# 创建表格
table = slide.shapes.add_table(5, 4, Inches(0.5), Inches(1.5), Inches(9), Inches(4)).table

# 表头
headers = ['区域', '收入', '增长', '目标']
for i, h in enumerate(headers):
    table.cell(0, i).text = h
    table.cell(0, i).text_frame.paragraphs[0].font.bold = True

# 数据
data = [
    ['北美', '$5.2M', '+15%', '达成'],
    ['欧洲', '$3.8M', '+12%', '达成'],
    ['亚太', '$2.9M', '+28%', '超额'],
    ['拉丁美洲', '$1.1M', '+8%', '未达标'],
]
for row_idx, row_data in enumerate(data, 1):
    for col_idx, value in enumerate(row_data):
        table.cell(row_idx, col_idx).text = value

prs.save('sales_report.pptx')

限制

  • 无法渲染复杂动画
  • 对 SmartArt 支持有限
  • 不支持通过 API 嵌入视频
  • 母版幻灯片编辑复杂
  • 图表类型仅限于标准 Office 图表

安装

pip install python-pptx

资源