市场部小李手动调整200页PPT到凌晨3点,销售总监小王用30行Python代码20分钟自动生成动态汇报——这不仅是效率差距,更是职业发展的分水岭。
01 准备工作:3分钟配置环境
第一步:安装python-pptx库
# 在终端或命令提示符中执行pip install python-pptx pandas matplotlib第二步:验证安装
创建 test_pptx.py:
from pptx import Presentationprint("python-pptx安装成功!可以开始使用了。")02 模板一:快速生成公司月报PPT(最常用)
适用场景:月度汇报、项目总结、数据报告
"""公司月度报告自动生成器文件名:monthly_report.py使用方法:修改data字典中的数据,直接运行"""from pptx import Presentationfrom pptx.util import Inches, Ptfrom pptx.dml.color import RGBColorfrom pptx.enum.text import PP_ALIGNfrom pptx.chart.data import CategoryChartDatafrom pptx.enum.chart import XL_CHART_TYPEfrom datetime import datetimeimport osdef create_monthly_report(): """创建月度报告PPT""" # 1. 创建演示文稿 prs = Presentation() # ========== 第1页:封面 ========== slide_layout = prs.slide_layouts[0] # 标题幻灯片版式 slide = prs.slides.add_slide(slide_layout) # 设置标题 title = slide.shapes.title title.text = "2024年销售月度报告" # 设置副标题 subtitle = slide.placeholders[1] subtitle.text = f"报告日期:{datetime.now().strftime('%Y年%m月%d日')}\n数据来源:销售管理系统" # ========== 第2页:本月概览 ========== slide_layout = prs.slide_layouts[1] # 标题和内容版式 slide = prs.slides.add_slide(slide_layout) title = slide.shapes.title title.text = "本月核心指标概览" # 添加内容 content = slide.placeholders[1] text_frame = content.text_frame text_frame.clear() # 清空默认文本 # 添加项目符号列表 p = text_frame.paragraphs[0] p.text = "✓ 总销售额:¥ 1,250,000" p.level = 0 p = text_frame.add_paragraph() p.text = "✓ 同比增长:18.5%" p.level = 0 p = text_frame.add_paragraph() p.text = "✓ 新客户数量:42家" p.level = 0 p = text_frame.add_paragraph() p.text = "✓ 重点产品A销售额:¥ 680,000" p.level = 0 # ========== 第3页:销售趋势图 ========== slide_layout = prs.slide_layouts[5] # 仅标题版式 slide = prs.slides.add_slide(slide_layout) title = slide.shapes.title title.text = "近6个月销售趋势" # 定义图表数据 chart_data = CategoryChartData() chart_data.categories = ['1月', '2月', '3月', '4月', '5月', '6月'] chart_data.add_series('销售额(万元)', (85, 92, 105, 118, 125, 135)) # 添加图表 x, y, cx, cy = Inches(1), Inches(1.5), Inches(8), Inches(5) chart = slide.shapes.add_chart( XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data ).chart chart.has_legend = True chart.legend.position = 'b' # 底部 # ========== 第4页:产品分布 ========== slide = prs.slides.add_slide(prs.slide_layouts[5]) title = slide.shapes.title title.text = "产品销售额分布" # 饼图数据 chart_data = CategoryChartData() chart_data.categories = ['产品A', '产品B', '产品C', '产品D', '其他'] chart_data.add_series('销售额', (68, 32, 15, 8, 7)) # 添加饼图 chart = slide.shapes.add_chart( XL_CHART_TYPE.PIE, x, y, cx, cy, chart_data ).chart chart.has_legend = True chart.legend.position = 'r' # 右侧 # ========== 第5页:区域销售排名 ========== slide = prs.slides.add_slide(prs.slide_layouts[1]) title = slide.shapes.title title.text = "区域销售排名" content = slide.placeholders[1] tf = content.text_frame tf.clear() # 表格数据 regions = [ ("华东区", "¥ 450,000", "36%"), ("华北区", "¥ 380,000", "30%"), ("华南区", "¥ 280,000", "22%"), ("西部区", "¥ 140,000", "12%") ] # 使用更简单的文本表格(python-pptx表格操作较复杂) p = tf.paragraphs[0] p.text = "1. 华东区:¥ 450,000 (36%)" p.font.size = Pt(18) for region, sales, percentage in regions[1:]: p = tf.add_paragraph() p.text = f"{regions.index((region, sales, percentage)) + 1}. {region}:{sales} ({percentage})" p.font.size = Pt(18) p.level = 0 # ========== 第6页:下月计划 ========== slide = prs.slides.add_slide(prs.slide_layouts[1]) title = slide.shapes.title title.text = "下月重点工作计划" content = slide.placeholders[1] tf = content.text_frame tf.clear() plans = [ "重点推进产品A在华东区的市场覆盖", "完成3家新渠道商的签约工作", "组织2场线上产品推介会", "优化客户服务流程,提升满意度", "启动销售团队季度培训计划" ] for i, plan in enumerate(plans): p = tf.add_paragraph() p.text = f"{i+1}. {plan}" p.font.size = Pt(18) p.level = 0 # ========== 第7页:结束页 ========== slide = prs.slides.add_slide(prs.slide_layouts[0]) title = slide.shapes.title title.text = "感谢聆听" subtitle = slide.placeholders[1] subtitle.text = "Q&A" # ========== 保存文件 ========== # 生成文件名(包含时间戳避免覆盖) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"销售月报_{timestamp}.pptx" prs.save(filename) print(f"✅ PPT生成成功:{filename}") print(f" 文件保存位置:{os.path.abspath(filename)}") return filenameif __name__ == "__main__": # 直接运行即可生成PPT create_monthly_report()使用说明:
- 将上面的代码保存为 monthly_report.py
- 打开终端,进入文件所在目录
- 运行:python monthly_report.py
- 查看生成的PPT文件
修改数据:
- 修改第3页图表数据:找到 (85, 92, 105, 118, 125, 135) 修改为你的数据
- 修改第4页产品分布:找到 (68, 32, 15, 8, 7) 修改为你的数据
- 修改区域销售数据:修改 regions 列表中的数据
03 模板二:批量生成员工绩效报告(一键生成多份)
适用场景:员工绩效报告、学生成绩单、客户报告等需要批量生成的场景
"""批量生成员工绩效报告文件名:batch_employee_reports.py使用方法:修改employees列表中的数据,运行即可生成多个PPT"""from pptx import Presentationfrom pptx.util import Inches, Ptfrom pptx.dml.color import RGBColorfrom datetime import datetimeimport osdef create_employee_performance_report(employee_data): """为单个员工创建绩效报告""" prs = Presentation() # ===== 第1页:封面 ===== slide = prs.slides.add_slide(prs.slide_layouts[0]) title = slide.shapes.title title.text = f"{employee_data['name']} - 季度绩效报告" subtitle = slide.placeholders[1] subtitle.text = f"部门:{employee_data['department']}\n期间:{employee_data['period']}" # ===== 第2页:基本信息 ===== slide = prs.slides.add_slide(prs.slide_layouts[1]) title = slide.shapes.title title.text = "基本信息" content = slide.placeholders[1] tf = content.text_frame tf.clear() info_items = [ f"员工姓名:{employee_data['name']}", f"员工工号:{employee_data['id']}", f"所在部门:{employee_data['department']}", f"职位:{employee_data['position']}", f"入职时间:{employee_data['hire_date']}", f"考核期间:{employee_data['period']}" ] for item in info_items: p = tf.add_paragraph() p.text = item p.font.size = Pt(18) # ===== 第3页:绩效评分 ===== slide = prs.slides.add_slide(prs.slide_layouts[1]) title = slide.shapes.title title.text = "绩效评分详情" content = slide.placeholders[1] tf = content.text_frame tf.clear() # 添加评分项目 for item, score in employee_data['scores'].items(): p = tf.add_paragraph() # 根据分数设置颜色 if score >= 90: color = "" # 绿色 elif score >= 80: color = "" # 黄色 else: color = "" # 红色 p.text = f"{color} {item}:{score}分" p.font.size = Pt(20) # 添加进度条效果(文本模拟) bar = "█" * (score // 5) + "░" * (20 - score // 5) p = tf.add_paragraph() p.text = f" {bar}" p.font.size = Pt(14) p.font.color.rgb = RGBColor(100, 100, 100) # ===== 第4页:关键成果 ===== slide = prs.slides.add_slide(prs.slide_layouts[1]) title = slide.shapes.title title.text = "本季度关键成果" content = slide.placeholders[1] tf = content.text_frame tf.clear() for achievement in employee_data['achievements']: p = tf.add_paragraph() p.text = f"✓ {achievement}" p.font.size = Pt(18) p.level = 0 # ===== 第5页:改进建议 ===== slide = prs.slides.add_slide(prs.slide_layouts[1]) title = slide.shapes.title title.text = "改进建议与下季度目标" content = slide.placeholders[1] tf = content.text_frame tf.clear() for suggestion in employee_data['suggestions']: p = tf.add_paragraph() p.text = f"• {suggestion}" p.font.size = Pt(18) p.level = 0 # ===== 第6页:总结 ===== slide = prs.slides.add_slide(prs.slide_layouts[0]) title = slide.shapes.title title.text = "综合评价" # 计算平均分 avg_score = sum(employee_data['scores'].values()) / len(employee_data['scores']) subtitle = slide.placeholders[1] subtitle.text = f"平均得分:{avg_score:.1f}分\n\n{'优秀' if avg_score >= 90 else '良好' if avg_score >= 80 else '需改进'}" # ===== 保存文件 ===== # 使用员工姓名作为文件名 safe_name = employee_data['name'].replace(" ", "_") filename = f"员工绩效报告_{safe_name}.pptx" prs.save(filename) return filename, avg_scoredef batch_create_reports(): """批量创建员工绩效报告""" # ===== 员工数据(这里可以替换为从Excel读取)===== employees = [ { 'name': '张三', 'id': 'EMP001', 'department': '销售部', 'position': '高级销售经理', 'hire_date': '2020-03-15', 'period': '2024年第一季度', 'scores': { '工作业绩': 92, '团队合作': 88, '创新能力': 85, '客户满意度': 95, '目标完成率': 96 }, 'achievements': [ '完成季度销售额150万元,超额完成20%', '成功签约3家新客户', '协助团队新人快速融入', '提出2条流程优化建议并被采纳' ], 'suggestions': [ '加强跨部门沟通协作', '提升数据分析能力', '制定详细的客户维护计划' ] }, { 'name': '李四', 'id': 'EMP002', 'department': '技术部', 'position': '后端开发工程师', 'hire_date': '2021-06-10', 'period': '2024年第一季度', 'scores': { '工作业绩': 85, '团队合作': 90, '创新能力': 88, '代码质量': 92, '任务完成率': 87 }, 'achievements': [ '独立完成订单模块开发', '优化系统性能,响应时间减少30%', '解决5个历史遗留bug', '编写详细的技术文档' ], 'suggestions': [ '学习新技术栈,如Go语言', '提高项目时间预估准确性', '参与技术分享活动' ] }, # 可以继续添加更多员工... ] print("开始批量生成员工绩效报告...") print("=" * 50) results = [] for emp in employees: print(f"正在生成 {emp['name']} 的报告...") filename, avg_score = create_employee_performance_report(emp) results.append({ 'name': emp['name'], 'filename': filename, 'avg_score': avg_score }) print(f" ✅ 已生成:{filename}") print(f" 平均分:{avg_score:.1f}") # ===== 生成汇总报告 ===== print("\n" + "=" * 50) print("报告生成完成!") print("\n生成文件列表:") for res in results: print(f" • {res['name']}: {res['filename']} (平均分:{res['avg_score']:.1f})") # 保存生成记录 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") log_file = f"报告生成记录_{timestamp}.txt" with open(log_file, 'w', encoding='utf-8') as f: f.write(f"员工绩效报告生成记录\n") f.write(f"生成时间:{datetime.now().strftime('%Y年%m月%d日 %H:%M:%S')}\n") f.write(f"生成数量:{len(results)}份\n\n") for res in results: f.write(f"员工:{res['name']}\n") f.write(f"文件:{res['filename']}\n") f.write(f"平均分:{res['avg_score']:.1f}\n") f.write("-" * 40 + "\n") print(f"\n 生成记录已保存:{log_file}") return resultsif __name__ == "__main__": # 直接运行即可批量生成所有员工报告 batch_create_reports()使用说明:
- 将代码保存为 batch_employee_reports.py
- 修改 employees 列表中的数据(可以添加更多员工)
- 运行:python batch_employee_reports.py
- 查看生成的多个PPT文件
从Excel读取数据: 如果需要从Excel读取数据,添加以下代码:
import pandas as pddef read_employees_from_excel(filepath): """从Excel文件读取员工数据""" df = pd.read_excel(filepath) employees = [] for _, row in df.iterrows(): employee = { 'name': row['姓名'], 'id': row['工号'], 'department': row['部门'], 'position': row['职位'], # ... 其他字段 } employees.append(employee) return employees04 模板三:数据可视化PPT(图表自动更新)
适用场景:数据分析报告、市场调研报告、项目进度汇报
"""数据可视化PPT生成器文件名:data_visualization_ppt.py使用方法:准备好data.csv数据文件,运行脚本"""from pptx import Presentationfrom pptx.util import Inches, Ptfrom pptx.dml.color import RGBColorfrom pptx.chart.data import CategoryChartDatafrom pptx.enum.chart import XL_CHART_TYPEimport pandas as pdimport matplotlib.pyplot as pltfrom datetime import datetimeimport osdef create_visualization_ppt(data_file="data.csv"): """创建数据可视化PPT""" # 读取数据(如果没有数据文件,使用示例数据) if os.path.exists(data_file): df = pd.read_csv(data_file) else: # 创建示例数据 print("⚠️ 未找到数据文件,使用示例数据...") df = pd.Dataframe({ '月份': ['1月', '2月', '3月', '4月', '5月', '6月'], '销售额': [85, 92, 105, 118, 125, 135], '利润': [25, 28, 32, 38, 42, 48], '客户数': [120, 135, 148, 162, 175, 190] }) prs = Presentation() # ===== 第1页:封面 ===== slide = prs.slides.add_slide(prs.slide_layouts[0]) title = slide.shapes.title title.text = "数据分析报告" subtitle = slide.placeholders[1] subtitle.text = f"数据截止:{datetime.now().strftime('%Y年%m月')}\n自动生成报告" # ===== 第2页:数据摘要 ===== slide = prs.slides.add_slide(prs.slide_layouts[1]) title = slide.shapes.title title.text = "核心数据摘要" content = slide.placeholders[1] tf = content.text_frame tf.clear() # 计算关键指标 total_sales = df['销售额'].sum() if '销售额' in df.columns else 0 avg_sales = df['销售额'].mean() if '销售额' in df.columns else 0 growth_rate = ((df['销售额'].iloc[-1] - df['销售额'].iloc[0]) / df['销售额'].iloc[0] * 100) if len(df) > 1 and '销售额' in df.columns else 0 summary_items = [ f" 总销售额:¥ {total_sales:,.0f}", f" 平均月销售额:¥ {avg_sales:,.0f}", f" 增长率:{growth_rate:.1f}%", f" 总客户数:{df['客户数'].sum() if '客户数' in df.columns else 'N/A'}", f" 平均利润率:{df['利润'].mean()/df['销售额'].mean()*100:.1f}%" if '利润' in df.columns and '销售额' in df.columns else "" ] for item in summary_items: if item: # 跳过空项 p = tf.add_paragraph() p.text = item p.font.size = Pt(20) # ===== 第3页:销售额趋势图 ===== if '月份' in df.columns and '销售额' in df.columns: slide = prs.slides.add_slide(prs.slide_layouts[5]) title = slide.shapes.title title.text = "销售额趋势" # 创建组合图表(柱状图+折线图) chart_data = CategoryChartData() chart_data.categories = df['月份'].tolist() chart_data.add_series('销售额', df['销售额'].tolist()) if '利润' in df.columns: chart_data.add_series('利润', df['利润'].tolist()) x, y, cx, cy = Inches(0.5), Inches(1.5), Inches(9), Inches(5) chart = slide.shapes.add_chart( XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data ).chart chart.has_legend = True chart.legend.position = 'b' # ===== 第4页:利润分析 ===== if '利润' in df.columns: slide = prs.slides.add_slide(prs.slide_layouts[5]) title = slide.shapes.title title.text = "利润分析" # 创建折线图 chart_data = CategoryChartData() chart_data.categories = df['月份'].tolist() if '月份' in df.columns else [f"周期{i+1}" for i in range(len(df))] chart_data.add_series('利润', df['利润'].tolist()) chart = slide.shapes.add_slide.chart( XL_CHART_TYPE.LINE, x, y, cx, cy, chart_data ).chart chart.has_legend = True # ===== 第5页:客户增长 ===== if '客户数' in df.columns: slide = prs.slides.add_slide(prs.slide_layouts[5]) title = slide.shapes.title title.text = "客户数量增长" # 创建面积图 chart_data = CategoryChartData() chart_data.categories = df['月份'].tolist() if '月份' in df.columns else [f"周期{i+1}" for i in range(len(df))] chart_data.add_series('客户数', df['客户数'].tolist()) chart = slide.shapes.add_chart( XL_CHART_TYPE.AREA, x, y, cx, cy, chart_data ).chart chart.has_legend = True # ===== 第6页:数据表格 ===== slide = prs.slides.add_slide(prs.slide_layouts[5]) title = slide.shapes.title title.text = "详细数据表" # 添加表格 rows = min(len(df) + 1, 10) # 最多显示10行数据 cols = min(len(df.columns), 6) # 最多显示6列 table = slide.shapes.add_table( rows, cols, Inches(0.5), Inches(1.5), Inches(9), Inches(0.5 * rows) ).table # 设置表头 for col_idx, col_name in enumerate(df.columns[:cols]): cell = table.cell(0, col_idx) cell.text = str(col_name) cell.fill.solid() cell.fill.fore_color.rgb = RGBColor(59, 89, 152) # 蓝色 cell.text_frame.paragraphs[0].font.color.rgb = RGBColor(255, 255, 255) cell.text_frame.paragraphs[0].font.bold = True # 填充数据 for row_idx in range(1, rows): for col_idx, col_name in enumerate(df.columns[:cols]): cell = table.cell(row_idx, col_idx) value = df.iloc[row_idx-1, col_idx] cell.text = str(value) # 交替行颜色 if row_idx % 2 == 0: cell.fill.solid() cell.fill.fore_color.rgb = RGBColor(240, 240, 240) # ===== 第7页:建议与行动计划 ===== slide = prs.slides.add_slide(prs.slide_layouts[1]) title = slide.shapes.title title.text = "数据洞察与建议" content = slide.placeholders[1] tf = content.text_frame tf.clear() insights = [ f" 销售表现:{df['销售额'].iloc[-1] if '销售额' in df.columns else 'N/A'},建议继续保持增长势头", f" 最佳月份:{df.loc[df['销售额'].idxmax(), '月份'] if '月份' in df.columns and '销售额' in df.columns else 'N/A'} 销售额最高", f" 关注点:{'利润率有提升空间' if '利润' in df.columns and df['利润'].mean()/df['销售额'].mean() < 0.3 else '利润表现良好'}", f" 客户增长:客户数增长{((df['客户数'].iloc[-1]/df['客户数'].iloc[0]-1)*100 if '客户数' in df.columns and len(df)>1 else 0):.1f}%,客户基础持续扩大" ] for insight in insights: p = tf.add_paragraph() p.text = insight p.font.size = Pt(18) # ===== 保存文件 ===== timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"数据分析报告_{timestamp}.pptx" prs.save(filename) print(f"✅ PPT生成成功:{filename}") print(f" 处理数据:{len(df)}行 × {len(df.columns)}列") return filenamedef generate_sample_data(): """生成示例数据文件""" data = { '月份': ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], '销售额': [85, 92, 105, 118, 125, 135, 142, 155, 168, 175, 182, 195], '利润': [25, 28, 32, 38, 42, 48, 52, 58, 63, 68, 72, 78], '客户数': [120, 135, 148, 162, 175, 190, 205, 218, 230, 245, 260, 280], '营销费用': [15, 18, 20, 22, 25, 28, 30, 32, 35, 38, 40, 42] } df = pd.Dataframe(data) df.to_csv("sample_data.csv", index=False, encoding='utf-8-sig') print(" 示例数据文件已生成:sample_data.csv") return dfif __name__ == "__main__": # 检查是否有数据文件 if not os.path.exists("data.csv"): print("提示:创建示例数据文件...") generate_sample_data() print("提示:将使用示例数据生成PPT") print("提示:如需使用自己的数据,请创建data.csv文件") # 生成PPT create_visualization_ppt()使用说明:
- 将代码保存为 data_visualization_ppt.py
- 准备数据文件 data.csv(或使用自动生成的示例数据)
- 运行:python data_visualization_ppt.py
- 查看生成的包含图表的PPT
数据文件格式: 创建 data.csv 文件,内容示例:
月份,销售额,利润,客户数1月,850000,250000,1202月,920000,280000,1353月,1050000,320000,14805 常见问题与解决方案
问题1:安装失败
# 如果pip安装失败,尝试:python -m pip install --upgrade pippip install python-pptx --user问题2:中文显示问题
在代码开头添加:
# 设置中文字体from pptx.util import Ptfrom pptx.dml.color import RGBColor# 使用系统自带的中文字体def set_chinese_font(shape, font_name="Microsoft YaHei"): """设置中文字体""" for paragraph in shape.text_frame.paragraphs: for run in paragraph.runs: run.font.name = font_name问题3:图表数据更新
# 动态更新图表数据def update_chart_data(chart, new_data): """更新图表数据""" plot = chart.plots[0] plot.data = new_data # new_data是CategoryChartData对象06 进阶技巧:使用模板文件
创建 template_based.py:
"""基于模板的PPT生成使用方法:先创建一个漂亮的PPT模板,然后用代码填充内容"""from pptx import Presentationdef create_from_template(template_path, output_path, data): """基于模板创建PPT""" # 打开模板 prs = Presentation(template_path) # 第一页:替换标题 slide = prs.slides[0] title = slide.shapes.title title.text = data['title'] # 第二页:替换内容 if len(prs.slides) > 1: slide = prs.slides[1] content = slide.shapes[1] # 假设第二个形状是内容框 content.text = data['content'] # 保存 prs.save(output_path) print(f"基于模板生成完成:{output_path}")# 使用示例data = { 'title': '我的项目汇报', 'content': '这是自动生成的内容...'}create_from_template('template.pptx', 'output.pptx', data)07 一键运行所有模板
创建 run_all.py:
"""一键运行所有PPT生成模板"""import subprocessimport osprint(" 开始运行所有PPT生成模板")print("=" * 50)# 运行模板一:月报生成print("\n1. 生成公司月报PPT...")os.system("python monthly_report.py")# 运行模板二:批量员工报告print("\n2. 生成员工绩效报告...")os.system("python batch_employee_reports.py")# 运行模板三:数据可视化报告print("\n3. 生成数据可视化PPT...")os.system("python data_visualization_ppt.py")print("\n" + "=" * 50)print("✅ 所有PPT生成完成!")print(" 请在当前文件夹查看生成的PPT文件")某互联网公司市场部使用这些脚本后,季度汇报PPT制作时间从 3天缩短到30分钟,团队每月节省超过 200个工时。更重要的是,数据分析师可以实时生成数据驱动的报告,决策速度提升了5倍。
技术不是炫技,而是解放生产力。 当你掌握了自动化工具,你就不再是重复劳动的"PPT工人",而是创造价值的"解决方案设计师"。
觉得这些模板实用吗?请点个赞支持一下!
你平时制作PPT最大的痛点是什么?
- 数据更新太麻烦
- 格式调整耗时
- 图表制作复杂
- 批量生成困难
在评论区留言数字,我会针对最多的问题出详细教程!
转发分享给需要做PPT的同事朋友,让大家一起告别加班!

