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