在现代商业和教育环境中,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 RGBColordef create_simple_presentation():"""创建一个简单的PPT演示文稿"""# 创建演示文稿对象prs = Presentation()# 获取第一个布局(标题幻灯片)title_slide_layout = prs.slide_layouts[0]# 添加标题幻灯片slide = prs.slides.add_slide(title_slide_layout)# 设置标题和副标题title = slide.shapes.titlesubtitle = 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.titletitle.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 = 1p = tf.add_paragraph()p.text = "应用主题和样式"p.level = 0  # 恢复到第一级# 保存演示文稿prs.save("简单演示文稿.pptx")print("演示文稿已保存为: 简单演示文稿.pptx")# 执行函数
create_simple_presentation()

查看可用的幻灯片布局

from pptx import Presentationdef 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 '标题布局'}"breakprint(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 RGBColordef 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 = Truerun.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 = Truerun = p.add_run()run.text = ",这部分是"run = p.add_run()run.text = "斜体"run.font.italic = Truerun = 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 Inchesdef add_picture_to_slide():"""向幻灯片中添加图片"""prs = Presentation()# 添加标题和内容布局的幻灯片slide_layout = prs.slide_layouts[1]slide = prs.slides.add_slide(slide_layout)# 设置标题title = slide.shapes.titletitle.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_frametf.text = "图片说明:这是一个示例图片"except Exception as e:# 如果图片不存在,添加错误提示content = slide.placeholders[1]tf = content.text_frametf.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 RGBColordef 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_frametf.text = "各种形状示例"tf.paragraphs[0].alignment = PP_ALIGN.CENTERtf.paragraphs[0].runs[0].font.bold = Truetf.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_frametf.text = "带文本的形状"tf.paragraphs[0].alignment = PP_ALIGN.CENTERtf.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 RGBColordef create_table_slide():"""创建包含表格的幻灯片"""prs = Presentation()# 添加标题和内容布局的幻灯片slide_layout = prs.slide_layouts[5]  # 仅标题布局slide = prs.slides.add_slide(slide_layout)# 设置标题title = slide.shapes.titletitle.text = "销售数据表格"# 定义表格位置和大小left = Inches(1.5)top = Inches(2)width = Inches(7)height = Inches(3)# 创建表格 (4行3列)rows, cols = 4, 3table = 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.CENTERparagraph.font.bold = Trueparagraph.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.LEFTelse: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 CategoryChartDatadef create_chart_slide():"""创建包含图表的幻灯片"""prs = Presentation()# 添加标题和内容布局的幻灯片slide_layout = prs.slide_layouts[5]  # 仅标题布局slide = prs.slides.add_slide(slide_layout)# 设置标题title = slide.shapes.titletitle.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 = Truechart.chart_title.text_frame.text = "季度销售数量对比"# 保存演示文稿prs.save("图表演示.pptx")print("演示文稿已保存为: 图表演示.pptx")# 创建第二张幻灯片,展示饼图slide = prs.slides.add_slide(slide_layout)title = slide.shapes.titletitle.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 = Truechart.chart_title.text_frame.text = "第四季度销售额占比"# 保存更新后的演示文稿prs.save("图表演示.pptx")# 执行函数
# create_chart_slide()

模板复用与批量生成

使用模板创建演示文稿

from pptx import Presentation
from pptx.util import Inchesdef 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.titlecontent = slide.placeholders[1]title.text = "使用模板创建的幻灯片"tf = content.text_frametf.text = "使用模板的优势:"p = tf.add_paragraph()p.text = "保持一致的品牌形象"p.level = 1p = tf.add_paragraph()p.text = "节省设计时间"p.level = 1p = 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.titlesubtitle = slide.placeholders[1]title.text = "公司季度报告模板"subtitle.text = "2023年第四季度"# 添加内容幻灯片slide_layout = prs.slide_layouts[1]slide = prs.slides.add_slide(slide_layout)# 设置标题和内容title = slide.shapes.titlecontent = slide.placeholders[1]title.text = "季度目标"tf = content.text_frametf.text = "主要业务目标:"p = tf.add_paragraph()p.text = "提高销售额 15%"p.level = 1p = tf.add_paragraph()p.text = "拓展两个新市场"p.level = 1p = 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 osdef 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.titlesubtitle = 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.titlecontent = slide.placeholders[1]title.text = "项目概述"tf = content.text_frametf.text = data['overview']# 添加内容幻灯片 - 关键数据slide_layout = prs.slide_layouts[1]slide = prs.slides.add_slide(slide_layout)title = slide.shapes.titletitle.text = "关键数据"# 创建表格left = Inches(2)top = Inches(2)width = Inches(6)height = Inches(2)# 创建表格 (4行2列)rows, cols = len(data['key_metrics']) + 1, 2table = 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 = metrictable.cell(i + 1, 1).text = str(value)# 添加内容幻灯片 - 结论slide_layout = prs.slide_layouts[1]slide = prs.slides.add_slide(slide_layout)title = slide.shapes.titlecontent = slide.placeholders[1]title.text = "结论与建议"tf = content.text_framefor i, point in enumerate(data['conclusions']):if i == 0:tf.text = pointelse: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 datetimedef 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.titlesubtitle = 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.titletitle.text = "销售总览"# 创建表格rows, cols = len(product_sales) + 1, 3left = 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 = headercell.fill.solid()cell.fill.fore_color.rgb = RGBColor(0, 112, 192)  # 蓝色背景paragraph = cell.text_frame.paragraphs[0]paragraph.alignment = PP_ALIGN.CENTERparagraph.font.bold = Trueparagraph.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.LEFTtable.cell(i + 1, 1).text_frame.paragraphs[0].alignment = PP_ALIGN.CENTERtable.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.titletitle.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 = Truechart.chart_title.text_frame.text = "周销售额趋势"# 添加产品占比幻灯片slide_layout = prs.slide_layouts[5]  # 仅标题布局slide = prs.slides.add_slide(slide_layout)title = slide.shapes.titletitle.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 = Truechart.chart_title.text_frame.text = "销售额占比"# 添加结论幻灯片slide_layout = prs.slide_layouts[1]  # 标题和内容布局slide = prs.slides.add_slide(slide_layout)title = slide.shapes.titlecontent = 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_frametf.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 = 1p = tf.add_paragraph()p.text = "针对销售较低的产品,考虑调整营销策略或价格"p.level = 1p = 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 osdef generate_training_slides(course_data):"""生成培训课程幻灯片"""# 创建演示文稿prs = Presentation()# 添加标题幻灯片slide_layout = prs.slide_layouts[0]slide = prs.slides.add_slide(slide_layout)# 设置标题和副标题title = slide.shapes.titlesubtitle = 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.titlecontent = slide.placeholders[1]title.text = "课程目标"tf = content.text_frametf.text = "完成本课程后,您将能够:"for objective in course_data['objectives']:p = tf.add_paragraph()p.text = objectivep.level = 1# 添加课程大纲幻灯片slide_layout = prs.slide_layouts[1]slide = prs.slides.add_slide(slide_layout)title = slide.shapes.titlecontent = slide.placeholders[1]title.text = "课程大纲"tf = content.text_framefor 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.titletitle.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.titlecontent = slide.placeholders[1]title.text = topic['title']tf = content.text_framefor j, point in enumerate(topic['points']):if j == 0:tf.text = pointelse:p = tf.add_paragraph()p.text = point# 添加总结幻灯片slide_layout = prs.slide_layouts[1]slide = prs.slides.add_slide(slide_layout)title = slide.shapes.titlecontent = slide.placeholders[1]title.text = "总结"tf = content.text_framefor i, point in enumerate(course_data['summary']):if i == 0:tf.text = pointelse:p = tf.add_paragraph()p.text = point# 添加问答幻灯片slide_layout = prs.slide_layouts[5]  # 仅标题布局slide = prs.slides.add_slide(slide_layout)title = slide.shapes.titletitle.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_frametf.text = "?"p = tf.paragraphs[0]p.alignment = PP_ALIGN.CENTERrun = p.runs[0]run.font.size = Pt(120)run.font.bold = Truerun.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都能帮你轻松应对。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93019.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93019.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/93019.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

18 ABP Framework 模块管理

ABP Framework 模块管理 概述 该页面详细介绍了在 ABP Framework 解决方案中使用 ABP CLI 及相关工具添加、更新和管理模块的方法。模块管理是 ABP 模块化架构的核心,支持可重用业务和基础设施功能的集成。模块通常以 NuGet 和/或 NPM 包的形式分发,有时…

外观模式C++

外观模式(Facade Pattern)是一种结构型设计模式,它为复杂系统提供一个简化的接口,隐藏系统内部的复杂性,使客户端能够更轻松地使用系统。这种模式通过创建一个外观类,封装系统内部的交互逻辑,客…

Go 微服务限流与熔断最佳实践:滑动窗口、令牌桶与自适应阈值

🌟 Hello,我是蒋星熠Jaxonic! 🌈 在浩瀚无垠的技术宇宙中,我是一名执着的星际旅人,用代码绘制探索的轨迹。 🚀 每一个算法都是我点燃的推进器,每一行代码都是我航行的星图。 &#x…

Java面试宝典:JVM性能优化

一、运行时优化 Java虚拟机(JVM)的运行时优化是提升Java应用性能的核心环节。JIT(Just-In-Time)编译器在程序运行过程中,通过分析热点代码的执行模式,动态地进行一系列高级优化。这些优化技术对开发者透明,但了解其原理能帮助我们编写出更易于优化的代码,从而显著提升…

Day55--图论--107. 寻找存在的路径(卡码网)

Day55–图论–107. 寻找存在的路径(卡码网) 今天学习并查集。先过一遍并查集理论基础。再做下面这一道模板题,就可以结束了。体量不多,但是理解并查集,并使用好,不容易。 后续再找相关的题目来做&#xff0…

C++中的链式操作原理与应用(三):专注于异步操作延的C++开源库 continuable

目录 1.简介 2.安装与集成 3.快速入门 4.完整示例 5.优势与适用场景 1.简介 continuable 是一个专注于 异步操作延续(continuation) 的现代 C 开源库,旨在简化异步编程流程,解决 “回调地狱” 问题,提供直观、灵活…

STM32--寄存器与标准库函数--通用定时器--输出比较(PWM生成)

目录 前言 通用定时器类型 向上计数、向下计数、中心对齐 输入捕获与输出比较概念 输出比较典型例子:驱动舵机旋转 通用定时器的输出比较库函数 代码 通用定时器的输出比较寄存器操作 代码 这里提供数据手册的寄存器 后言 前言 使用平台:STM32F407ZET6 使…

91、23种设计模式

设计模式是软件设计中反复出现的解决方案的模板,用于解决特定问题并提高代码的可维护性、可扩展性和可复用性。23种经典设计模式可分为创建型、结构型和行为型三大类,以下是具体分类及模式概述: 一、创建型模式(5种) 关…

力扣(串联所有单词的子串)

串联所有单词的子串问题:多滑动窗口与哈希表的实战应用。 一、题目分析(一)问题定义 给定字符串 s 和字符串数组 words(words 中所有单词长度相同 ),找出 s 中所有“串联子串”的起始索引。串联子串指包含 …

RH134 管理基本存储知识点

1. 对 Linux 磁盘进行分区时有哪两种方案?分别加以详细说明。答:MBR分区:主引导记录(MBR)分区方案是运行BIOS固件的系统上的标准方案。此方案支持最 多四个主分区。在Linux系统上,您可以使用扩展分区和逻辑分区来创建最多…

【JS 异步】告别回调地狱:Async/Await 和 Promise 的优雅实践与错误处理

【JS 异步】告别回调地狱:Async/Await 和 Promise 的优雅实践与错误处理 所属专栏: 《前端小技巧集合:让你的代码更优雅高效 上一篇: 【JS 数组】数组操作的“瑞士军刀”:精通 Array.reduce() 的骚操作 作者&#xff…

23.Linux : ftp服务及配置详解

Linux : ftp服务及配置详解 FTP 基本概念 定义:文件传输协议(File Transfer Protocol),采用 C/S 模式工作。端口: 控制端口:21数据端口:20FTP 工作原理模式工作流程连接发起方主动模…

悲观锁乐观锁与事务注解在项目实战中的应用场景及详细解析

在今天做的项目练习部分中真的学到了很多东西,也补充了许多之前遗漏或是忘记的知识点,但时间精力有限,我就先记录一下今天用到的一个新东西,悲观锁和乐观锁。首先给出实际应用背景:在加入锁和事务注解之前,…

Java构造器与工厂模式(静态工程方法)详解

1. 构造器1.1 构造器的核心意义1.1.1 对象初始化构造器在创建对象 (new) 时自动调用, 用于初始化对象的状态 (如设置字段初始值, 分配资源等)无构造器时: 字段为默认值(0/null/false)有构造器:确保对象创建后即处于有效状态1.1.2 强制初始化…

解决jdk初始化运行,防火墙通信选错专业网络问题

问题描述新项目添加不同版本的jdk,运行时提示防火墙通信策略,选成专用网络。其他人访问后端接口时,提示连接失败。 解决方案:1、在搜索栏中输入 防火墙关键字,选择到防火墙和网络保护2、选择允许应用通过防火墙3、先点…

【Linux】常用命令(三)

【Linux】常用命令(三)1. export1.1 原理1.2 常用语法1.3 示例1.4 书中对命令的解释1.5 生效范围2. 测试服务地址与其端口能否访问2.1 nc(Netcat)命令2.2 telnet2.3 nmap2.4 curl命令 (适用于HTTP/HTTPS 服务)1. export export 是 Linux Shell&#xff…

Pytest项目_day15(yaml)

YAMLYAML是一个对所有编程语言都很友好的数据序列化标准,它是一种直观的能够被电脑识别的数据序列化格式,是一种可读性高且容易被人类阅读的脚本语言YAML语言的本质是一种通用的数据串行化格式适用场景 可以直接序列化为数组、字典解析成本低专门写配置文…

审批流程系统设计与实现:状态驱动、灵活扩展的企业级解决方案

审批流程系统设计与实现:状态驱动、灵活扩展的企业级解决方案 本文基于实际企业级审批系统源码,深入解析如何设计高扩展性、强一致性的审批流程引擎,涵盖状态机设计、多租户隔离、文件服务集成等核心实现。 1. 系统设计概览 审批系统的核心架…

汽车免拆诊断案例 | 2010款奥迪A4L车行驶中发动机偶尔自动熄火

故障现象 一辆2010款奥迪A4L车,搭载CDZ发动机 ,累计行驶里程约为18.2万km。该车行驶中发动机偶尔自动熄火,有时熄火后能够立即重新起动着机,有时需要等待一会儿才能重新起动着机,故障频率较低。因该故障在其他维修厂陆…

Liam ERD:自动生成美观的交互式实体关系图

Liam ERD 是一个可以快速生成美观且具有交互性的数据库实体关系图(ERD)的工具,可以帮助用户实现复杂数据库结构的可视化。 Liam ERD 是一个免费开源的项目,代码托管在 GitHub: https://github.com/liam-hq/liam 功能…