文章目录
- pip install python-pptx
- 在Python中,可以使用python-pptx库实现PPT文件的自动化操作。需要注意的是,python-pptx只支持*.pptx文件格式的PPT文件(Office 2007及以上版本)。 一个PPT文件通常由多个幻灯片组成,每个幻灯片都有相应的布局。通过python-pptx库创建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}nn请确保图片文件存在,或替换为实际的图片路径。” # 保存演示文稿 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的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: 使用Python自动化生成PPT并结合LLM生成内容的代码解析 利用Python自动化处理PPT样式与结构的解决方案 python自动化生成ppt的实现代码 Python自动化办公之PPT段落的使用 Python自动化办公之创建PPT文件 Python办公自动化PPT批量转换操作 python自动化办公操作PPT的实现
目录
- 使用python-pptx操作PPT文档
- 安装python-pptx
- 基础概念
- 创建新的PPT文档
- 查看可用的幻灯片布局
- 添加文本框和格式化文本
- 插入图片
- 添加形状
- 创建表格
- 插入图表
- 模板复用与批量生成
- 使用模板创建演示文稿
- 批量生成演示文稿
- 实际应用场景
- 场景一:自动生成销售报告
- 场景二:培训课程幻灯片生成器
在现代商业和教育环境中,PowerPoint演示文稿是信息传递的重要工具。通过Python自动化PPT创建和编辑过程,可以大幅提高工作效率,特别是在需要批量生成或更新演示文稿的场景下。本文将介绍如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景。
pip install python-pptx
在Python中,可以使用python-pptx库实现PPT文件的自动化操作。需要注意的是,python-pptx只支持*.pptx文件格式的PPT文件(Office 2007及以上版本)。
一个PPT文件通常由多个幻灯片组成,每个幻灯片都有相应的布局。通过python-pptx库创建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}nn请确保图片文件存在,或替换为实际的图片路径。"
# 保存演示文稿
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的资料请关注风君子博客其它相关文章!
您可能感兴趣的文章:
- 使用Python自动化生成PPT并结合LLM生成内容的代码解析
- 利用Python自动化处理PPT样式与结构的解决方案
- python自动化生成ppt的实现代码
- Python自动化办公之PPT段落的使用
- Python自动化办公之创建PPT文件
- Python办公自动化PPT批量转换操作
- python自动化办公操作PPT的实现