当前位置: 代码网 > it编程>前端脚本>Python > Python使用python-pptx实现自动化制作PPT

Python使用python-pptx实现自动化制作PPT

2026年01月14日 Python 我要评论
在现代商业和教育环境中,powerpoint演示文稿是信息传递的重要工具。通过python自动化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, 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()

插入图表

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_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")

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

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都能帮你轻松应对。

以上就是python使用python-pptx实现自动化制作ppt的详细内容,更多关于python ppt自动化的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com