影刀RPA新手教程PPT自动生成完全指南——数据驱动PPT批量修改与模板套用作者林焱我第一次用影刀RPA做PPT自动生成是要给100个销售员每人生成一份业绩汇报PPT。手动做要花一个星期用影刀RPA半天就搞定了。这篇文章把我做PPT自动化踩过的坑全部告诉你让你也能快速上手。一、认识影刀与安装配置去影刀RPA官网下载安装包安装时勾选所有插件。安装完成后打开软件界面分为三块左边是指令面板中间是流程编辑画布右边是属性配置面板。做PPT自动化要用到启动PPT指令这个指令在社区版里就有不需要升级到付费版。但如果你的流程指令数会超过100条建议直接用创业版不然写到一半发现指令数不够用就很尴尬。新建应用时选择Windows应用因为我们要操作本地的PowerPoint软件。给应用起名叫做PPT批量生成器方便以后在应用列表里找到它。二、元素定位四合一找准PPT里的每一个元素PPT自动化最难的不是生成幻灯片而是定位到具体的文本框、图片、表格这些元素。影刀RPA提供了四种定位方式。元素捕获点击指令面板的捕获元素鼠标变成十字准星移到PPT的任意位置点击。我第一次捕获PPT里的标题框发现捕获到的是整个PPT窗口不是里面的文本框。后来才知道要等鼠标移动到文本框边缘出现虚线框时再点击才能准确捕获到文本框元素。XPath语法6种最常用写法//*[text()单击此处添加标题] 匹配文字等于单击此处添加标题的元素 //p[placeholder单击此处添加标题] 匹配placeholder属性的p元素 //div[contains(class,slide)] 匹配class包含slide的div元素 //input[typetext and roletextbox] 多条件匹配文本框 //*[starts-with(id,slide_)] id以slide_开头的元素 //table//tr[position()1]/td[1] 表格中从第二行开始的第一列单元格CSS选择器语法8种最常用写法.slide-title 类选择器匹配class为slide-title的元素 #slide1 .title 层级选择器匹配slide1下的title元素 input[typetext][roletextbox] 多属性选择器p:first-child 伪类选择器匹配第一个p元素tr:nth-child(odd)奇数行选择器 *[class^text_] 属性开头匹配 *[class$_box] 属性结尾匹配 *[class*title] 属性包含匹配XPath和CSS选型指南XPath能向上遍历父节点CSS只能向下遍历子节点。如果你要定位的元素没有唯一标识但它的父元素有用XPath的…可以很方便地到父元素再找兄弟元素。CSS做不到这一点。XPath支持text()函数直接匹配文字内容CSS不支持。比如PPT里有很多个单击此处添加标题的占位符用XPath的text()可以精确定位到某一个。但CSS选择器的执行速度比XPath快。如果你要操作的元素有明确的id或class用CSS选择器性能更好。我在做PPT批量生成时标题框都用id选择器如#title_box内容框用XPath的text()匹配两者结合用效果最好。正则表达式3个最常用场景\d 匹配一个或多个数字提取PPT文件名中的页码 [\u4e00-\u9fa5] 匹配中文字符提取PPT中的中文标题 \{\{.*?\}\} 非贪婪匹配提取PPT模板中的占位符如{{title}}三、变量与数据类型PPT内容存储的核心做PPT自动化时数据通常来自Excel表格。用读取Excel内容指令把数据读到列表变量里然后用ForEach循环遍历。字符串操作# 字符串拼接生成PPT文件名ppt_filename业绩汇报_sales_name_date_str.pptx# 字符串替换替换模板中的占位符slide_titletemplate_title.replace({{name}},sales_name)slide_titleslide_title.replace({{amount}},str(sales_amount))# 字符串格式化更优雅的方式slide_title{}的业绩汇报.format(sales_name)# 或者用f-stringPython 3.6slide_titlef{sales_name}的业绩汇报列表操作# 从Excel读取的销售数据存到列表sales_data[[张三,500000,华北区],[李四,800000,华东区],[王五,300000,华南区]]# 遍历列表生成PPTforiteminsales_data:nameitem[0]amountitem[1]regionitem[2]# 生成一份PPT...字典操作存储PPT模板字段映射# PPT模板中的占位符与数据字段的映射placeholder_map{{{sales_name}}:name,{{sales_amount}}:amount,{{region}}:region,{{rank}}:rank}# 键不存在时的两种处理方案# 方案1用get方法提供默认值sales_rankdata_dict.get(rank,未排名)# 方案2先判断key是否存在ifrankindata_dict:sales_rankdata_dict[rank]else:sales_rank未排名JSON数据处理从HTTP接口获取PPT数据拼多多店群自动化上架方案importjsonimportrequests# 发送HTTP请求获取数据responserequests.get(https://your-api.com/sales/data)response_jsonjson.loads(response.text)# 操作JSON数据foriteminresponse_json[data]:nameitem[name]amountitem[amount]# 生成PPT...# JSON转文本存储用于日志记录json_textjson.dumps(response_json,ensure_asciiFalse,indent2)四、流程控制让PPT生成按顺序执行批量生成PPT最核心的是循环和判断。ForEach列表循环用来遍历Excel里的每一行数据并生成对应的PPT。If条件判断用来检查数据完整性。For次数循环当你知道要生成多少份PPT时用这个。比如要给50个销售生成业绩PPT设置循环次数为50。ForEach列表循环最常用# 从Excel读取的销售数据sales_list[{name:张三,amount:500000},{name:李四,amount:800000}]# ForEach循环遍历forsalesinsales_list:namesales[name]amountsales[amount]# 打开PPT模板# 替换标题# 替换金额# 另存为新文件While条件循环当你不知道要处理多少份PPT时用。比如从一个文件夹里取PPT模板来处理只要文件夹里还有文件就继续循环。If条件判断# 检查数据完整性ifnameandamount:# 数据完整生成PPTgenerate_ppt(name,amount)else:# 数据不完整记录错误print(数据不完整namestr(name))Try-Catch异常处理try:# 尝试打开PPT模板ppt.open(业绩汇报模板.pptx)# 执行替换操作ppt.replace({{name}},name)# 保存文件ppt.save_as(output_path)exceptExceptionase:# 出错了记录日志print(生成PPT失败str(e))五、PPT自动生成实战案例我要带你做一个真实可用的项目批量销售业绩PPT生成器。需求是从Excel表格读取销售数据然后自动填充到PPT模板里为每个人生成一份业绩汇报PPT。Excel表格格式sales_data.xlsx销售姓名销售金额所属区域排名日期张三500000华北区32024-01李四800000华东区12024-01PPT模板格式sales_template.pptx第一页封面 标题{{sales_name}}的业绩汇报 副标题{{region}} | {{date}} 第二页数据页 销售金额{{sales_amount}}元  区域排名第{{rank}}名 第三页图表页 [插入图表数据来自Excel]影刀RPA流程设计第一步启动Excel并读取数据。用启动Excel指令打开sales_data.xlsx用读取Excel内容指令把数据读到变量sales_list里。第二步用ForEach列表循环遍历sales_list。每次循环取出一行数据存到变量current_sales里。第三步打开PPT模板。用启动PPT指令打开sales_template.pptx。这里要用可见模式方便调试时看到执行过程。第四步执行批量替换。用PPT-替换文字指令把{{sales_name}}替换成current_sales[“name”]把{{sales_amount}}替换成current_sales[“amount”]以此类推。第五步更新图表数据。用PPT-设置图表数据指令把Excel里的销售数据写入PPT的图表。这一步最容易出错因为图表的系列名称和Excel里的列名要完全匹配。第六步另存为新文件。用PPT-另存为指令保存路径设为D:/PPT/ current_sales[“name”] “.pptx”。真实报错处理报错1PowerPoint无法打开文件原因PPT模板文件路径包含中文或特殊字符或者文件正在被占用。解决把模板文件放到纯英文路径下保存前用关闭PPT指令关闭所有已打开的PPT文件。报错2替换失败未找到占位符{{sales_name}}原因PPT模板里的占位符实际上是{{sales_name}} 后面多了个空格或者字体格式导致看起来一样但实际不一样。解决在PPT里重新手动输入一遍占位符不要用复制粘贴。或者用PPT-获取所有文本指令把所有文本读出来用Python的精确匹配来找到占位符。报错3图表数据写入失败原因图表系列名称不匹配或者数据格式不是数字。解决在PPT里手动打开图表的编辑数据看系列名称是什么然后在影刀RPA里用完全相同的名称。数据格式要用转换为数字指令确保是数字类型。# 清理和校验数据importre# 移除金额中的逗号如500,000amount_strsales_data[amount]amount_cleanre.sub(r,,,str(amount_str))amountfloat(amount_clean)六、数据驱动PPT让数据决定PPT内容除了简单的文字替换影刀RPA还能根据数据动态生成PPT页面。比如销售金额大于50万的多加一页优秀员工表彰页面销售金额小于10万的多加一页改进计划页面。动态添加幻灯片用PPT-添加幻灯片指令可以在指定位置插入新的幻灯片。结合If条件判断根据数据动态决定插入多少页幻灯片。# 根据销售金额决定PPT页数ifsales_amount500000:# 插入优秀员工表彰页面ppt.add_slide(表彰页面,2)# 在第2页位置插入ppt.replace({{award_text}},恭喜获得销售冠军)elifsales_amount100000:# 插入改进计划页面ppt.add_slide(改进计划页面,2)ppt.replace({{improve_text}},下月目标突破10万)动态设置图表用PPT-设置图表数据指令可以动态修改图表的系列名称和数值。比如每个销售的业绩数据不同图表会自动更新。# 设置图表数据chart_data[[月份,销售额],[1月,sales_jan],[2月,sales_feb],[3月,sales_mar]]ppt.set_chart_data(销售趋势图,chart_data)七、批量修改一次修改所有PPT如果你已经生成了100份PPT现在要把所有的公司Logo换成新的不需要一个个手动改。用影刀RPA的文件循环指令遍历文件夹里的所有PPT文件然后用PPT-替换图片指令批量替换Logo。批量替换文字用PPT-替换文字指令可以把所有PPT里的某个文字统一替换成另一个文字。比如公司名称变更了要把所有PPT里的旧名称替换成新名称。批量替换图片用PPT-替换图片指令可以把所有PPT里的某张图片统一替换成另一张图片。图片要用绝对路径不能用相对路径这是我踩过的坑。批量修改母版PPT的母版控制了所有幻灯片的统一格式。用PPT-设置母版指令可以批量修改字体、颜色、背景。这比一页页手动改快多了。八、模板套用一个模板生成多种风格你可以准备多个PPT模板然后根据不同的场景选择不同的模板。比如年终汇报用一个模板季度汇报用另一个模板日常汇报用第三个模板。模板选择逻辑# 根据汇报类型选择模板report_typesales_data[report_type]ifreport_type年终:template_pathtemplates/年终汇报模板.pptxelifreport_type季度:template_pathtemplates/季度汇报模板.pptxelse:template_pathtemplates/日常汇报模板.pptx# 打开选中的模板ppt.open(template_path)模板参数化在PPT模板里设置一些参数占位符比如{{bg_color}}表示背景颜色{{font_size}}表示字体大小。然后在影刀RPA里根据数据动态替换这些参数。# 根据销售排名设置不同的样式ifrank1:bg_color金色font_size32elifrank3:bg_color银色font_size28else:bg_color白色font_size24ppt.replace({{bg_color}},bg_color)ppt.replace({{font_size}},str(font_size))九、数据处理Excel驱动PPT生成PPT数据通常存在Excel里。影刀RPA操作Excel有一套完整的指令。读取Excel的常见坑坑1Excel文件被占用。如果Excel文件在手动打开状态下影刀RPA无法读取。解决办法是在启动Excel指令里勾选如果已打开则复用。坑2日期格式问题。Excel里的日期读出来可能是一个浮点数如45278.0表示2024-01-01要转换成标准日期格式。用Excel-转换日期格式指令或者自己写Python函数转换。importdatetime# Excel日期序列号转日期defexcel_date_to_str(excel_date_num):base_datedatetime.datetime(1899,12,30)target_datebase_datedatetime.timedelta(daysint(excel_date_num))returntarget_date.strftime(%Y-%m-%d)date_strexcel_date_to_str(45278.0)# 返回2024-01-01坑3合并单元格导致数据错位。如果Excel表格里有合并单元格读取Excel内容指令读出来的数据会和预期不一致。解决办法是在读取前用Excel-取消合并单元格指令或者干脆在Excel里把合并单元格拆开。Excel公式在PPT生成中的应用如果要根据销售金额自动计算排名可以在Excel里用RANK函数RANK(C2,$C$2:$C$100) [video(video-JKBURFze-1783181719043)(type-csdn)(url-https://live.csdn.net/v/embed/524993)(image-https://v-blog.csdnimg.cn/asset/a547123d88ad712dccba346c9217e237/cover/Cover0.jpg)(title-TEMU店群如何管理运营)]这个公式的意思是计算C2单元格的值在C2到C100这个区域里的排名。如果要根据销售额自动判断等级可以用IF函数IF(C2500000,A,IF(C2300000,B,IF(C2100000,C,D)))十、鼠标键盘图像自动化操作PPT时有些操作没有现成的指令需要用模拟键鼠的方式。比如PPT里面的切换幻灯片动画设置用发送快捷键AltTab可以快速切换窗口。模拟模式vs驱动模式模拟模式是模拟鼠标移动和点击速度快但容易被某些安全软件拦截。驱动模式是底层驱动模拟更稳定但速度稍慢。我建议默认用模拟模式如果遇到指令执行不稳定再切换到驱动模式。虚拟键盘驱动如果要模拟打字输入用模拟输入指令。如果要模拟快捷键用发送快捷键指令。比如CtrlN新建幻灯片CtrlM插入幻灯片F5从头开始放映。图像识别如果PPT界面上某个按钮找不到元素可以用图像识别点击。用图像识别-等待出现指令等待按钮出现然后用图像识别-点击指令点击按钮。十一、进阶技能Python协同处理PPT影刀RPA内置了Python环境可以直接调用Python的第三方库来处理PPT。最常用的是python-pptx库能实现影刀RPA指令做不到的高级操作。安装python-pptx库在影刀RPA的Python-执行代码指令里先用pip安装库importsubprocess subprocess.check_call([pip,install,python-pptx])用python-pptx生成PPTfrompptximportPresentationfrompptx.utilimportInches,Ptfrompptx.enum.textimportPP_ALIGN# 打开PPT模板prsPresentation(sales_template.pptx)# 遍历所有幻灯片forslideinprs.slides:# 遍历幻灯片里的所有形状forshapeinslide.shapes:# 如果形状是文本框ifshape.has_text_frame:text_frameshape.text_frame# 替换文字forparagraphintext_frame.paragraphs:forruninparagraph.runs:if{{sales_name}}inrun.text:run.textrun.text.replace({{sales_name}},张三)if{{sales_amount}}inrun.text:run.textrun.text.replace({{sales_amount}},500000)# 添加新幻灯片blank_slide_layoutprs.slide_layouts[6]# 空白布局slideprs.slides.add_slide(blank_slide_layout)# 在新建的幻灯片上添加文本框leftInches(1)topInches(1)widthInches(8)heightInches(1)textboxslide.shapes.add_textbox(left,top,width,height)text_frametextbox.text_frame text_frame.text新增的内容# 设置字体格式ptext_frame.paragraphs[0]p.text新增的标题p.font.sizePt(32)p.font.boldTruep.font.color.rgbRGBColor(255,0,0)# 保存文档prs.save(销售汇报_张三.pptx)用Python处理复杂图表影刀RPA的PPT-设置图表数据指令能处理的图表类型有限比如不能设置复合图表柱状图折线图组合。用python-pptx可以精确控制图表的每一个细节。frompptx.chart.dataimportCategoryChartDatafrompptx.enum.chartimportXL_CHART_TYPE# 获取幻灯片中的图表forshapeinslide.shapes:ifshape.has_chart:chartshape.chart# 修改图表数据chart_dataCategoryChartData()chart_data.categories[1月,2月,3月]chart_data.add_series(销售额,(50000,60000,70000))chart.replace_data(chart_data)HTTP请求对接数据系统如果你们的销售数据存在线上系统里可以用HTTP请求指令获取数据。importrequestsimportjson# 发送GET请求获取销售数据responserequests.get(https://your-crm-system.com/api/sales/data,headers{Authorization:Bearer your_token_here})# 解析JSON响应sales_datajson.loads(response.text)# 遍历销售数据生成PPTforiteminsales_data[data]:nameitem[name]amountitem[amount]# 生成PPT...十二、系统联动飞书通知与定时任务PPT生成完之后通常需要通知相关人员。影刀RPA可以对接飞书自动发送消息通知。飞书消息通知配置用飞书-发送消息指令填写应用App ID和App Secret然后填写接收人的open_id和消息内容。PPT生成完成通知 共生成PPT 100 份 保存路径D:/PPT/ 生成时间2024-01-01 10:30:00邮件发送PPT文件PPT生成完之后用发送邮件指令把PPT文件作为附件发给相关人员。# 邮件配置# SMTP服务器smtp.qq.com# 端口465# 发件人your_emailqq.com# 授权码在QQ邮箱设置里获取# 收件人sales_email# 主题业绩汇报PPT - {sales_name}# 正文尊敬的{sales_name}附件为您的业绩汇报PPT请查收。# 附件D:/PPT/{sales_name}.pptx定时任务配置如果要每天自动生成前一天的业绩PPT用定时任务指令。设置触发方式为按CRON表达式比如0 9 * * 1-5表示周一到周五每天早上9点执行。常见报错速查表报错信息原因解决方法PowerPoint无法打开文件文件路径不正确或文件被占用检查路径保存前先关闭所有PPT替换失败未找到占位符占位符实际内容和看起来不一样手动重新输入占位符不要复制粘贴图表数据写入失败系列名称不匹配或数据格式错误检查系列名称完全匹配数据转成数字格式Can not convert Array to StringExcel某单元格是数组不是单个值用列表转换为文本指令转换文件已被另一个进程使用PPT文件被占用未关闭每次循环结束前关闭PPT文件KeyError: ‘name’字典里没有name这个键用dict.get(‘name’,默认值)方式安全取值#影刀RPA #PPT自动生成 #数据驱动PPT #RPA教程 #新手入门 #自动化办公 #PPT自动化 #批量生成 #模板套用作者林焱
影刀RPA新手教程:PPT自动生成完全指南——数据驱动PPT批量修改与模板套用
发布时间:2026/7/5 15:08:20
影刀RPA新手教程PPT自动生成完全指南——数据驱动PPT批量修改与模板套用作者林焱我第一次用影刀RPA做PPT自动生成是要给100个销售员每人生成一份业绩汇报PPT。手动做要花一个星期用影刀RPA半天就搞定了。这篇文章把我做PPT自动化踩过的坑全部告诉你让你也能快速上手。一、认识影刀与安装配置去影刀RPA官网下载安装包安装时勾选所有插件。安装完成后打开软件界面分为三块左边是指令面板中间是流程编辑画布右边是属性配置面板。做PPT自动化要用到启动PPT指令这个指令在社区版里就有不需要升级到付费版。但如果你的流程指令数会超过100条建议直接用创业版不然写到一半发现指令数不够用就很尴尬。新建应用时选择Windows应用因为我们要操作本地的PowerPoint软件。给应用起名叫做PPT批量生成器方便以后在应用列表里找到它。二、元素定位四合一找准PPT里的每一个元素PPT自动化最难的不是生成幻灯片而是定位到具体的文本框、图片、表格这些元素。影刀RPA提供了四种定位方式。元素捕获点击指令面板的捕获元素鼠标变成十字准星移到PPT的任意位置点击。我第一次捕获PPT里的标题框发现捕获到的是整个PPT窗口不是里面的文本框。后来才知道要等鼠标移动到文本框边缘出现虚线框时再点击才能准确捕获到文本框元素。XPath语法6种最常用写法//*[text()单击此处添加标题] 匹配文字等于单击此处添加标题的元素 //p[placeholder单击此处添加标题] 匹配placeholder属性的p元素 //div[contains(class,slide)] 匹配class包含slide的div元素 //input[typetext and roletextbox] 多条件匹配文本框 //*[starts-with(id,slide_)] id以slide_开头的元素 //table//tr[position()1]/td[1] 表格中从第二行开始的第一列单元格CSS选择器语法8种最常用写法.slide-title 类选择器匹配class为slide-title的元素 #slide1 .title 层级选择器匹配slide1下的title元素 input[typetext][roletextbox] 多属性选择器p:first-child 伪类选择器匹配第一个p元素tr:nth-child(odd)奇数行选择器 *[class^text_] 属性开头匹配 *[class$_box] 属性结尾匹配 *[class*title] 属性包含匹配XPath和CSS选型指南XPath能向上遍历父节点CSS只能向下遍历子节点。如果你要定位的元素没有唯一标识但它的父元素有用XPath的…可以很方便地到父元素再找兄弟元素。CSS做不到这一点。XPath支持text()函数直接匹配文字内容CSS不支持。比如PPT里有很多个单击此处添加标题的占位符用XPath的text()可以精确定位到某一个。但CSS选择器的执行速度比XPath快。如果你要操作的元素有明确的id或class用CSS选择器性能更好。我在做PPT批量生成时标题框都用id选择器如#title_box内容框用XPath的text()匹配两者结合用效果最好。正则表达式3个最常用场景\d 匹配一个或多个数字提取PPT文件名中的页码 [\u4e00-\u9fa5] 匹配中文字符提取PPT中的中文标题 \{\{.*?\}\} 非贪婪匹配提取PPT模板中的占位符如{{title}}三、变量与数据类型PPT内容存储的核心做PPT自动化时数据通常来自Excel表格。用读取Excel内容指令把数据读到列表变量里然后用ForEach循环遍历。字符串操作# 字符串拼接生成PPT文件名ppt_filename业绩汇报_sales_name_date_str.pptx# 字符串替换替换模板中的占位符slide_titletemplate_title.replace({{name}},sales_name)slide_titleslide_title.replace({{amount}},str(sales_amount))# 字符串格式化更优雅的方式slide_title{}的业绩汇报.format(sales_name)# 或者用f-stringPython 3.6slide_titlef{sales_name}的业绩汇报列表操作# 从Excel读取的销售数据存到列表sales_data[[张三,500000,华北区],[李四,800000,华东区],[王五,300000,华南区]]# 遍历列表生成PPTforiteminsales_data:nameitem[0]amountitem[1]regionitem[2]# 生成一份PPT...字典操作存储PPT模板字段映射# PPT模板中的占位符与数据字段的映射placeholder_map{{{sales_name}}:name,{{sales_amount}}:amount,{{region}}:region,{{rank}}:rank}# 键不存在时的两种处理方案# 方案1用get方法提供默认值sales_rankdata_dict.get(rank,未排名)# 方案2先判断key是否存在ifrankindata_dict:sales_rankdata_dict[rank]else:sales_rank未排名JSON数据处理从HTTP接口获取PPT数据拼多多店群自动化上架方案importjsonimportrequests# 发送HTTP请求获取数据responserequests.get(https://your-api.com/sales/data)response_jsonjson.loads(response.text)# 操作JSON数据foriteminresponse_json[data]:nameitem[name]amountitem[amount]# 生成PPT...# JSON转文本存储用于日志记录json_textjson.dumps(response_json,ensure_asciiFalse,indent2)四、流程控制让PPT生成按顺序执行批量生成PPT最核心的是循环和判断。ForEach列表循环用来遍历Excel里的每一行数据并生成对应的PPT。If条件判断用来检查数据完整性。For次数循环当你知道要生成多少份PPT时用这个。比如要给50个销售生成业绩PPT设置循环次数为50。ForEach列表循环最常用# 从Excel读取的销售数据sales_list[{name:张三,amount:500000},{name:李四,amount:800000}]# ForEach循环遍历forsalesinsales_list:namesales[name]amountsales[amount]# 打开PPT模板# 替换标题# 替换金额# 另存为新文件While条件循环当你不知道要处理多少份PPT时用。比如从一个文件夹里取PPT模板来处理只要文件夹里还有文件就继续循环。If条件判断# 检查数据完整性ifnameandamount:# 数据完整生成PPTgenerate_ppt(name,amount)else:# 数据不完整记录错误print(数据不完整namestr(name))Try-Catch异常处理try:# 尝试打开PPT模板ppt.open(业绩汇报模板.pptx)# 执行替换操作ppt.replace({{name}},name)# 保存文件ppt.save_as(output_path)exceptExceptionase:# 出错了记录日志print(生成PPT失败str(e))五、PPT自动生成实战案例我要带你做一个真实可用的项目批量销售业绩PPT生成器。需求是从Excel表格读取销售数据然后自动填充到PPT模板里为每个人生成一份业绩汇报PPT。Excel表格格式sales_data.xlsx销售姓名销售金额所属区域排名日期张三500000华北区32024-01李四800000华东区12024-01PPT模板格式sales_template.pptx第一页封面 标题{{sales_name}}的业绩汇报 副标题{{region}} | {{date}} 第二页数据页 销售金额{{sales_amount}}元  区域排名第{{rank}}名 第三页图表页 [插入图表数据来自Excel]影刀RPA流程设计第一步启动Excel并读取数据。用启动Excel指令打开sales_data.xlsx用读取Excel内容指令把数据读到变量sales_list里。第二步用ForEach列表循环遍历sales_list。每次循环取出一行数据存到变量current_sales里。第三步打开PPT模板。用启动PPT指令打开sales_template.pptx。这里要用可见模式方便调试时看到执行过程。第四步执行批量替换。用PPT-替换文字指令把{{sales_name}}替换成current_sales[“name”]把{{sales_amount}}替换成current_sales[“amount”]以此类推。第五步更新图表数据。用PPT-设置图表数据指令把Excel里的销售数据写入PPT的图表。这一步最容易出错因为图表的系列名称和Excel里的列名要完全匹配。第六步另存为新文件。用PPT-另存为指令保存路径设为D:/PPT/ current_sales[“name”] “.pptx”。真实报错处理报错1PowerPoint无法打开文件原因PPT模板文件路径包含中文或特殊字符或者文件正在被占用。解决把模板文件放到纯英文路径下保存前用关闭PPT指令关闭所有已打开的PPT文件。报错2替换失败未找到占位符{{sales_name}}原因PPT模板里的占位符实际上是{{sales_name}} 后面多了个空格或者字体格式导致看起来一样但实际不一样。解决在PPT里重新手动输入一遍占位符不要用复制粘贴。或者用PPT-获取所有文本指令把所有文本读出来用Python的精确匹配来找到占位符。报错3图表数据写入失败原因图表系列名称不匹配或者数据格式不是数字。解决在PPT里手动打开图表的编辑数据看系列名称是什么然后在影刀RPA里用完全相同的名称。数据格式要用转换为数字指令确保是数字类型。# 清理和校验数据importre# 移除金额中的逗号如500,000amount_strsales_data[amount]amount_cleanre.sub(r,,,str(amount_str))amountfloat(amount_clean)六、数据驱动PPT让数据决定PPT内容除了简单的文字替换影刀RPA还能根据数据动态生成PPT页面。比如销售金额大于50万的多加一页优秀员工表彰页面销售金额小于10万的多加一页改进计划页面。动态添加幻灯片用PPT-添加幻灯片指令可以在指定位置插入新的幻灯片。结合If条件判断根据数据动态决定插入多少页幻灯片。# 根据销售金额决定PPT页数ifsales_amount500000:# 插入优秀员工表彰页面ppt.add_slide(表彰页面,2)# 在第2页位置插入ppt.replace({{award_text}},恭喜获得销售冠军)elifsales_amount100000:# 插入改进计划页面ppt.add_slide(改进计划页面,2)ppt.replace({{improve_text}},下月目标突破10万)动态设置图表用PPT-设置图表数据指令可以动态修改图表的系列名称和数值。比如每个销售的业绩数据不同图表会自动更新。# 设置图表数据chart_data[[月份,销售额],[1月,sales_jan],[2月,sales_feb],[3月,sales_mar]]ppt.set_chart_data(销售趋势图,chart_data)七、批量修改一次修改所有PPT如果你已经生成了100份PPT现在要把所有的公司Logo换成新的不需要一个个手动改。用影刀RPA的文件循环指令遍历文件夹里的所有PPT文件然后用PPT-替换图片指令批量替换Logo。批量替换文字用PPT-替换文字指令可以把所有PPT里的某个文字统一替换成另一个文字。比如公司名称变更了要把所有PPT里的旧名称替换成新名称。批量替换图片用PPT-替换图片指令可以把所有PPT里的某张图片统一替换成另一张图片。图片要用绝对路径不能用相对路径这是我踩过的坑。批量修改母版PPT的母版控制了所有幻灯片的统一格式。用PPT-设置母版指令可以批量修改字体、颜色、背景。这比一页页手动改快多了。八、模板套用一个模板生成多种风格你可以准备多个PPT模板然后根据不同的场景选择不同的模板。比如年终汇报用一个模板季度汇报用另一个模板日常汇报用第三个模板。模板选择逻辑# 根据汇报类型选择模板report_typesales_data[report_type]ifreport_type年终:template_pathtemplates/年终汇报模板.pptxelifreport_type季度:template_pathtemplates/季度汇报模板.pptxelse:template_pathtemplates/日常汇报模板.pptx# 打开选中的模板ppt.open(template_path)模板参数化在PPT模板里设置一些参数占位符比如{{bg_color}}表示背景颜色{{font_size}}表示字体大小。然后在影刀RPA里根据数据动态替换这些参数。# 根据销售排名设置不同的样式ifrank1:bg_color金色font_size32elifrank3:bg_color银色font_size28else:bg_color白色font_size24ppt.replace({{bg_color}},bg_color)ppt.replace({{font_size}},str(font_size))九、数据处理Excel驱动PPT生成PPT数据通常存在Excel里。影刀RPA操作Excel有一套完整的指令。读取Excel的常见坑坑1Excel文件被占用。如果Excel文件在手动打开状态下影刀RPA无法读取。解决办法是在启动Excel指令里勾选如果已打开则复用。坑2日期格式问题。Excel里的日期读出来可能是一个浮点数如45278.0表示2024-01-01要转换成标准日期格式。用Excel-转换日期格式指令或者自己写Python函数转换。importdatetime# Excel日期序列号转日期defexcel_date_to_str(excel_date_num):base_datedatetime.datetime(1899,12,30)target_datebase_datedatetime.timedelta(daysint(excel_date_num))returntarget_date.strftime(%Y-%m-%d)date_strexcel_date_to_str(45278.0)# 返回2024-01-01坑3合并单元格导致数据错位。如果Excel表格里有合并单元格读取Excel内容指令读出来的数据会和预期不一致。解决办法是在读取前用Excel-取消合并单元格指令或者干脆在Excel里把合并单元格拆开。Excel公式在PPT生成中的应用如果要根据销售金额自动计算排名可以在Excel里用RANK函数RANK(C2,$C$2:$C$100) [video(video-JKBURFze-1783181719043)(type-csdn)(url-https://live.csdn.net/v/embed/524993)(image-https://v-blog.csdnimg.cn/asset/a547123d88ad712dccba346c9217e237/cover/Cover0.jpg)(title-TEMU店群如何管理运营)]这个公式的意思是计算C2单元格的值在C2到C100这个区域里的排名。如果要根据销售额自动判断等级可以用IF函数IF(C2500000,A,IF(C2300000,B,IF(C2100000,C,D)))十、鼠标键盘图像自动化操作PPT时有些操作没有现成的指令需要用模拟键鼠的方式。比如PPT里面的切换幻灯片动画设置用发送快捷键AltTab可以快速切换窗口。模拟模式vs驱动模式模拟模式是模拟鼠标移动和点击速度快但容易被某些安全软件拦截。驱动模式是底层驱动模拟更稳定但速度稍慢。我建议默认用模拟模式如果遇到指令执行不稳定再切换到驱动模式。虚拟键盘驱动如果要模拟打字输入用模拟输入指令。如果要模拟快捷键用发送快捷键指令。比如CtrlN新建幻灯片CtrlM插入幻灯片F5从头开始放映。图像识别如果PPT界面上某个按钮找不到元素可以用图像识别点击。用图像识别-等待出现指令等待按钮出现然后用图像识别-点击指令点击按钮。十一、进阶技能Python协同处理PPT影刀RPA内置了Python环境可以直接调用Python的第三方库来处理PPT。最常用的是python-pptx库能实现影刀RPA指令做不到的高级操作。安装python-pptx库在影刀RPA的Python-执行代码指令里先用pip安装库importsubprocess subprocess.check_call([pip,install,python-pptx])用python-pptx生成PPTfrompptximportPresentationfrompptx.utilimportInches,Ptfrompptx.enum.textimportPP_ALIGN# 打开PPT模板prsPresentation(sales_template.pptx)# 遍历所有幻灯片forslideinprs.slides:# 遍历幻灯片里的所有形状forshapeinslide.shapes:# 如果形状是文本框ifshape.has_text_frame:text_frameshape.text_frame# 替换文字forparagraphintext_frame.paragraphs:forruninparagraph.runs:if{{sales_name}}inrun.text:run.textrun.text.replace({{sales_name}},张三)if{{sales_amount}}inrun.text:run.textrun.text.replace({{sales_amount}},500000)# 添加新幻灯片blank_slide_layoutprs.slide_layouts[6]# 空白布局slideprs.slides.add_slide(blank_slide_layout)# 在新建的幻灯片上添加文本框leftInches(1)topInches(1)widthInches(8)heightInches(1)textboxslide.shapes.add_textbox(left,top,width,height)text_frametextbox.text_frame text_frame.text新增的内容# 设置字体格式ptext_frame.paragraphs[0]p.text新增的标题p.font.sizePt(32)p.font.boldTruep.font.color.rgbRGBColor(255,0,0)# 保存文档prs.save(销售汇报_张三.pptx)用Python处理复杂图表影刀RPA的PPT-设置图表数据指令能处理的图表类型有限比如不能设置复合图表柱状图折线图组合。用python-pptx可以精确控制图表的每一个细节。frompptx.chart.dataimportCategoryChartDatafrompptx.enum.chartimportXL_CHART_TYPE# 获取幻灯片中的图表forshapeinslide.shapes:ifshape.has_chart:chartshape.chart# 修改图表数据chart_dataCategoryChartData()chart_data.categories[1月,2月,3月]chart_data.add_series(销售额,(50000,60000,70000))chart.replace_data(chart_data)HTTP请求对接数据系统如果你们的销售数据存在线上系统里可以用HTTP请求指令获取数据。importrequestsimportjson# 发送GET请求获取销售数据responserequests.get(https://your-crm-system.com/api/sales/data,headers{Authorization:Bearer your_token_here})# 解析JSON响应sales_datajson.loads(response.text)# 遍历销售数据生成PPTforiteminsales_data[data]:nameitem[name]amountitem[amount]# 生成PPT...十二、系统联动飞书通知与定时任务PPT生成完之后通常需要通知相关人员。影刀RPA可以对接飞书自动发送消息通知。飞书消息通知配置用飞书-发送消息指令填写应用App ID和App Secret然后填写接收人的open_id和消息内容。PPT生成完成通知 共生成PPT 100 份 保存路径D:/PPT/ 生成时间2024-01-01 10:30:00邮件发送PPT文件PPT生成完之后用发送邮件指令把PPT文件作为附件发给相关人员。# 邮件配置# SMTP服务器smtp.qq.com# 端口465# 发件人your_emailqq.com# 授权码在QQ邮箱设置里获取# 收件人sales_email# 主题业绩汇报PPT - {sales_name}# 正文尊敬的{sales_name}附件为您的业绩汇报PPT请查收。# 附件D:/PPT/{sales_name}.pptx定时任务配置如果要每天自动生成前一天的业绩PPT用定时任务指令。设置触发方式为按CRON表达式比如0 9 * * 1-5表示周一到周五每天早上9点执行。常见报错速查表报错信息原因解决方法PowerPoint无法打开文件文件路径不正确或文件被占用检查路径保存前先关闭所有PPT替换失败未找到占位符占位符实际内容和看起来不一样手动重新输入占位符不要复制粘贴图表数据写入失败系列名称不匹配或数据格式错误检查系列名称完全匹配数据转成数字格式Can not convert Array to StringExcel某单元格是数组不是单个值用列表转换为文本指令转换文件已被另一个进程使用PPT文件被占用未关闭每次循环结束前关闭PPT文件KeyError: ‘name’字典里没有name这个键用dict.get(‘name’,默认值)方式安全取值#影刀RPA #PPT自动生成 #数据驱动PPT #RPA教程 #新手入门 #自动化办公 #PPT自动化 #批量生成 #模板套用作者林焱