Skip to content

2.3.PPT演示自动化

在现代商业和教育环境中,PowerPoint演示文稿是信息传递的重要工具。通过Python自动化PPT创建和编辑过程,可以大幅提高工作效率,特别是在需要批量生成或更新演示文稿的场景下。本文将介绍如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景。

使用python-pptx操作PPT文档

安装python-pptx

python
pip install python-pptx

基础概念

在Python中,可以使用python-pptx库实现PPT文件的自动化操作。需要注意的是,python-pptx只支持*.pptx文件格式的PPT文件(Office 2007及以上版本)。

一个PPT文件通常由多个幻灯片组成,每个幻灯片都有相应的布局。通过python-pptx库创建PPT文件的过程其实就是创建一个空的PPT文件,然后不断向其中添加具有某种布局的幻灯片的过程。

创建新的PPT文档

python
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor

def create_simple_presentation():
    """创建一个简单的PPT演示文稿"""
    # 创建演示文稿对象
    prs = Presentation()
    
    # 获取第一个布局(标题幻灯片)
    title_slide_layout = prs.slide_layouts[0]
    
    # 添加标题幻灯片
    slide = prs.slides.add_slide(title_slide_layout)
    
    # 设置标题和副标题
    title = slide.shapes.title
    subtitle = slide.placeholders[1]
    
    title.text = "Python自动化办公"
    subtitle.text = "使用python-pptx创建精美演示文稿"
    
    # 添加内容幻灯片
    bullet_slide_layout = prs.slide_layouts[1]  # 标题和内容布局
    slide = prs.slides.add_slide(bullet_slide_layout)
    
    # 设置标题
    title = slide.shapes.title
    title.text = "python-pptx的主要功能"
    
    # 设置内容(项目符号列表)
    content = slide.placeholders[1]
    tf = content.text_frame
    
    # 添加项目符号
    tf.text = "创建和编辑幻灯片"
    
    p = tf.add_paragraph()
    p.text = "添加文本、图片和形状"
    p.level = 1  # 缩进级别
    
    p = tf.add_paragraph()
    p.text = "创建表格和图表"
    p.level = 1
    
    p = tf.add_paragraph()
    p.text = "应用主题和样式"
    p.level = 0  # 恢复到第一级
    
    # 保存演示文稿
    prs.save("简单演示文稿.pptx")
    print("演示文稿已保存为: 简单演示文稿.pptx")

# 执行函数
create_simple_presentation()

查看可用的幻灯片布局

python
from pptx import Presentation

def explore_slide_layouts():
    """查看可用的幻灯片布局"""
    prs = Presentation()
    
    print("可用的幻灯片布局:")
    for i, layout in enumerate(prs.slide_layouts):
        # 获取布局名称
        layout_name = "未命名布局"
        for shape in layout.placeholders:
            if shape.is_title:
                layout_name = f"布局 {i} - {shape.text if shape.text else '标题布局'}"
                break
        
        print(f"索引 {i}: {layout_name}")
        print("  占位符:")
        for shape in layout.placeholders:
            print(f"    索引 {shape.placeholder_format.idx}: {shape.name}")
    
    print("\n常用布局索引参考:")
    print("0 - 标题幻灯片")
    print("1 - 标题和内容")
    print("2 - 节标题")
    print("3 - 两栏内容")
    print("4 - 比较")
    print("5 - 仅标题")
    print("6 - 空白")
    print("7 - 标题和对象")
    print("8 - 对象和标题")

# 执行函数
# explore_slide_layouts()

添加文本框和格式化文本

python
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor

def create_formatted_text_slide():
    """创建包含格式化文本的幻灯片"""
    prs = Presentation()
    
    # 添加空白幻灯片
    blank_slide_layout = prs.slide_layouts[6]
    slide = prs.slides.add_slide(blank_slide_layout)
    
    # 添加标题文本框
    left = Inches(1)
    top = Inches(0.5)
    width = Inches(8)
    height = Inches(1)
    
    txBox = slide.shapes.add_textbox(left, top, width, height)
    tf = txBox.text_frame
    
    # 设置文本
    p = tf.paragraphs[0]
    p.text = "格式化文本示例"
    p.alignment = PP_ALIGN.CENTER
    
    # 设置字体格式
    run = p.runs[0]
    run.font.bold = True
    run.font.size = Pt(44)
    run.font.color.rgb = RGBColor(0, 112, 192)  # 蓝色
    
    # 添加正文文本框
    left = Inches(1)
    top = Inches(2)
    width = Inches(8)
    height = Inches(4)
    
    txBox = slide.shapes.add_textbox(left, top, width, height)
    tf = txBox.text_frame
    
    # 添加段落并设置格式
    p = tf.paragraphs[0]
    p.text = "这是第一段文本,演示基本格式。"
    
    # 添加第二段
    p = tf.add_paragraph()
    p.text = "这是第二段,演示不同的字体样式。"
    
    # 添加带有多种格式的段落
    p = tf.add_paragraph()
    p.text = ""  # 先创建空段落
    
    # 添加不同格式的文本
    run = p.add_run()
    run.text = "这部分文本是"
    
    run = p.add_run()
    run.text = "粗体"
    run.font.bold = True
    
    run = p.add_run()
    run.text = ",这部分是"
    
    run = p.add_run()
    run.text = "斜体"
    run.font.italic = True
    
    run = p.add_run()
    run.text = ",这部分是"
    
    run = p.add_run()
    run.text = "红色"
    run.font.color.rgb = RGBColor(255, 0, 0)
    
    run = p.add_run()
    run.text = ",这部分是"
    
    run = p.add_run()
    run.text = "大号字体"
    run.font.size = Pt(24)
    
    # 保存演示文稿
    prs.save("格式化文本演示.pptx")
    print("演示文稿已保存为: 格式化文本演示.pptx")

# 执行函数
# create_formatted_text_slide()

插入图片

python
from pptx import Presentation
from pptx.util import Inches

def add_picture_to_slide():
    """向幻灯片中添加图片"""
    prs = Presentation()
    
    # 添加标题和内容布局的幻灯片
    slide_layout = prs.slide_layouts[1]
    slide = prs.slides.add_slide(slide_layout)
    
    # 设置标题
    title = slide.shapes.title
    title.text = "插入图片示例"
    
    # 添加图片
    # 注意:请确保图片文件存在,或替换为实际的图片路径
    try:
        left = Inches(1)
        top = Inches(2)
        pic_path = "example_image.jpg"  # 替换为实际图片路径
        
        # 添加图片并设置大小
        pic = slide.shapes.add_picture(pic_path, left, top, width=Inches(4))
        
        # 在图片下方添加说明文字
        left = Inches(1)
        top = Inches(5)
        width = Inches(4)
        height = Inches(1)
        
        txBox = slide.shapes.add_textbox(left, top, width, height)
        tf = txBox.text_frame
        tf.text = "图片说明:这是一个示例图片"
    except Exception as e:
        # 如果图片不存在,添加错误提示
        content = slide.placeholders[1]
        tf = content.text_frame
        tf.text = f"图片添加失败: {e}\n\n请确保图片文件存在,或替换为实际的图片路径。"
    
    # 保存演示文稿
    prs.save("图片演示.pptx")
    print("演示文稿已保存为: 图片演示.pptx")

# 执行函数
# add_picture_to_slide()

添加形状

python
from pptx import Presentation
from pptx.util import Inches
from pptx.enum.shapes import MSO_SHAPE
from pptx.dml.color import RGBColor

def add_shapes_to_slide():
    """向幻灯片中添加各种形状"""
    prs = Presentation()
    
    # 添加空白幻灯片
    blank_slide_layout = prs.slide_layouts[6]
    slide = prs.slides.add_slide(blank_slide_layout)
    
    # 添加标题
    left = Inches(1)
    top = Inches(0.5)
    width = Inches(8)
    height = Inches(1)
    
    txBox = slide.shapes.add_textbox(left, top, width, height)
    tf = txBox.text_frame
    tf.text = "各种形状示例"
    tf.paragraphs[0].alignment = PP_ALIGN.CENTER
    tf.paragraphs[0].runs[0].font.bold = True
    tf.paragraphs[0].runs[0].font.size = Pt(32)
    
    # 添加矩形
    left = Inches(1)
    top = Inches(2)
    width = Inches(2)
    height = Inches(1)
    
    shape = slide.shapes.add_shape(
        MSO_SHAPE.RECTANGLE, left, top, width, height
    )
    shape.fill.solid()
    shape.fill.fore_color.rgb = RGBColor(255, 0, 0)  # 红色
    shape.line.color.rgb = RGBColor(0, 0, 0)  # 黑色边框
    
    # 添加椭圆
    left = Inches(4)
    top = Inches(2)
    width = Inches(2)
    height = Inches(1)
    
    shape = slide.shapes.add_shape(
        MSO_SHAPE.OVAL, left, top, width, height
    )
    shape.fill.solid()
    shape.fill.fore_color.rgb = RGBColor(0, 176, 80)  # 绿色
    shape.line.color.rgb = RGBColor(0, 0, 0)  # 黑色边框
    
    # 添加五角星
    left = Inches(7)
    top = Inches(2)
    width = Inches(1.5)
    height = Inches(1.5)
    
    shape = slide.shapes.add_shape(
        MSO_SHAPE.STAR_5_POINT, left, top, width, height
    )
    shape.fill.solid()
    shape.fill.fore_color.rgb = RGBColor(255, 192, 0)  # 黄色
    shape.line.color.rgb = RGBColor(0, 0, 0)  # 黑色边框
    
    # 添加箭头
    left = Inches(1)
    top = Inches(4)
    width = Inches(2)
    height = Inches(1)
    
    shape = slide.shapes.add_shape(
        MSO_SHAPE.ARROW_RIGHT, left, top, width, height
    )
    shape.fill.solid()
    shape.fill.fore_color.rgb = RGBColor(0, 112, 192)  # 蓝色
    
    # 添加带文本的形状
    left = Inches(4)
    top = Inches(4)
    width = Inches(4)
    height = Inches(1)
    
    shape = slide.shapes.add_shape(
        MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height
    )
    shape.fill.solid()
    shape.fill.fore_color.rgb = RGBColor(112, 48, 160)  # 紫色
    
    # 向形状中添加文本
    tf = shape.text_frame
    tf.text = "带文本的形状"
    tf.paragraphs[0].alignment = PP_ALIGN.CENTER
    tf.paragraphs[0].runs[0].font.color.rgb = RGBColor(255, 255, 255)  # 白色文字
    
    # 保存演示文稿
    prs.save("形状演示.pptx")
    print("演示文稿已保存为: 形状演示.pptx")

# 执行函数
# add_shapes_to_slide()

创建表格

python
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor

def create_table_slide():
    """创建包含表格的幻灯片"""
    prs = Presentation()
    
    # 添加标题和内容布局的幻灯片
    slide_layout = prs.slide_layouts[5]  # 仅标题布局
    slide = prs.slides.add_slide(slide_layout)
    
    # 设置标题
    title = slide.shapes.title
    title.text = "销售数据表格"
    
    # 定义表格位置和大小
    left = Inches(1.5)
    top = Inches(2)
    width = Inches(7)
    height = Inches(3)
    
    # 创建表格 (4行3列)
    rows, cols = 4, 3
    table = slide.shapes.add_table(rows, cols, left, top, width, height).table
    
    # 设置列宽
    table.columns[0].width = Inches(3)
    table.columns[1].width = Inches(2)
    table.columns[2].width = Inches(2)
    
    # 填充表头
    headers = ['产品名称', '销售数量', '销售金额']
    for i, header in enumerate(headers):
        cell = table.cell(0, i)
        cell.text = header
        
        # 设置表头格式
        cell.fill.solid()
        cell.fill.fore_color.rgb = RGBColor(0, 112, 192)  # 蓝色背景
        
        paragraph = cell.text_frame.paragraphs[0]
        paragraph.alignment = PP_ALIGN.CENTER
        paragraph.font.bold = True
        paragraph.font.color.rgb = RGBColor(255, 255, 255)  # 白色文字
    
    # 填充数据
    data = [
        ['笔记本电脑', '120台', '¥720,000'],
        ['办公桌椅', '200套', '¥180,000'],
        ['打印机', '45台', '¥58,500']
    ]
    
    for row_idx, row_data in enumerate(data):
        for col_idx, cell_text in enumerate(row_data):
            cell = table.cell(row_idx + 1, col_idx)
            cell.text = cell_text
            
            # 设置单元格格式
            paragraph = cell.text_frame.paragraphs[0]
            if col_idx == 0:
                paragraph.alignment = PP_ALIGN.LEFT
            else:
                paragraph.alignment = PP_ALIGN.CENTER
    
    # 保存演示文稿
    prs.save("表格演示.pptx")
    print("演示文稿已保存为: 表格演示.pptx")

# 执行函数
# create_table_slide()

插入图表

python
from pptx import Presentation
from pptx.util import Inches
from pptx.enum.chart import XL_CHART_TYPE
from pptx.chart.data import CategoryChartData

def create_chart_slide():
    """创建包含图表的幻灯片"""
    prs = Presentation()
    
    # 添加标题和内容布局的幻灯片
    slide_layout = prs.slide_layouts[5]  # 仅标题布局
    slide = prs.slides.add_slide(slide_layout)
    
    # 设置标题
    title = slide.shapes.title
    title.text = "季度销售数据图表"
    
    # 创建图表数据
    chart_data = CategoryChartData()
    chart_data.categories = ['第一季度', '第二季度', '第三季度', '第四季度']
    chart_data.add_series('笔记本电脑', (120, 95, 150, 180))
    chart_data.add_series('办公桌椅', (70, 120, 85, 90))
    chart_data.add_series('打印机', (30, 25, 45, 55))
    
    # 添加柱状图
    x, y, cx, cy = Inches(1), Inches(2), Inches(8), Inches(4.5)
    chart = slide.shapes.add_chart(
        XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
    ).chart
    
    # 设置图表标题
    chart.has_title = True
    chart.chart_title.text_frame.text = "季度销售数量对比"
    
    # 保存演示文稿
    prs.save("图表演示.pptx")
    print("演示文稿已保存为: 图表演示.pptx")
    
    # 创建第二张幻灯片,展示饼图
    slide = prs.slides.add_slide(slide_layout)
    title = slide.shapes.title
    title.text = "第四季度销售占比"
    
    # 创建饼图数据
    chart_data = CategoryChartData()
    chart_data.categories = ['笔记本电脑', '办公桌椅', '打印机']
    chart_data.add_series('销售额', (720000, 180000, 58500))
    
    # 添加饼图
    x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
    chart = slide.shapes.add_chart(
        XL_CHART_TYPE.PIE, x, y, cx, cy, chart_data
    ).chart
    
    # 设置图表标题
    chart.has_title = True
    chart.chart_title.text_frame.text = "第四季度销售额占比"
    
    # 保存更新后的演示文稿
    prs.save("图表演示.pptx")

# 执行函数
# create_chart_slide()

模板复用与批量生成

使用模板创建演示文稿

python
from pptx import Presentation
from pptx.util import Inches

def use_template():
    """使用模板创建演示文稿"""
    # 加载模板文件
    # 注意:请确保模板文件存在,或替换为实际的模板路径
    try:
        template_path = "template.pptx"  # 替换为实际模板路径
        prs = Presentation(template_path)
        
        # 添加新幻灯片(使用模板中的布局)
        slide_layout = prs.slide_layouts[1]  # 假设使用第二种布局
        slide = prs.slides.add_slide(slide_layout)
        
        # 设置标题和内容
        title = slide.shapes.title
        content = slide.placeholders[1]
        
        title.text = "使用模板创建的幻灯片"
        
        tf = content.text_frame
        tf.text = "使用模板的优势:"
        
        p = tf.add_paragraph()
        p.text = "保持一致的品牌形象"
        p.level = 1
        
        p = tf.add_paragraph()
        p.text = "节省设计时间"
        p.level = 1
        
        p = tf.add_paragraph()
        p.text = "确保专业的外观"
        p.level = 1
        
        # 保存演示文稿
        prs.save("基于模板的演示文稿.pptx")
        print("演示文稿已保存为: 基于模板的演示文稿.pptx")
    except Exception as e:
        print(f"使用模板创建演示文稿失败: {e}")
        print("请确保模板文件存在,或替换为实际的模板路径。")
        
        # 如果模板不存在,创建一个新的演示文稿作为示例
        create_template_example()

def create_template_example():
    """创建一个模板示例"""
    prs = Presentation()
    
    # 设置幻灯片尺寸为宽屏(16:9)
    prs.slide_width = Inches(13.33)
    prs.slide_height = Inches(7.5)
    
    # 添加标题幻灯片
    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 = "2023年第四季度"
    
    # 添加内容幻灯片
    slide_layout = prs.slide_layouts[1]
    slide = prs.slides.add_slide(slide_layout)
    
    # 设置标题和内容
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = "季度目标"
    
    tf = content.text_frame
    tf.text = "主要业务目标:"
    
    p = tf.add_paragraph()
    p.text = "提高销售额 15%"
    p.level = 1
    
    p = tf.add_paragraph()
    p.text = "拓展两个新市场"
    p.level = 1
    
    p = tf.add_paragraph()
    p.text = "推出新产品线"
    p.level = 1
    
    # 保存为模板
    prs.save("template.pptx")
    print("模板已创建: template.pptx")
    print("您可以修改此模板,然后再次运行use_template()函数。")

# 执行函数
# use_template()

批量生成演示文稿

python
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor
import os

def batch_generate_presentations(data_list):
    """批量生成演示文稿"""
    # 创建输出目录
    output_dir = "generated_presentations"
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    # 加载模板(如果存在)
    template_path = "template.pptx"
    template_exists = os.path.exists(template_path)
    
    for idx, data in enumerate(data_list):
        # 创建演示文稿(使用模板或创建新的)
        if template_exists:
            prs = Presentation(template_path)
        else:
            prs = Presentation()
        
        # 添加标题幻灯片
        slide_layout = prs.slide_layouts[0]
        slide = prs.slides.add_slide(slide_layout)
        
        # 设置标题和副标题
        title = slide.shapes.title
        subtitle = slide.placeholders[1]
        
        title.text = data['title']
        subtitle.text = data['subtitle']
        
        # 添加内容幻灯片 - 项目概述
        slide_layout = prs.slide_layouts[1]
        slide = prs.slides.add_slide(slide_layout)
        
        title = slide.shapes.title
        content = slide.placeholders[1]
        
        title.text = "项目概述"
        
        tf = content.text_frame
        tf.text = data['overview']
        
        # 添加内容幻灯片 - 关键数据
        slide_layout = prs.slide_layouts[1]
        slide = prs.slides.add_slide(slide_layout)
        
        title = slide.shapes.title
        title.text = "关键数据"
        
        # 创建表格
        left = Inches(2)
        top = Inches(2)
        width = Inches(6)
        height = Inches(2)
        
        # 创建表格 (4行2列)
        rows, cols = len(data['key_metrics']) + 1, 2
        table = slide.shapes.add_table(rows, cols, left, top, width, height).table
        
        # 设置表头
        cell = table.cell(0, 0)
        cell.text = "指标"
        cell.fill.solid()
        cell.fill.fore_color.rgb = RGBColor(0, 112, 192)  # 蓝色背景
        cell.text_frame.paragraphs[0].font.color.rgb = RGBColor(255, 255, 255)  # 白色文字
        
        cell = table.cell(0, 1)
        cell.text = "数值"
        cell.fill.solid()
        cell.fill.fore_color.rgb = RGBColor(0, 112, 192)  # 蓝色背景
        cell.text_frame.paragraphs[0].font.color.rgb = RGBColor(255, 255, 255)  # 白色文字
        
        # 填充数据
        for i, (metric, value) in enumerate(data['key_metrics'].items()):
            table.cell(i + 1, 0).text = metric
            table.cell(i + 1, 1).text = str(value)
        
        # 添加内容幻灯片 - 结论
        slide_layout = prs.slide_layouts[1]
        slide = prs.slides.add_slide(slide_layout)
        
        title = slide.shapes.title
        content = slide.placeholders[1]
        
        title.text = "结论与建议"
        
        tf = content.text_frame
        for i, point in enumerate(data['conclusions']):
            if i == 0:
                tf.text = point
            else:
                p = tf.add_paragraph()
                p.text = point
        
        # 保存演示文稿
        output_file = os.path.join(output_dir, f"{data['filename']}.pptx")
        prs.save(output_file)
        print(f"已生成演示文稿: {output_file}")

# 示例数据
project_data = [
    {
        'title': "A项目季度报告",
        'subtitle': "2023年第四季度",
        'overview': "A项目是我们的核心业务项目,专注于提供企业级数据分析解决方案。",
        'key_metrics': {
            '客户数量': 45,
            '收入增长': "23%",
            '客户满意度': "92%",
            '市场份额': "18%"
        },
        'conclusions': [
            "A项目在本季度表现优异,超过预期目标。",
            "建议增加研发投入,进一步提升产品竞争力。",
            "计划在下一季度拓展国际市场。"
        ],
        'filename': "A项目报告"
    },
    {
        'title': "B项目季度报告",
        'subtitle': "2023年第四季度",
        'overview': "B项目是我们的创新孵化项目,专注于人工智能技术在办公自动化领域的应用。",
        'key_metrics': {
            '用户数量': 1200,
            '收入增长': "45%",
            '活跃度': "78%",
            '转化率': "8.5%"
        },
        'conclusions': [
            "B项目增长迅速,用户反馈积极。",
            "需要解决部分性能问题,提高系统稳定性。",
            "建议增加营销预算,扩大用户基础。"
        ],
        'filename': "B项目报告"
    }
]

# 执行批量生成
# batch_generate_presentations(project_data)

实际应用场景

场景一:自动生成销售报告

python
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor
from pptx.enum.chart import XL_CHART_TYPE
from pptx.chart.data import CategoryChartData
import pandas as pd
import os
from datetime import datetime

def generate_sales_report(sales_data_file):
    """根据销售数据自动生成销售报告演示文稿"""
    # 读取销售数据
    try:
        df = pd.read_excel(sales_data_file)
    except Exception as e:
        print(f"读取销售数据失败: {e}")
        print("创建示例数据进行演示...")
        # 创建示例数据
        data = {
            '日期': pd.date_range(start='2023-10-01', periods=12, freq='W'),
            '产品': ['笔记本电脑', '办公桌椅', '打印机', '笔记本电脑', '办公桌椅', '打印机', 
                    '笔记本电脑', '办公桌椅', '打印机', '笔记本电脑', '办公桌椅', '打印机'],
            '销售量': [25, 40, 10, 30, 35, 8, 28, 42, 12, 35, 38, 15],
            '销售额': [150000, 36000, 13000, 180000, 31500, 10400, 168000, 37800, 15600, 210000, 34200, 19500]
        }
        df = pd.DataFrame(data)
        # 保存示例数据
        df.to_excel("sales_data_example.xlsx", index=False)
        sales_data_file = "sales_data_example.xlsx"
        print(f"已创建示例数据文件: {sales_data_file}")
    
    # 创建演示文稿
    prs = Presentation()
    
    # 设置幻灯片尺寸为宽屏(16:9)
    prs.slide_width = Inches(13.33)
    prs.slide_height = Inches(7.5)
    
    # 添加标题幻灯片
    slide_layout = prs.slide_layouts[0]
    slide = prs.slides.add_slide(slide_layout)
    
    # 获取当前日期
    current_date = datetime.now().strftime("%Y年%m月%d日")
    
    # 设置标题和副标题
    title = slide.shapes.title
    subtitle = slide.placeholders[1]
    
    title.text = "销售业绩报告"
    subtitle.text = f"生成日期: {current_date}"
    
    # 数据处理 - 按产品分组统计
    product_sales = df.groupby('产品').agg({'销售量': 'sum', '销售额': 'sum'}).reset_index()
    
    # 添加销售总览幻灯片
    slide_layout = prs.slide_layouts[5]  # 仅标题布局
    slide = prs.slides.add_slide(slide_layout)
    
    title = slide.shapes.title
    title.text = "销售总览"
    
    # 创建表格
    rows, cols = len(product_sales) + 1, 3
    left = Inches(2)
    top = Inches(2)
    width = Inches(9)
    height = Inches(0.8 * rows)
    
    table = slide.shapes.add_table(rows, cols, left, top, width, height).table
    
    # 设置列宽
    table.columns[0].width = Inches(3)
    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.fill.solid()
        cell.fill.fore_color.rgb = RGBColor(0, 112, 192)  # 蓝色背景
        
        paragraph = cell.text_frame.paragraphs[0]
        paragraph.alignment = PP_ALIGN.CENTER
        paragraph.font.bold = True
        paragraph.font.color.rgb = RGBColor(255, 255, 255)  # 白色文字
    
    # 填充数据
    for i, row in product_sales.iterrows():
        table.cell(i + 1, 0).text = row['产品']
        table.cell(i + 1, 1).text = str(row['销售量'])
        table.cell(i + 1, 2).text = f{row['销售额']:,.2f}"
        
        # 设置对齐方式
        table.cell(i + 1, 0).text_frame.paragraphs[0].alignment = PP_ALIGN.LEFT
        table.cell(i + 1, 1).text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
        table.cell(i + 1, 2).text_frame.paragraphs[0].alignment = PP_ALIGN.RIGHT
    
    # 添加销售趋势图幻灯片
    slide_layout = prs.slide_layouts[5]  # 仅标题布局
    slide = prs.slides.add_slide(slide_layout)
    
    title = slide.shapes.title
    title.text = "销售趋势"
    
    # 数据处理 - 按日期分组统计
    df['周'] = df['日期'].dt.strftime('%m-%d')
    weekly_sales = df.groupby('周').agg({'销售额': 'sum'}).reset_index()
    
    # 创建图表数据
    chart_data = CategoryChartData()
    chart_data.categories = weekly_sales['周'].tolist()
    chart_data.add_series('销售额', weekly_sales['销售额'].tolist())
    
    # 添加折线图
    x, y, cx, cy = Inches(2), Inches(2), Inches(9), Inches(4.5)
    chart = slide.shapes.add_chart(
        XL_CHART_TYPE.LINE, x, y, cx, cy, chart_data
    ).chart
    
    # 设置图表标题
    chart.has_title = True
    chart.chart_title.text_frame.text = "周销售额趋势"
    
    # 添加产品占比幻灯片
    slide_layout = prs.slide_layouts[5]  # 仅标题布局
    slide = prs.slides.add_slide(slide_layout)
    
    title = slide.shapes.title
    title.text = "产品销售占比"
    
    # 创建饼图数据
    chart_data = CategoryChartData()
    chart_data.categories = product_sales['产品'].tolist()
    chart_data.add_series('销售额', product_sales['销售额'].tolist())
    
    # 添加饼图
    x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
    chart = slide.shapes.add_chart(
        XL_CHART_TYPE.PIE, x, y, cx, cy, chart_data
    ).chart
    
    # 设置图表标题
    chart.has_title = True
    chart.chart_title.text_frame.text = "销售额占比"
    
    # 添加结论幻灯片
    slide_layout = prs.slide_layouts[1]  # 标题和内容布局
    slide = prs.slides.add_slide(slide_layout)
    
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = "分析与建议"
    
    # 计算一些基本统计数据
    total_sales = df['销售额'].sum()
    best_product = product_sales.loc[product_sales['销售额'].idxmax()]['产品']
    best_product_sales = product_sales['销售额'].max()
    best_product_percentage = (best_product_sales / total_sales) * 100
    
    # 添加分析内容
    tf = content.text_frame
    tf.text = f"总销售额: ¥{total_sales:,.2f}"
    
    p = tf.add_paragraph()
    p.text = f"最畅销产品: {best_product},占总销售额的 {best_product_percentage:.1f}%"
    
    p = tf.add_paragraph()
    p.text = "建议:"
    
    p = tf.add_paragraph()
    p.text = f"增加{best_product}的库存,满足市场需求"
    p.level = 1
    
    p = tf.add_paragraph()
    p.text = "针对销售较低的产品,考虑调整营销策略或价格"
    p.level = 1
    
    p = tf.add_paragraph()
    p.text = "关注销售趋势,及时调整销售目标"
    p.level = 1
    
    # 保存演示文稿
    report_filename = "销售报告.pptx"
    prs.save(report_filename)
    print(f"销售报告已生成: {report_filename}")
    return report_filename

# 执行函数
# generate_sales_report("sales_data.xlsx")

场景二:培训课程幻灯片生成器

python
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor
import os

def generate_training_slides(course_data):
    """生成培训课程幻灯片"""
    # 创建演示文稿
    prs = Presentation()
    
    # 添加标题幻灯片
    slide_layout = prs.slide_layouts[0]
    slide = prs.slides.add_slide(slide_layout)
    
    # 设置标题和副标题
    title = slide.shapes.title
    subtitle = slide.placeholders[1]
    
    title.text = course_data['title']
    subtitle.text = f"讲师: {course_data['instructor']}\n{course_data['date']}"
    
    # 添加课程目标幻灯片
    slide_layout = prs.slide_layouts[1]
    slide = prs.slides.add_slide(slide_layout)
    
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = "课程目标"
    
    tf = content.text_frame
    tf.text = "完成本课程后,您将能够:"
    
    for objective in course_data['objectives']:
        p = tf.add_paragraph()
        p.text = objective
        p.level = 1
    
    # 添加课程大纲幻灯片
    slide_layout = prs.slide_layouts[1]
    slide = prs.slides.add_slide(slide_layout)
    
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = "课程大纲"
    
    tf = content.text_frame
    
    for i, module in enumerate(course_data['modules'], 1):
        if i == 1:
            tf.text = f"{i}. {module['title']}"
        else:
            p = tf.add_paragraph()
            p.text = f"{i}. {module['title']}"
    
    # 为每个模块创建内容幻灯片
    for i, module in enumerate(course_data['modules'], 1):
        # 模块标题幻灯片
        slide_layout = prs.slide_layouts[2]  # 节标题布局
        slide = prs.slides.add_slide(slide_layout)
        
        title = slide.shapes.title
        title.text = f"模块 {i}: {module['title']}"
        
        # 模块内容幻灯片
        for topic in module['topics']:
            slide_layout = prs.slide_layouts[1]  # 标题和内容布局
            slide = prs.slides.add_slide(slide_layout)
            
            title = slide.shapes.title
            content = slide.placeholders[1]
            
            title.text = topic['title']
            
            tf = content.text_frame
            
            for j, point in enumerate(topic['points']):
                if j == 0:
                    tf.text = point
                else:
                    p = tf.add_paragraph()
                    p.text = point
    
    # 添加总结幻灯片
    slide_layout = prs.slide_layouts[1]
    slide = prs.slides.add_slide(slide_layout)
    
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = "总结"
    
    tf = content.text_frame
    for i, point in enumerate(course_data['summary']):
        if i == 0:
            tf.text = point
        else:
            p = tf.add_paragraph()
            p.text = point
    
    # 添加问答幻灯片
    slide_layout = prs.slide_layouts[5]  # 仅标题布局
    slide = prs.slides.add_slide(slide_layout)
    
    title = slide.shapes.title
    title.text = "问题与讨论"
    
    # 在幻灯片中央添加大问号
    left = Inches(5.5)
    top = Inches(3)
    width = Inches(2)
    height = Inches(2)
    
    txBox = slide.shapes.add_textbox(left, top, width, height)
    tf = txBox.text_frame
    tf.text = "?"
    
    p = tf.paragraphs[0]
    p.alignment = PP_ALIGN.CENTER
    run = p.runs[0]
    run.font.size = Pt(120)
    run.font.bold = True
    run.font.color.rgb = RGBColor(0, 112, 192)  # 蓝色
    
    # 保存演示文稿
    output_file = f"{course_data['title'].replace(' ', '_')}_培训课程.pptx"
    prs.save(output_file)
    print(f"培训幻灯片已生成: {output_file}")
    return output_file

# 示例课程数据
python_course = {
    'title': "Python办公自动化实战",
    'instructor': "张教授",
    'date': "2023年12月15日",
    'objectives': [
        "理解Python在办公自动化中的应用场景",
        "掌握Excel、Word和PPT文档的自动化处理",
        "学会使用Python处理文件和目录",
        "能够开发简单的办公自动化脚本"
    ],
    'modules': [
        {
            'title': "Python基础入门",
            'topics': [
                {
                    'title': "Python环境搭建",
                    'points': [
                        "安装Python解释器",
                        "配置开发环境",
                        "使用pip安装第三方库",
                        "编写第一个Python程序"
                    ]
                },
                {
                    'title': "Python基本语法",
                    'points': [
                        "变量和数据类型",
                        "条件语句和循环",
                        "函数定义和调用",
                        "模块和包的使用"
                    ]
                }
            ]
        },
        {
            'title': "Excel文档自动化",
            'topics': [
                {
                    'title': "使用openpyxl操作Excel",
                    'points': [
                        "读取Excel文件",
                        "修改单元格内容",
                        "添加公式和格式",
                        "创建图表和数据透视表"
                    ]
                },
                {
                    'title': "使用pandas处理Excel数据",
                    'points': [
                        "数据导入和导出",
                        "数据清洗和转换",
                        "数据分析和统计",
                        "数据可视化"
                    ]
                }
            ]
        },
        {
            'title': "Word和PPT文档自动化",
            'topics': [
                {
                    'title': "使用python-docx操作Word",
                    'points': [
                        "创建和修改Word文档",
                        "添加文本、图片和表格",
                        "设置格式和样式",
                        "自动生成报告"
                    ]
                },
                {
                    'title': "使用python-pptx操作PPT",
                    'points': [
                        "创建和修改PPT演示文稿",
                        "添加幻灯片和内容",
                        "插入图表和图形",
                        "批量生成演示文稿"
                    ]
                }
            ]
        }
    ],
    'summary': [
        "Python是办公自动化的强大工具",
        "掌握核心库可以处理各种办公文档",
        "自动化脚本可以大幅提高工作效率",
        "持续学习和实践是提高技能的关键"
    ]
}

# 执行函数
# generate_training_slides(python_course)

通过以上代码示例和应用场景,你可以轻松掌握Python PPT演示文稿自动化的各种技巧,大幅提高工作效率。无论是创建简单的演示文稿,还是批量生成复杂的报告、培训材料,Python都能帮你轻松应对。