Python100个库分享第36个—python-pptx(办公篇)

目录

    • 专栏导读
    • 库简介
      • 主要特点
    • ️ 安装方法
    • 基础使用
      • 1. 导入库和创建演示文稿
      • 2. 基本幻灯片操作
      • 3. 常用布局类型
    • 文本和格式设置
      • 1. 文本框和段落
      • 2. 文本对齐和样式
    • 表格操作
      • 1. 创建基本表格
      • 2. 高级表格格式
    • ️ 图片和形状
      • 1. 插入图片
      • 2. 添加形状
    • 图表功能
      • 1. 创建柱状图
      • 2. 创建饼图
    • 办公实用功能
      • 1. 创建项目汇报PPT
      • 2. 创建培训课件
      • 3. 创建产品介绍PPT
    • 高级功能
      • 1. 母版和主题
      • 2. 动画和过渡效果
      • 3. 批量生成幻灯片
    • 性能优化和最佳实践
      • 1. 批量操作优化
      • 2. 模板化开发
    • ⚠️ 常见问题和解决方案
      • 1. 字体兼容性
      • 2. 图片处理
      • 3. 内存优化
    • 总结
      • 最佳实践
    • 结尾

专栏导读

  • 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手

  • ️‍ 博客主页:请点击——> 一晌小贪欢的博客主页求关注

  • 该系列文章专栏:请点击——>Python办公自动化专栏求订阅

  • 此外还有爬虫专栏:请点击——>Python爬虫基础专栏求订阅

  • 此外还有python基础专栏:请点击——>Python基础学习专栏求订阅

  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正

  • ❤️ 欢迎各位佬关注! ❤️

库简介

  • python-pptx是一个用于创建和修改Microsoft PowerPoint演示文稿(.pptx)的Python库。它提供了丰富的API来处理幻灯片的各种元素,包括文本、图片、表格、图表等,是办公自动化和演示文稿批量生成的强大工具。

主要特点

  • 支持PowerPoint 2007+格式(.pptx)
  • 创建和修改演示文稿
  • 支持文本、图片、表格、图表等元素
  • 丰富的样式和格式设置功能
  • 支持母版和布局管理
  • 纯Python实现,跨平台兼容

️ 安装方法

pip install python-pptx

基础使用

1. 导入库和创建演示文稿

from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.enum.shapes import MSO_SHAPE
from pptx.dml.color import RGBColor
from pptx.enum.dml import MSO_THEME_COLOR
import datetime

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

# 或加载现有演示文稿
# prs = Presentation('existing_presentation.pptx')

2. 基本幻灯片操作

# 获取幻灯片布局
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 = "副标题内容"

# 保存演示文稿
prs.save('my_presentation.pptx')

3. 常用布局类型

def explore_layouts():
    prs = Presentation()
    
    # 常用布局索引
    layouts = {
        0: "标题幻灯片",
        1: "标题和内容",
        2: "节标题",
        3: "两栏内容",
        4: "比较",
        5: "仅标题",
        6: "空白",
        7: "内容和标题",
        8: "图片和标题"
    }
    
    for layout_id, layout_name in layouts.items():
        if layout_id < len(prs.slide_layouts):
            slide_layout = prs.slide_layouts[layout_id]
            slide = prs.slides.add_slide(slide_layout)
            
            # 设置标题
            if slide.shapes.title:
                slide.shapes.title.text = f"布局 {layout_id}: {layout_name}"
    
    prs.save('布局示例.pptx')

文本和格式设置

1. 文本框和段落

def create_text_content():
    prs = Presentation()
    slide_layout = prs.slide_layouts[5]  # 仅标题布局
    slide = prs.slides.add_slide(slide_layout)
    
    # 设置标题
    slide.shapes.title.text = "文本格式示例"
    
    # 添加文本框
    left = Inches(1)
    top = Inches(2)
    width = Inches(8)
    height = Inches(4)
    
    textbox = slide.shapes.add_textbox(left, top, width, height)
    text_frame = textbox.text_frame
    
    # 第一段
    p1 = text_frame.paragraphs[0]
    p1.text = "这是第一段文本"
    p1.font.name = "微软雅黑"
    p1.font.size = Pt(18)
    p1.font.bold = True
    p1.font.color.rgb = RGBColor(255, 0, 0)  # 红色
    
    # 添加第二段
    p2 = text_frame.add_paragraph()
    p2.text = "这是第二段文本,演示不同的格式"
    p2.font.name = "宋体"
    p2.font.size = Pt(14)
    p2.font.italic = True
    p2.font.color.rgb = RGBColor(0, 0, 255)  # 蓝色
    
    # 添加项目符号列表
    p3 = text_frame.add_paragraph()
    p3.text = "项目符号项目1"
    p3.level = 0  # 第一级
    
    p4 = text_frame.add_paragraph()
    p4.text = "项目符号项目2"
    p4.level = 1  # 第二级
    
    prs.save('文本格式示例.pptx')

2. 文本对齐和样式

def text_alignment_styles():
    prs = Presentation()
    slide_layout = prs.slide_layouts[5]
    slide = prs.slides.add_slide(slide_layout)
    
    slide.shapes.title.text = "文本对齐示例"
    
    # 左对齐文本
    left_box = slide.shapes.add_textbox(Inches(0.5), Inches(1.5), Inches(3), Inches(1))
    left_frame = left_box.text_frame
    left_p = left_frame.paragraphs[0]
    left_p.text = "左对齐文本"
    left_p.alignment = PP_ALIGN.LEFT
    
    # 居中对齐文本
    center_box = slide.shapes.add_textbox(Inches(4), Inches(1.5), Inches(3), Inches(1))
    center_frame = center_box.text_frame
    center_p = center_frame.paragraphs[0]
    center_p.text = "居中对齐文本"
    center_p.alignment = PP_ALIGN.CENTER
    
    # 右对齐文本
    right_box = slide.shapes.add_textbox(Inches(7.5), Inches(1.5), Inches(3), Inches(1))
    right_frame = right_box.text_frame
    right_p = right_frame.paragraphs[0]
    right_p.text = "右对齐文本"
    right_p.alignment = PP_ALIGN.RIGHT
    
    prs.save('文本对齐示例.pptx')

表格操作

1. 创建基本表格

def create_basic_table():
    prs = Presentation()
    slide_layout = prs.slide_layouts[5]
    slide = prs.slides.add_slide(slide_layout)
    
    slide.shapes.title.text = "员工信息表"
    
    # 创建表格 (4行5列)
    rows, cols = 4, 5
    left = Inches(1)
    top = Inches(2)
    width = Inches(8)
    height = Inches(3)
    
    table = slide.shapes.add_table(rows, cols, left, top, width, height).table
    
    # 设置表头
    headers = ['工号', '姓名', '部门', '职位', '薪资']
    for i, header in enumerate(headers):
        cell = table.cell(0, i)
        cell.text = header
        # 设置表头样式
        cell.text_frame.paragraphs[0].font.bold = True
        cell.text_frame.paragraphs[0].font.size = Pt(12)
        cell.fill.solid()
        cell.fill.fore_color.rgb = RGBColor(79, 129, 189)  # 蓝色背景
        cell.text_frame.paragraphs[0].font.color.rgb = RGBColor(255, 255, 255)  # 白色文字
    
    # 填充数据
    data = [
        ['E001', '张三', '技术部', '高级工程师', '12000'],
        ['E002', '李四', '销售部', '销售经理', '10000'],
        ['E003', '王五', '人事部', 'HR专员', '8000']
    ]
    
    for row_idx, row_data in enumerate(data, 1):
        for col_idx, value in enumerate(row_data):
            cell = table.cell(row_idx, col_idx)
            cell.text = value
            cell.text_frame.paragraphs[0].font.size = Pt(10)
    
    prs.save('员工信息表.pptx')

2. 高级表格格式

def create_advanced_table():
    prs = Presentation()
    slide_layout = prs.slide_layouts[5]
    slide = prs.slides.add_slide(slide_layout)
    
    slide.shapes.title.text = "销售业绩表"
    
    # 创建表格
    rows, cols = 5, 4
    table = slide.shapes.add_table(rows, cols, Inches(1), Inches(2), Inches(8), Inches(4)).table
    
    # 设置列宽
    table.columns[0].width = Inches(2)
    table.columns[1].width = Inches(2)
    table.columns[2].width = Inches(2)
    table.columns[3].width = Inches(2)
    
    # 表头数据
    headers = ['销售员', '目标(万)', '实际(万)', '完成率']
    for i, header in enumerate(headers):
        cell = table.cell(0, i)
        cell.text = header
        # 表头样式
        paragraph = cell.text_frame.paragraphs[0]
        paragraph.alignment = PP_ALIGN.CENTER
        paragraph.font.bold = True
        paragraph.font.size = Pt(14)
        cell.fill.solid()
        cell.fill.fore_color.rgb = RGBColor(68, 114, 196)
        paragraph.font.color.rgb = RGBColor(255, 255, 255)
    
    # 数据
    sales_data = [
        ['张三', '100', '120', '120%'],
        ['李四', '80', '75', '94%'],
        ['王五', '90', '95', '106%'],
        ['合计', '270', '290', '107%']
    ]
    
    for row_idx, row_data in enumerate(sales_data, 1):
        for col_idx, value in enumerate(row_data):
            cell = table.cell(row_idx, col_idx)
            cell.text = value
            paragraph = cell.text_frame.paragraphs[0]
            paragraph.alignment = PP_ALIGN.CENTER
            paragraph.font.size = Pt(12)
            
            # 最后一行(合计行)特殊样式
            if row_idx == len(sales_data):
                paragraph.font.bold = True
                cell.fill.solid()
                cell.fill.fore_color.rgb = RGBColor(217, 217, 217)
            
            # 完成率列颜色标识
            if col_idx == 3 and row_idx < len(sales_data):
                completion_rate = float(value.replace('%', ''))
                if completion_rate >= 100:
                    paragraph.font.color.rgb = RGBColor(0, 128, 0)  # 绿色
                else:
                    paragraph.font.color.rgb = RGBColor(255, 0, 0)  # 红色
    
    prs.save('销售业绩表.pptx')

️ 图片和形状

1. 插入图片

def insert_images():
    prs = Presentation()
    slide_layout = prs.slide_layouts[5]
    slide = prs.slides.add_slide(slide_layout)
    
    slide.shapes.title.text = "图片插入示例"
    
    try:
        # 插入图片(需要准备图片文件)
        left = Inches(1)
        top = Inches(2)
        width = Inches(4)
        height = Inches(3)
        
        # 如果有图片文件
        # slide.shapes.add_picture('company_logo.png', left, top, width, height)
        
        # 创建占位符文本框
        placeholder = slide.shapes.add_textbox(left, top, width, height)
        placeholder.text_frame.text = "[图片占位符]\n请替换为实际图片"
        placeholder.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
        
    except FileNotFoundError:
        # 如果没有图片文件,创建文本说明
        textbox = slide.shapes.add_textbox(Inches(1), Inches(2), Inches(8), Inches(2))
        textbox.text_frame.text = "注意:需要准备相应的图片文件才能插入图片"
    
    prs.save('图片示例.pptx')

2. 添加形状

def add_shapes():
    prs = Presentation()
    slide_layout = prs.slide_layouts[5]
    slide = prs.slides.add_slide(slide_layout)
    
    slide.shapes.title.text = "形状示例"
    
    # 添加矩形
    left = Inches(1)
    top = Inches(2)
    width = Inches(2)
    height = Inches(1)
    
    rectangle = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, left, top, width, height)
    rectangle.text_frame.text = "矩形"
    rectangle.fill.solid()
    rectangle.fill.fore_color.rgb = RGBColor(79, 129, 189)
    
    # 添加圆形
    left = Inches(4)
    circle = slide.shapes.add_shape(MSO_SHAPE.OVAL, left, top, width, height)
    circle.text_frame.text = "圆形"
    circle.fill.solid()
    circle.fill.fore_color.rgb = RGBColor(155, 187, 89)
    
    # 添加箭头
    left = Inches(7)
    arrow = slide.shapes.add_shape(MSO_SHAPE.RIGHT_ARROW, left, top, width, height)
    arrow.text_frame.text = "箭头"
    arrow.fill.solid()
    arrow.fill.fore_color.rgb = RGBColor(192, 80, 77)
    
    prs.save('形状示例.pptx')

图表功能

1. 创建柱状图

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

def create_bar_chart():
    prs = Presentation()
    slide_layout = prs.slide_layouts[5]
    slide = prs.slides.add_slide(slide_layout)
    
    slide.shapes.title.text = "销售数据图表"
    
    # 准备图表数据
    chart_data = CategoryChartData()
    chart_data.categories = ['Q1', 'Q2', 'Q3', 'Q4']
    chart_data.add_series('2023年', (20.4, 30.6, 40.2, 50.8))
    chart_data.add_series('2024年', (25.2, 35.4, 45.6, 55.9))
    
    # 添加图表
    x, y, cx, cy = Inches(2), Inches(2), Inches(6), 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 = "季度销售对比"
    
    # 设置数据标签
    chart.plots[0].has_data_labels = True
    data_labels = chart.plots[0].data_labels
    data_labels.number_format = '0.0'
    
    prs.save('销售图表.pptx')

2. 创建饼图

def create_pie_chart():
    prs = Presentation()
    slide_layout = prs.slide_layouts[5]
    slide = prs.slides.add_slide(slide_layout)
    
    slide.shapes.title.text = "市场份额分析"
    
    # 饼图数据
    chart_data = CategoryChartData()
    chart_data.categories = ['产品A', '产品B', '产品C', '产品D', '其他']
    chart_data.add_series('市场份额', (35.2, 28.4, 18.6, 12.3, 5.5))
    
    # 添加饼图
    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 = "产品市场份额分布"
    
    # 设置数据标签
    chart.plots[0].has_data_labels = True
    data_labels = chart.plots[0].data_labels
    data_labels.number_format = '0.0%'
    data_labels.position = 2  # 显示在扇形外部
    
    prs.save('市场份额饼图.pptx')

办公实用功能

1. 创建项目汇报PPT

def create_project_report():
    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 = "项目进度汇报"
    subtitle.text = f"汇报人:张三\n汇报日期:{datetime.date.today()}"
    
    # 目录页
    bullet_slide_layout = prs.slide_layouts[1]
    slide = prs.slides.add_slide(bullet_slide_layout)
    slide.shapes.title.text = "汇报内容"
    
    content = slide.placeholders[1]
    content.text = "项目概述\n进度情况\n遇到的问题\n解决方案\n下一步计划"
    
    # 项目概述页
    slide = prs.slides.add_slide(bullet_slide_layout)
    slide.shapes.title.text = "项目概述"
    
    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 = "项目周期:2024年1月-6月"
    p.level = 1
    
    p = tf.add_paragraph()
    p.text = "团队规模:8人"
    p.level = 1
    
    # 进度情况页
    slide = prs.slides.add_slide(prs.slide_layouts[5])
    slide.shapes.title.text = "项目进度"
    
    # 创建进度表格
    table = slide.shapes.add_table(5, 4, Inches(1), Inches(2), Inches(8), Inches(3)).table
    
    # 表头
    headers = ['阶段', '计划完成时间', '实际完成时间', '完成状态']
    for i, header in enumerate(headers):
        cell = table.cell(0, i)
        cell.text = header
        cell.text_frame.paragraphs[0].font.bold = True
        cell.fill.solid()
        cell.fill.fore_color.rgb = RGBColor(68, 114, 196)
        cell.text_frame.paragraphs[0].font.color.rgb = RGBColor(255, 255, 255)
    
    # 进度数据
    progress_data = [
        ['需求分析', '2024-01-31', '2024-01-28', '已完成'],
        ['系统设计', '2024-02-28', '2024-03-05', '已完成'],
        ['开发阶段', '2024-04-30', '进行中', '80%'],
        ['测试阶段', '2024-05-31', '待开始', '0%']
    ]
    
    for row_idx, row_data in enumerate(progress_data, 1):
        for col_idx, value in enumerate(row_data):
            cell = table.cell(row_idx, col_idx)
            cell.text = value
            # 状态列颜色标识
            if col_idx == 3:
                if '已完成' in value:
                    cell.text_frame.paragraphs[0].font.color.rgb = RGBColor(0, 128, 0)
                elif '进行中' in value:
                    cell.text_frame.paragraphs[0].font.color.rgb = RGBColor(255, 165, 0)
    
    # 问题和解决方案页
    slide = prs.slides.add_slide(bullet_slide_layout)
    slide.shapes.title.text = "遇到的问题及解决方案"
    
    content = slide.placeholders[1]
    tf = content.text_frame
    tf.text = "主要问题:"
    
    p = tf.add_paragraph()
    p.text = "第三方API接口不稳定"
    p.level = 1
    
    p = tf.add_paragraph()
    p.text = "数据库性能瓶颈"
    p.level = 1
    
    p = tf.add_paragraph()
    p.text = "解决方案:"
    
    p = tf.add_paragraph()
    p.text = "增加API重试机制和备用方案"
    p.level = 1
    
    p = tf.add_paragraph()
    p.text = "优化数据库查询和增加缓存"
    p.level = 1
    
    prs.save('项目汇报.pptx')

2. 创建培训课件

def create_training_slides():
    prs = Presentation()
    
    # 课程封面
    title_slide = prs.slides.add_slide(prs.slide_layouts[0])
    title_slide.shapes.title.text = "Python基础培训"
    title_slide.placeholders[1].text = "讲师:李老师\n时间:2024年1月\n地点:培训室A"
    
    # 课程大纲
    outline_slide = prs.slides.add_slide(prs.slide_layouts[1])
    outline_slide.shapes.title.text = "课程大纲"
    
    content = outline_slide.placeholders[1]
    tf = content.text_frame
    tf.text = "Python简介"
    
    topics = [
        "基础语法",
        "数据类型",
        "控制结构",
        "函数定义",
        "面向对象",
        "实战练习"
    ]
    
    for topic in topics:
        p = tf.add_paragraph()
        p.text = topic
        p.level = 1
    
    # 知识点详解页
    detail_slide = prs.slides.add_slide(prs.slide_layouts[1])
    detail_slide.shapes.title.text = "Python数据类型"
    
    content = detail_slide.placeholders[1]
    tf = content.text_frame
    tf.text = "基本数据类型:"
    
    data_types = [
        ("整数 (int)", "例:age = 25"),
        ("浮点数 (float)", "例:price = 99.99"),
        ("字符串 (str)", "例:name = 'Python'"),
        ("布尔值 (bool)", "例:is_valid = True"),
        ("列表 (list)", "例:numbers = [1, 2, 3]"),
        ("字典 (dict)", "例:person = {'name': 'Tom'}")
    ]
    
    for data_type, example in data_types:
        p = tf.add_paragraph()
        p.text = f"{data_type} - {example}"
        p.level = 1
    
    # 代码示例页
    code_slide = prs.slides.add_slide(prs.slide_layouts[5])
    code_slide.shapes.title.text = "代码示例"
    
    # 添加代码文本框
    code_box = code_slide.shapes.add_textbox(Inches(1), Inches(2), Inches(8), Inches(4))
    code_frame = code_box.text_frame
    
    code_text = """# Python变量定义示例
name = "张三"
age = 25
height = 1.75
is_student = True

# 输出信息
print(f"姓名:{name}")
print(f"年龄:{age}")
print(f"身高:{height}米")
print(f"是否学生:{is_student}")"""
    
    code_frame.text = code_text
    # 设置代码字体
    for paragraph in code_frame.paragraphs:
        paragraph.font.name = "Consolas"
        paragraph.font.size = Pt(12)
    
    # 练习题页
    exercise_slide = prs.slides.add_slide(prs.slide_layouts[1])
    exercise_slide.shapes.title.text = "课堂练习"
    
    content = exercise_slide.placeholders[1]
    tf = content.text_frame
    tf.text = "练习1:创建一个学生信息字典"
    
    p = tf.add_paragraph()
    p.text = "包含姓名、年龄、专业、成绩等信息"
    p.level = 1
    
    p = tf.add_paragraph()
    p.text = "练习2:编写函数计算平均成绩"
    
    p = tf.add_paragraph()
    p.text = "输入多个学生的成绩,返回平均值"
    p.level = 1
    
    prs.save('Python培训课件.pptx')

3. 创建产品介绍PPT

def create_product_presentation():
    prs = Presentation()
    
    # 产品封面
    title_slide = prs.slides.add_slide(prs.slide_layouts[0])
    title_slide.shapes.title.text = "智能办公系统"
    title_slide.placeholders[1].text = "让办公更智能,让工作更高效\n\n产品发布会\n2024年1月"
    
    # 产品概述
    overview_slide = prs.slides.add_slide(prs.slide_layouts[1])
    overview_slide.shapes.title.text = "产品概述"
    
    content = overview_slide.placeholders[1]
    tf = content.text_frame
    tf.text = "产品定位:企业级智能办公解决方案"
    
    features = [
        "智能文档管理",
        "自动化工作流程",
        "数据分析与报表",
        "团队协作平台",
        "移动办公支持"
    ]
    
    for feature in features:
        p = tf.add_paragraph()
        p.text = feature
        p.level = 1
    
    # 核心功能页
    feature_slide = prs.slides.add_slide(prs.slide_layouts[5])
    feature_slide.shapes.title.text = "核心功能"
    
    # 创建功能对比表
    table = feature_slide.shapes.add_table(5, 3, Inches(1), Inches(2), Inches(8), Inches(4)).table
    
    # 表头
    headers = ['功能模块', '传统方式', '智能方式']
    for i, header in enumerate(headers):
        cell = table.cell(0, i)
        cell.text = header
        cell.text_frame.paragraphs[0].font.bold = True
        cell.fill.solid()
        cell.fill.fore_color.rgb = RGBColor(68, 114, 196)
        cell.text_frame.paragraphs[0].font.color.rgb = RGBColor(255, 255, 255)
    
    # 功能对比数据
    comparison_data = [
        ['文档管理', '手动分类整理', 'AI自动分类标签'],
        ['审批流程', '纸质流转签字', '电子化自动流转'],
        ['数据统计', '手工制作报表', '实时自动生成'],
        ['团队沟通', '邮件电话会议', '集成化协作平台']
    ]
    
    for row_idx, row_data in enumerate(comparison_data, 1):
        for col_idx, value in enumerate(row_data):
            cell = table.cell(row_idx, col_idx)
            cell.text = value
            cell.text_frame.paragraphs[0].font.size = Pt(11)
            # 智能方式列标绿色
            if col_idx == 2:
                cell.text_frame.paragraphs[0].font.color.rgb = RGBColor(0, 128, 0)
    
    # 技术优势页
    tech_slide = prs.slides.add_slide(prs.slide_layouts[2])
    tech_slide.shapes.title.text = "技术优势"
    
    # 添加技术特点
    tech_box = tech_slide.shapes.add_textbox(Inches(1), Inches(2), Inches(8), Inches(4))
    tech_frame = tech_box.text_frame
    
    tech_points = [
        " 云原生架构,支持弹性扩展",
        " 企业级安全保障,数据加密传输",
        " AI智能助手,提升工作效率",
        " 跨平台支持,随时随地办公",
        " 开放API接口,易于集成扩展"
    ]
    
    for i, point in enumerate(tech_points):
        if i == 0:
            tech_frame.text = point
        else:
            p = tech_frame.add_paragraph()
            p.text = point
        
        tech_frame.paragraphs[i].font.size = Pt(16)
        tech_frame.paragraphs[i].space_after = Pt(12)
    
    # 联系我们页
    contact_slide = prs.slides.add_slide(prs.slide_layouts[5])
    contact_slide.shapes.title.text = "联系我们"
    
    contact_box = contact_slide.shapes.add_textbox(Inches(2), Inches(2.5), Inches(6), Inches(3))
    contact_frame = contact_box.text_frame
    contact_frame.text = " 销售热线:400-123-4567\n 邮箱:[email protected]\n 官网:www.company.com\n 地址:北京市朝阳区科技园"
    
    for paragraph in contact_frame.paragraphs:
        paragraph.alignment = PP_ALIGN.CENTER
        paragraph.font.size = Pt(18)
        paragraph.space_after = Pt(12)
    
    prs.save('产品介绍.pptx')

高级功能

1. 母版和主题

def work_with_master():
    prs = Presentation()
    
    # 获取幻灯片母版
    slide_master = prs.slide_master
    
    # 修改母版标题样式
    title_placeholder = slide_master.placeholders[0]  # 标题占位符
    title_placeholder.text_frame.paragraphs[0].font.name = "微软雅黑"
    title_placeholder.text_frame.paragraphs[0].font.size = Pt(24)
    title_placeholder.text_frame.paragraphs[0].font.color.rgb = RGBColor(68, 114, 196)
    
    # 创建使用母版的幻灯片
    slide = prs.slides.add_slide(prs.slide_layouts[1])
    slide.shapes.title.text = "使用自定义母版的标题"
    slide.placeholders[1].text = "这个标题使用了自定义的母版样式"
    
    prs.save('自定义母版.pptx')

2. 动画和过渡效果

def add_animations():
    prs = Presentation()
    slide = prs.slides.add_slide(prs.slide_layouts[1])
    
    slide.shapes.title.text = "动画效果示例"
    
    # 添加文本内容
    content = slide.placeholders[1]
    tf = content.text_frame
    tf.text = "第一个要点"
    
    points = ["第二个要点", "第三个要点", "第四个要点"]
    for point in points:
        p = tf.add_paragraph()
        p.text = point
        p.level = 1
    
    # 注意:python-pptx目前不直接支持动画设置
    # 动画需要在PowerPoint中手动添加或使用其他工具
    
    prs.save('动画示例.pptx')

3. 批量生成幻灯片

def batch_generate_slides():
    prs = Presentation()
    
    # 员工数据
    employees = [
        {'name': '张三', 'department': '技术部', 'position': '高级工程师', 'achievements': ['完成核心模块开发', '优化系统性能', '指导新员工']},
        {'name': '李四', 'department': '销售部', 'position': '销售经理', 'achievements': ['超额完成销售目标', '开拓新客户', '团队管理优秀']},
        {'name': '王五', 'department': '人事部', 'position': 'HR专员', 'achievements': ['完善招聘流程', '组织员工培训', '提升员工满意度']}
    ]
    
    # 为每个员工生成一页幻灯片
    for emp in employees:
        slide = prs.slides.add_slide(prs.slide_layouts[1])
        slide.shapes.title.text = f"{emp['name']} - 年度总结"
        
        content = slide.placeholders[1]
        tf = content.text_frame
        tf.text = f"部门:{emp['department']}"
        
        p = tf.add_paragraph()
        p.text = f"职位:{emp['position']}"
        
        p = tf.add_paragraph()
        p.text = "主要成就:"
        
        for achievement in emp['achievements']:
            p = tf.add_paragraph()
            p.text = achievement
            p.level = 1
    
    prs.save('员工年度总结.pptx')

性能优化和最佳实践

1. 批量操作优化

def optimize_batch_operations():
    prs = Presentation()
    
    # 预定义样式
    title_font_size = Pt(24)
    content_font_size = Pt(16)
    
    # 批量创建幻灯片
    slide_data = [
        ("第一章", ["要点1", "要点2", "要点3"]),
        ("第二章", ["要点A", "要点B", "要点C"]),
        ("第三章", ["要点X", "要点Y", "要点Z"])
    ]
    
    for title, points in slide_data:
        slide = prs.slides.add_slide(prs.slide_layouts[1])
        slide.shapes.title.text = title
        slide.shapes.title.text_frame.paragraphs[0].font.size = title_font_size
        
        content = slide.placeholders[1]
        tf = content.text_frame
        tf.text = points[0]
        tf.paragraphs[0].font.size = content_font_size
        
        for point in points[1:]:
            p = tf.add_paragraph()
            p.text = point
            p.font.size = content_font_size
    
    prs.save('批量优化示例.pptx')

2. 模板化开发

def create_template_system():
    # 创建基础模板
    def create_base_template():
        prs = Presentation()
        
        # 设置默认字体和样式
        slide = prs.slides.add_slide(prs.slide_layouts[0])
        slide.shapes.title.text = "{{TITLE}}"
        slide.placeholders[1].text = "{{SUBTITLE}}"
        
        return prs
    
    # 使用模板生成演示文稿
    def generate_from_template(template_data):
        prs = create_base_template()
        
        # 替换占位符
        for slide in prs.slides:
            for shape in slide.shapes:
                if hasattr(shape, 'text_frame'):
                    for paragraph in shape.text_frame.paragraphs:
                        for key, value in template_data.items():
                            if key in paragraph.text:
                                paragraph.text = paragraph.text.replace(key, value)
        
        return prs
    
    # 示例数据
    data = {
        "{{TITLE}}": "季度业务回顾",
        "{{SUBTITLE}}": "2024年第一季度\n业务部门汇报"
    }
    
    prs = generate_from_template(data)
    prs.save('模板生成示例.pptx')

⚠️ 常见问题和解决方案

1. 字体兼容性

def handle_font_compatibility():
    prs = Presentation()
    slide = prs.slides.add_slide(prs.slide_layouts[1])
    
    slide.shapes.title.text = "字体兼容性处理"
    
    # 设置备用字体
    content = slide.placeholders[1]
    tf = content.text_frame
    tf.text = "中文字体测试"
    
    # 尝试设置首选字体,失败时使用备用字体
    try:
        tf.paragraphs[0].font.name = "微软雅黑"
    except:
        tf.paragraphs[0].font.name = "Arial"  # 备用字体
    
    prs.save('字体兼容性.pptx')

2. 图片处理

def handle_image_processing():
    prs = Presentation()
    slide = prs.slides.add_slide(prs.slide_layouts[5])
    
    slide.shapes.title.text = "图片处理示例"
    
    # 安全的图片插入
    def safe_add_picture(slide, image_path, left, top, width, height):
        try:
            slide.shapes.add_picture(image_path, left, top, width, height)
            return True
        except FileNotFoundError:
            # 创建占位符
            placeholder = slide.shapes.add_textbox(left, top, width, height)
            placeholder.text_frame.text = f"[图片占位符]\n{image_path}"
            placeholder.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
            return False
    
    # 使用安全的图片插入方法
    safe_add_picture(slide, 'logo.png', Inches(1), Inches(2), Inches(3), Inches(2))
    
    prs.save('图片处理示例.pptx')

3. 内存优化

def memory_optimization():
    # 处理大量幻灯片时的内存优化
    def create_large_presentation(slide_count):
        prs = Presentation()
        
        # 分批处理
        batch_size = 50
        for i in range(0, slide_count, batch_size):
            batch_end = min(i + batch_size, slide_count)
            
            for j in range(i, batch_end):
                slide = prs.slides.add_slide(prs.slide_layouts[1])
                slide.shapes.title.text = f"幻灯片 {j + 1}"
                slide.placeholders[1].text = f"这是第 {j + 1} 张幻灯片的内容"
            
            # 可以在这里保存中间结果
            if i > 0 and i % 100 == 0:
                print(f"已处理 {i} 张幻灯片")
        
        return prs
    
    # 创建大型演示文稿
    large_prs = create_large_presentation(200)
    large_prs.save('大型演示文稿.pptx')

总结

python-pptx是Python处理PowerPoint演示文稿的强大工具,特别适合办公自动化和批量生成场景。通过本文介绍的方法,你可以:

  1. 基础操作:创建、修改PowerPoint文档
  2. 内容管理:文本、表格、图片、图表
  3. 格式设置:字体、颜色、对齐、样式
  4. 办公应用:项目汇报、培训课件、产品介绍
  5. 高级功能:母版管理、批量生成、模板系统
  6. 性能优化:批量操作、内存管理

最佳实践

1. 合理使用布局和母版
2. 批量操作提高效率
3. 注意字体和图片兼容性
4. 使用模板系统提高复用性
5. 处理大型演示文稿时考虑内存优化
6. 做好异常处理和错误恢复
python-pptx让PowerPoint操作变得简单高效,是演示文稿自动化的重要工具!

结尾

  • 希望对初学者有帮助;致力于办公自动化的小小程序员一枚

  • 希望能得到大家的【❤️一个免费关注❤️】感谢!

  • 求个 关注 +❤️ 喜欢 ❤️ + 收藏

  • 此外还有办公自动化专栏,欢迎大家订阅:Python办公自动化专栏

  • 此外还有爬虫专栏,欢迎大家订阅:Python爬虫基础专栏

  • 此外还有Python基础专栏,欢迎大家订阅:Python基础学习专栏

你可能感兴趣的:(Python100个库分享,python,开发语言,python办公,python-pptx,python读取ppt,python操作ppt)