影刀RPA PPT自动生成:批量制作演示文稿完全指南

影刀RPA PPT自动生成:批量制作演示文稿完全指南
影刀RPA PPT自动生成批量制作演示文稿完全指南作者林焱为什么要自动生成 PPT运营工作里有些 PPT 是模板化的每周的数据周报结构固定只换数据客户汇报每个客户的模板相同数据不同活动总结固定章节填充内容手工改100份 PPT 是真实存在的需求。影刀 Python 的python-pptx库可以把这个过程全自动化。环境准备安装 python-pptxpipinstallpython-pptx核心思路模板 数据填充最实用的 PPT 自动化方式不是从零生成而是拼多多店群自动化报活动上架人工做好一个 PPT 模板格式、颜色、占位符都设计好用代码把变量占位符如{{客户名称}}替换成真实数据实战1批量替换模板中的文字PPT 模板里的占位符在 PowerPoint 里做模板时把变量部分写成{{变量名}}格式{{客户名称}}→ 实际客户名{{月份}}→ 当前月份{{总销售额}}→ 实际数据Python 替换脚本frompptximportPresentationimportcopy template_path{template_path}output_path{output_path}# 替换数据从影刀传入JSON格式importjson replacementsjson.loads({replacements})# 示例{客户名称: 腾讯, 月份: 2024年6月, 总销售额: 128,000}prsPresentation(template_path)defreplace_text_in_shape(shape,replacements):递归替换 shape 中的文字ifshape.has_text_frame:forparainshape.text_frame.paragraphs:forruninpara.runs:forkey,valueinreplacements.items():iff{{{{{key}}}}}inrun.text:run.textrun.text.replace(f{{{{{key}}}}},str(value))# 处理表格ifshape.has_table:forrowinshape.table.rows:forcellinrow.cells:forparaincell.text_frame.paragraphs:forruninpara.runs:forkey,valueinreplacements.items():iff{{{{{key}}}}}inrun.text:run.textrun.text.replace(f{{{{{key}}}}},str(value))# 遍历所有幻灯片和形状forslideinprs.slides:forshapeinslide.shapes:replace_text_in_shape(shape,replacements)prs.save(output_path)print(PPT生成成功)影刀调用方式// 从 Excel 读取客户数据 客户数据列表 读取Excel(客户数据文件) For 客户 in 客户数据列表: 替换数据 JSON格式化({ 客户名称: 客户.名称, 月份: 当前月份, 总销售额: 客户.销售额 }) 输出文件名 客户.名称 _月报.pptx 输出路径 C:/reports/ 输出文件名 执行Python脚本( 脚本: 替换脚本, 参数: { template_path: C:/templates/月报模板.pptx, output_path: 输出路径, replacements: 替换数据 } ) 打印日志(已生成 输出文件名)实战2把数据图表自动插入 PPT先用 Python 生成图表图片再插入 PPTfrompptximportPresentationfrompptx.utilimportInches,Ptfrompptx.enum.textimportPP_ALIGNimportmatplotlib.pyplotaspltimportioimportjson# 参数slide_indexint({slide_index})# 插入第几页从0开始chart_data_str{chart_data}output_path{output_path}pptx_path{pptx_path}# 生成图表chart_datajson.loads(chart_data_str)labelschart_data[labels]valueschart_data[values]fig,axplt.subplots(figsize(10,6))ax.bar(labels,values,color#2196F3)ax.set_title(chart_data.get(title,数据统计))ax.set_ylabel(数量)# 保存图表到内存chart_bufferio.BytesIO()plt.savefig(chart_buffer,formatpng,dpi150,bbox_inchestight)chart_buffer.seek(0)plt.close()# 插入 PPTprsPresentation(pptx_path)slideprs.slides[slide_index]# 插入图片左上角位置1英寸处宽8英寸高5英寸leftInches(1)topInches(1.5)widthInches(8)heightInches(5)slide.shapes.add_picture(chart_buffer,left,top,width,height)prs.save(output_path)print(图表插入成功)实战3在 PPT 里批量修改表格数据frompptximportPresentationimportjson pptx_path{pptx_path}output_path{output_path}table_data_str{table_data}# JSON格式的二维数组table_datajson.loads(table_data_str)# 示例[[日期, 销售额, 环比], [6月1日, 12000, 5%], ...]prsPresentation(pptx_path)# 找到第一个包含表格的形状实际使用时可以用名称定位forslideinprs.slides:forshapeinslide.shapes:ifshape.has_table:tableshape.tableforrow_idx,row_datainenumerate(table_data):ifrow_idxlen(table.rows):breakforcol_idx,cell_valueinenumerate(row_data):ifcol_idxlen(table.columns):break# 找到对应单元格修改文字celltable.cell(row_idx,col_idx)ifcell.text_frame.paragraphs:forrunincell.text_frame.paragraphs[0].runs:run.textstr(cell_value)# 如果没有 run直接设置文本ifnotcell.text_frame.paragraphs[0].runs:cell.text_frame.paragraphs[0].add_run().textstr(cell_value)prs.save(output_path)print(表格更新成功)实战4把多个 PPT 合并成一个frompptximportPresentationfrompptx.utilimportInchesimportcopy pptx_paths_str{pptx_paths}# | 分隔的多个路径output_path{output_path}pptx_pathspptx_paths_str.split(|)# 以第一个文件为基础mergedPresentation(pptx_paths[0])# 追加后续文件的幻灯片forpathinpptx_paths[1:]:prsPresentation(path)forslideinprs.slides:# 复制幻灯片布局layoutmerged.slide_layouts[0]new_slidemerged.slides.add_slide(layout)# 复制所有形状forshapeinslide.shapes:elshape.element new_slide.shapes._spTree.insert(2,copy.deepcopy(el))merged.save(output_path)print(f合并完成共{len(merged.slides)}页)踩坑记录坑1替换文字后格式丢失加粗/颜色消失pptx库在操作run.text时会保留格式但如果文字横跨多个 run只替换第一个 run 后其余 run 还有原来的文字碎片。解决方法替换前先把 paragraph 里所有 run 的文字合并检查再分 run 替换# 检查整段文字是否包含占位符full_text.join(run.textforruninpara.runs)if{{客户名称}}infull_text:# 在第一个run里设置替换后的完整文字清空其他runpara.runs[0].textfull_text.replace({{客户名称}},value)forruninpara.runs[1:]:run.text坑2中文字体显示乱码TEMU店群矩阵自动化运营核价报活动python-pptx生成的 PPT 在某些机器上中文显示方框。原因是字体设置问题。解决方法frompptx.utilimportPtfrompptx.dml.colorimportRGBColor run.font.name微软雅黑坑3合并 PPT 后图片丢失用copy.deepcopy复制形状时图片的二进制数据没有正确复制到新文件导致图片丢失。正确做法合并时用python-pptx-merge这个专门处理合并的包或者手工复制图片关系pipinstallpython-pptx-merge坑4模板文件被占用影刀流程里打开了 PPT 文件预览导致 Python 脚本保存时提示文件被占用。解决方法操作 PPT 文件时先检查文件是否被占用或者操作的是副本操作完再重命名。小结PPT 自动化的实用场景批量生成同一模板不同数据用占位符替换动态插入图表先生成图表图片再插入 PPT更新表格数据直接操作表格单元格合并多个 PPT合并周报到月报核心工具影刀做数据准备和流程调度Python 的python-pptx做实际的 PPT 操作。作者林焱飞行社 RPA 实践记录