影刀RPA进阶教程:Excel图表自动生成——采集数据直接变可视化
数据采回来只是一列列数字,老板要的是一眼能看懂的图。每周手工选中区域、插入图表、调坐标轴,重复劳动到怀疑人生。这篇进阶教程讲怎么用影刀RPA把这一步自动化:采集流程落表之后,自动生成折线图、柱形图,再顺手插一张数据透视表,采集数据直接变可视化,全程不需要打开Excel点一次鼠标。
我是非技术出身做电商运营的,影刀RPA用了两年多,图表自动化算是我的进阶招牌项目。这篇会把驱动方式的选择、openpyxl画图的代码、透视表的坑一次讲透,前面的采集和落表部分我会带得快一点,重点全砸在图表这一环。
环境与安装:先把驱动方式这件事搞明白
老规矩:影刀客户端装好、浏览器插件装好、能新建应用。社区版就能做本篇全部内容,图表生成跑一次几十秒,30分钟/天的时长绰绰有余。
做Excel图表自动化,必须先理解【打开/新建Excel】指令里的"驱动方式"这个参数,官方文档列了四种:
| 驱动方式 | 特点 | 适用 |
|---|---|---|
| office | 兼容性最好,支持xls和csv | 有Office的机器,公式读取正常 |
| wps | 支持WPS表格 | 办公机装的是WPS |
| openpyxl | 没装Office/WPS也能操作 | 服务器环境、纯读写场景 |
| auto_check | 自动按顺序检测 | 拿不准就选它 |
openpyxl有个官方文档明确写的限制:公式会被以字符串形式读出来,而不是计算结果。所以我的分工是——写数据用office驱动,画图表用openpyxl驱动,两者各干各的活。
整体流程设计:图表生成作为独立子流程
流程拆三层:01_采集落表、02_数据汇总、03_图表生成。01采集竞品或店铺数据写进数据表;02把明细汇总成一张"图表数据源"工作表;03专门负责可视化。为什么图表要独立成子流程?因为数据源经常变,采集逻辑改八遍,图表子流程一个字不用动,这就是子流程封装复用的价值。
子流程之间用流程参数传递Excel对象,主流程里【打开/新建Excel】把对象存成变量,三个子流程都引用同一个变量,全程只开一个文件,避免多个Excel进程打架。
元素定位四合一:采数环节的最小必会
图表的原料是数据,数据来自采集,采集绕不开元素定位。这里给你一个浓缩版四合一:元素捕获解决80%的常规抓取,点顶部工具栏"捕获元素",橙色边框出现后点击确认;class动态变化时手写XPath,contains模糊匹配是最常用的写法;结构简单时CSS选择器一行搞定,div.item span.price这种;价格藏在长文本里时用正则提取数字。
# 捕获元素:销量列表项(class固定、结构浅,CSS最省事) div.sku-list > div.item > span.sales # 捕获元素:页码文字"共36页"(文本模糊匹配,只能用XPath) //*[contains(text(),'共') and contains(text(),'页')] # 参照物定位:通过"累计销量"文字定位右侧数字 //*[contains(text(),'累计销量')]/following-sibling::*[1]选型口诀:有干净的class用CSS,要按文本找或跨层级找用XPath,动态文本里的数字用正则。记住这个就不需要在四种写法之间反复纠结。
流程控制:先判断有没有数据再画图
画图前必须做防呆:数据表是空的,图会画出一个空壳,或者直接报错。主流程骨架:
【打开/新建Excel】打开数据文件
【读取区域】读取数据源,判断列表长度是否大于1(大于1说明除表头外有数据)
If有数据→调用03图表生成子流程;Else→【打印日志】"数据为空,跳过图表"并走告警
整体包【Try-Catch】,Catch里输出日志,Finally里【关闭Excel】
这个"先判断再画图"的If分支帮我避开过最尴尬的场景:周一早会上打开自动生成的报表,图表区域一片空白。原因就是那天采集全挂了,数据没进来,图表流程照跑。
数据处理:汇总出图表数据源
图表不能直接吃明细,要先汇总。用【读取区域】把明细读成二维列表,Python里按日期分组求和,生成汇总表,再用【写入内容至Excel工作表】写到"图表数据源"工作表。
汇总表长这样,两张图共用这一个数据源:
| 日期 | 日销售额 | 订单量 |
|---|---|---|
| 09-22 | 45230.5 | 312 |
| 09-23 | 51280.0 | 356 |
| 09-24 | 47890.0 | 329 |
写入时留意两件事:写入内容传二维列表[[日期,销售额,订单量],...]一次写完,比循环逐行快;"格式设置为文本的列"把日期列设为文本,防止09-22被转成日期类型后图表横轴错乱。
这里顺带说数据透视表:影刀有【新建透视表】指令,但官方文档里专门列了它的报错原因——数据源区域标题行不能有空格,标题带空格会报"不能设置类PivotItem的Visible属性"。我所有数据源表头的命名习惯就是无空格的下划线风格,从根上避开这个坑。
进阶技能:openpyxl自动生成折线图和柱形图
到了本篇核心。影刀原生指令没有"插入图表",业界通行做法是在【运行代码】指令里用openpyxl画。openpyxl正是影刀支持的驱动之一,装在流程依赖里开箱即用。代码不长,注释写全:
# 输入:file_path Excel路径;输出:无(直接在文件里生成图表)# 在【运行代码】指令中执行,需先pip安装openpyxlimportopenpyxlfromopenpyxl.chartimportLineChart,BarChart,Reference wb=openpyxl.load_workbook(r'D:\报表\销售日报.xlsx')ws=wb['图表数据源']# 数据源工作表max_row=ws.max_row# 自动取行数,数据多少天图就多长# 折线图:日销售额趋势line=LineChart()line.title="近7日销售额趋势"line.y_axis.title="销售额(元)"line.x_axis.title="日期"data=Reference(ws,min_col=2,min_row=1,max_col=2,max_row=max_row)# B列含表头cats=Reference(ws,min_col=1,min_row=2,max_row=max_row)# A列日期做横轴line.add_data(data,titles_from_data=True)line.set_categories(cats)line.width,line.height=18,9# 单位厘米ws.add_chart(line,"F2")# 图表锚定到F2单元格# 柱形图:每日订单量bar=BarChart()bar.title="近7日订单量"bar.y_axis.title="订单数"data2=Reference(ws,min_col=3,min_row=1,max_col=3,max_row=max_row)bar.add_data(data2,titles_from_data=True)bar.set_categories(cats)bar.width,bar.height=18,9ws.add_chart(bar,"F22")# 锚到F22,两张图上下排开不重叠wb.save(r'D:\报表\销售日报.xlsx')三个关键点:Reference的min_row=1带上表头,配合titles_from_data=True,图例自动就是列名;max_row动态取,数据多一天图就自动长一天,永远不用改代码;图表锚点是左上角单元格,两张图锚点留足纵向间隔,不然重叠成一团——这是我踩过的第一个图表坑。
鼠标键盘与图像:图表环节的应急手段
openpyxl画不了所有图,比如Excel里已经做好模板、只差刷新的场景。这时反向操作:用office驱动打开模板文件,靠【等待元素】确认Excel窗口就绪,模板里的图表引用的是固定区域,数据更新后图表自动刷新,根本不用碰图表本身。这是"让图表跟着数据走,而不是让程序去画图"的思路,简单场景更好用。
个别老系统导出的报表格式诡异,openpyxl打不开,就用图像识别兜底确认页面状态:wait_appear等待某按钮图像出现再继续,锚点九位置加偏移量点导出按钮。图像指令只做"确认"和"点击",不做数据读取,读数还是交给指令。
系统联动:带图表的报表怎么发出去
图表生成完,两条出路。
第一条是邮件:【发送邮件】指令把xlsx加为邮件附件,SMTP服务器下拉选常用邮箱,勾"使用SSL"和"SMTP服务器需要身份验证"(填授权码),正文一句话说明"图表见附件第2个工作表"。想让图直接出现在邮件正文里,就勾选HTML格式,配合【Base64编码文件】指令把图表截图转成Base64字符串插进正文,官方文档里写明这两者要配合使用。
第二条是截图嵌入其他文档:Excel扩展指令里有【区域截图】,把图表区域截成图片,再走【粘贴至幻灯片】进周会PPT。有个官方文档提过的坑:截取的区域含数据透视表时会截到异常内容,透视表区域别用截图方案,直接发文件。
定时执行照旧:计划任务里设每周一08:30,采集→汇总→图表→发邮件一气呵成,记得执行机电源设置改"从不",防止休眠不触发。
工程化规范:图表自动化怎么维护不崩
三条实操经验。第一,数据源表永远单独一个工作表,图表引用它,明细和图表互不干扰,改明细格式不会弄断图表引用。第二,openpyxl版本锁死,升级依赖前先在测试文件上跑一遍全流程——Python依赖包出问题时,影刀编辑器里可能出现新建Python模块一直转圈的情况,官方排查方向是本机jedi库版本和加密软件,遇到就按文档提示处理。第三,每张图表在工作表里的锚点位置固定下来写进注
释,后面接手的人一眼明白版面规则。
调试图表代码时,我在【运行代码】前后各加一条【打印日志】,输出max_row和保存路径,图表异常时日志直接告诉你是数据行数问题还是路径问题,配合断点单步执行,十分钟内能定位。
易错速查表
| 报错/现象 | 原因 | 解决 |
|---|---|---|
| openpyxl读公式得到字符串 | openpyxl驱动的固有限制 | 需要公式结果时改office/wps驱动 |
| 新建透视表报PivotItem错误 | 数据源标题行有空格 | 去掉标题空格再建透视表 |
| 两张图表重叠成一团 | 锚点间隔不够 | 第二张图锚点下移,如F22 |
| Excel报"发生意外" | 进程残留或xls行数超限 | 清进程;超65536行改用xlsx |
| 图表空白 | 数据源没数据流程照跑 | 画图前If判断列表长度 |
| Python模块编辑转圈 | 本机jedi版本冲突 | 卸载/降级jedi,重开编辑器 |
学习资源与延伸阅读
这篇涉及的开图表完整流程源码——采集、汇总、openpyxl绘图、邮件发送四个子流程——我放在代码仓库 home.linyan.cloud,注释都是中文的,改改文件路径就能跑。图表代码的Reference和锚点写法建议对照官方openpyxl文档再消化一遍,另外影刀官方的"Excel自动化-进阶"中级课程把读写指令讲得比我细,配合食用效果最好。
#影刀RPA #RPA自动化 #Excel #数据可视化 #图表生成 #流程自动化
作者:林焱