Python使用python-pptx自动化操作和生成PPT

2025-08-14 10:50

本文主要是介绍Python使用python-pptx自动化操作和生成PPT,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Python使用python-pptx自动化操作和生成PPT》这篇文章主要为大家详细介绍了如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景,感兴趣的小伙伴可以跟随小编...

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

使用python-pptx操作PPT文档

安装python-pptx

pip install python-pptx

基础概念

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

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

创建新的PPT文档

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()

查看可用的幻灯片布局

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()

添加文本框和格式化文本

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()

插入图片

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()

添加形状

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()

创建表格

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, 192php)  # 蓝色背景
        
        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()

插入图表

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()

模板复用与批量生成

使用模板创建演示文稿

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()

批量生成演示文稿

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)

实际应用场景

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

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_ALI编程GN.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")

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

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.placeholjavascriptders[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.alignmentphp = 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': [
                        "变量和数据类型",
                        "条件语句和循环",
                        "函数定义和China编程调用",
                        "模块和包的使用"
                    ]
                }
            ]
        },
        {
            '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都能帮你轻松应对。

以上就是Python使用python-pptx自动化操作和生成PPT的详细内容,更多关于Python自动化操作PPT的资料请关注编程China编程(www.chinasem.cn)其它相关文章!

这篇关于Python使用python-pptx自动化操作和生成PPT的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155729

相关文章

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Python Flask实现定时任务的不同方法详解

《PythonFlask实现定时任务的不同方法详解》在Flask中实现定时任务,最常用的方法是使用APScheduler库,本文将提供一个完整的解决方案,有需要的小伙伴可以跟随小编一起学习一下... 目录完js整实现方案代码解释1. 依赖安装2. 核心组件3. 任务类型4. 任务管理5. 持久化存储生产环境

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Python批量替换多个Word文档的多个关键字的方法

《Python批量替换多个Word文档的多个关键字的方法》有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉,所以本文给大家介绍了Py... 目录工具准备先梳理一下思路神奇代码来啦!代码详解激动人心的测试结语嘿,各位小伙伴们,大家好!有没有想

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

MySQL中优化CPU使用的详细指南

《MySQL中优化CPU使用的详细指南》优化MySQL的CPU使用可以显著提高数据库的性能和响应时间,本文为大家整理了一些优化CPU使用的方法,大家可以根据需要进行选择... 目录一、优化查询和索引1.1 优化查询语句1.2 创建和优化索引1.3 避免全表扫描二、调整mysql配置参数2.1 调整线程数2.

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

Python库 Django 的简介、安装、用法入门教程

《Python库Django的简介、安装、用法入门教程》Django是Python最流行的Web框架之一,它帮助开发者快速、高效地构建功能强大的Web应用程序,接下来我们将从简介、安装到用法详解,... 目录一、Django 简介 二、Django 的安装教程 1. 创建虚拟环境2. 安装Django三、创

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm