影刀RPA新手教程:财务报表自动汇总完全指南——多Excel合并数据透视与自动发邮件
2026/7/4 19:37:48 网站建设 项目流程

影刀RPA新手教程:财务报表自动汇总完全指南——多Excel合并数据透视与自动发邮件

作者:林焱

我第一次用影刀RPA做财务报表汇总,是要把15个子公司的Excel报表合并成一份集团总表,然后生成数据透视表,最后通过邮件发给财务部。手动做要花2天,用影刀RPA写了个流程,40分钟全部搞定。这篇文章把我做财务报表自动化踩过的坑全部告诉你。

一、认识影刀与安装配置

去影刀RPA官网下载安装包,安装时勾选所有插件。安装完成后打开软件,界面分为三块:左边是指令面板,中间是流程编辑画布,右边是属性配置面板。

做财务报表自动化要用到"Excel"分类下的指令,这个指令在社区版里就有,不需要升级到付费版。但如果你的流程指令数会超过100条,建议直接用创业版,不然写到一半发现指令数不够用就很尴尬。

新建应用时选择"Windows应用",因为我们要操作本地的Excel文件。给应用起名叫做"财务报表自动汇总器",方便以后在应用列表里找到它。

二、元素定位四合一:找准Excel里的每一个单元格

Excel自动化最难的不是读写数据,而是定位到具体的工作表、单元格、按钮这些元素。影刀RPA提供了四种定位方式。

元素捕获:点击指令面板的"捕获元素",鼠标变成十字准星,移到Excel的任意位置点击。我第一次捕获Excel里的单元格,发现捕获到的是整个Excel窗口,不是里面的单元格。后来才知道要等鼠标移动到单元格边缘出现绿色边框时再点击,才能准确捕获到单元格元素。

XPath语法(6种最常用写法):

//*[text()="保存"] 匹配文字等于"保存"的任何元素 //button[@id="saveButton"] 匹配id为saveButton的button元素 //div[contains(@class,"excel-cell")] 匹配class包含"excel-cell"的div元素 //input[@type="text" and @name="cellValue"] 多条件匹配 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/14da0b88c5c34cbea9684776eab16810.png#pic_center) //*[starts-with(@id,"cell_")] id以cell_开头的元素 //table//tr[position()>1]/td[1] 表格中从第二行开始的第一列

CSS选择器语法(8种最常用写法):

#saveButton id选择器 .excel-cell .cell-value 层级选择器 input[type="text"] 属性选择器button:first-child 伪类选择器tr:nth-child(odd)奇数行选择器 *[class^="cell_"] 属性开头匹配 *[class$="_value"] 属性结尾匹配 *[class*="button"] 属性包含匹配

XPath和CSS选型指南
XPath能向上遍历父节点,CSS只能向下遍历。如果你要定位的元素没有唯一标识,但它的父元素有,用XPath的"…"可以很方便地到父元素再找兄弟元素。

XPath支持text()函数直接匹配文字内容,CSS不支持。比如Excel里有很多个"保存"按钮,用XPath的text()可以精确定位到某一个。

但CSS选择器的执行速度比XPath快。如果你要操作的元素有明确的id或class,用CSS选择器性能更好。

正则表达式(3个最常用场景):

\d+ 匹配一个或多个数字,提取报表编号中的数字 [\u4e00-\u9fa5]+ 匹配中文字符,提取报表中的公司名称 第\d+季度 非贪婪匹配,提取"第X季度"格式的文本

三、变量与数据类型:财务数据存储的核心

做财务报表时,最常用的变量类型是字符串(存储公司名称、科目名称)、数字(存储金额、数量)、列表(存储多个报表数据)、字典(存储科目映射关系)。

字符串操作

# 字符串拼接(生成报表文件名)report_filename="财务报表_"+company_name+"_"+quarter+".xlsx"# 字符串替换(清理科目名称)clean_account=account_name.replace(" ","")# 移除空格clean_account=clean_account.replace("(调整)","")# 移除调整标记# 字符串格式化report_title="{}公司{}季度财务报表".format(company_name,quarter)# 或者用f-stringreport_title=f"{company_name}公司{quarter}季度财务报表"

数字操作

# 金额计算(单位:元)revenue=5000000# 收入cost=3000000# 成本profit=revenue-cost# 利润# 金额格式化(添加千分位分隔符)formatted_revenue="{:,}".format(revenue)# 输出:5,000,000# 四舍五入(保留两位小数)profit_rate=round(profit/revenue*100,2)# 利润率,保留2位小数

列表操作

# 从Excel读取的多个子公司报表数据report_data=[["子公司A",5000000,3000000,2000000],["子公司B",8000000,5000000,3000000],["子公司C",3000000,2000000,1000000]]# 遍历列表生成合并报表foriteminreport_data:company=item[0]revenue=item[1]cost=item[2]profit=item[3]# 写入合并报表...

字典操作(存储科目映射关系):

# 科目名称映射字典account_map={"1001":"库存现金","1002":"银行存款","1122":"应收账款","2202":"应付账款"}# 键不存在时的两种处理方案# 方案1:用get方法提供默认值account_name=account_map.get("1001","未知科目")# 方案2:先判断key是否存在if"1001"inaccount_map:account_name=account_map["1001"]else:account_name="未知科目"

JSON数据处理(从HTTP接口获取财务数据):

importjsonimportrequests# 发送HTTP请求获取财务数据response=requests.get("https://your-finance-system.com/api/reports")response_json=json.loads(response.text)# 操作JSON数据foriteminresponse_json["data"]:company=item["company"]revenue=item["revenue"]# 写入Excel...# JSON转文本存储(用于日志记录)json_text=json.dumps(response_json,ensure_ascii=False,indent=2)

四、流程控制:让报表汇总按顺序执行

批量处理财务报表最核心的是循环和判断。ForEach列表循环用来遍历多个子公司的Excel报表文件。If条件判断用来检查报表数据完整性。

For次数循环:当你知道要处理多少份报表时用这个。比如要合并15个子公司的报表,设置循环次数为15。

拼多多店群自动化报活动上架!

相似元素循环:当你要操作Excel里面的多个相同格式的区域时用这个。比如每个子公司的报表格式都一样,用相似元素循环一次性全部找到并读取。

ForEach列表循环(最常用):

# 从文件夹读取的Excel报表文件列表report_files=["子公司A_2024Q1.xlsx","子公司B_2024Q1.xlsx","子公司C_2024Q1.xlsx"]# ForEach循环遍历forreport_fileinreport_files:# 打开Excel报表excel.open(report_file)# 读取报表数据data=excel.read_all()# 写入合并报表# 关闭Excel报表excel.close()

While条件循环:当你不知道要处理多少份报表时用。比如从一个不断有新报表上传的文件夹里取文件来处理,只要文件夹里还有Excel文件就继续循环。

无限循环:慎用。我曾经写了一个无限循环忘记设退出条件,影刀RPA跑了整整一夜,第二天早上发现电脑卡死,生成了几千份重复的报表。现在我在无限循环里一定加一个计数器和退出条件。

If条件判断

# 检查报表必要字段是否完整ifcompanyandrevenueandcost:# 字段完整,生成报表generate_report()else:# 字段不完整,记录错误日志print("报表数据不完整:company="+str(company))

Try-Catch异常处理:报表生成过程中可能遇到各种意外——Excel模板文件被占用、磁盘空间不足、文件名包含非法字符。用Try-Catch包住核心代码,出错了也不会中断整个流程。

try:# 尝试打开Excel报表excel.open("财务报表模板.xlsx")# 执行数据写入操作excel.write_cell("A1",company_name)# 保存文件excel.save_as(output_path)exceptExceptionase:# 出错了记录日志,但不中断流程print("生成报表失败:"+str(e))

五、财务报表自动汇总实战案例

我要带你做一个真实可用的项目:多Excel合并与数据透视表生成器。需求是从一个文件夹读取多个子公司的Excel报表,然后自动合并成一份集团总表,并生成数据透视表。

Excel报表格式(每个子公司的报表格式相同):

公司名称科目代码科目名称借方金额贷方金额日期
子公司A1001库存现金5000002024-01-01
子公司A1002银行存款20000002024-01-01

合并后报表格式(集团总表):

公司名称科目代码科目名称借方金额贷方金额日期数据来源
子公司A1001库存现金5000002024-01-01手工录入
子公司B1002银行存款20000002024-01-01系统导入

影刀RPA流程设计

第一步:用"文件循环"指令遍历文件夹里的所有Excel文件。勾选"仅匹配扩展名",填写".xlsx,.xls"。

第二步:在循环内部,用"启动Excel"指令打开当前遍历到的Excel文件。

第三步:用"读取Excel内容"指令把数据读到变量report_data里。

第四步:用"启动Excel"指令打开集团总表(合并后的报表)。

第五步:用"写入Excel内容"指令把report_data写入集团总表。

第六步:用"关闭Excel"指令关闭所有打开的Excel文件。

第七步:用"Excel-创建数据透视表"指令,基于集团总表的数据创建数据透视表。

真实报错处理

报错1:Can not convert Array to String(无法将数组转换为字符串)
原因:Excel读取的某一列数据包含合并单元格,读出来是个数组不是单个值。
解决:在读取Excel内容后,用"列表转换为文本"指令,分隔符用逗号,把数组转成字符串。

报错2:文件已被另一个进程使用
原因:上一次循环没关闭Excel文件,这一次要打开同一个文件时被占用。
解决:每次循环结束前,用"关闭Excel"指令关闭所有Excel文件。或者用Try-Catch包住打开文件的指令,出错时先关闭所有Excel进程再重试。

报错3:SaveAs方法失败
原因:保存路径包含Windows非法字符(/ \ : * ? " < > |)。
解决:保存前用"文本替换"指令,把非法字符替换成下划线或横线。

# 清理文件名中的非法字符importre clean_filename=re.sub(r'[\\/*?:<>|]','_',original_filename)

报错4:数据透视表字段无效
原因:创建数据透视表时,指定的行字段、列字段、值字段在数据源中不存在。
解决:在创建数据透视表前,先用"Excel-获取所有列名"指令获取数据源的所有列名,然后检查要使用的字段是否在列名列表中。

六、数据透视表:让财务数据会说话

数据透视表是Excel里最强大的数据分析工具。影刀RPA可以自动创建数据透视表,让你的财务数据自动汇总、分类、计算。

创建数据透视表
用"Excel-创建数据透视表"指令,指定数据源范围和透视表放置位置。然后设置行字段、列字段、值字段。

# 创建数据透视表(在影刀RPA的"Excel-创建数据透视表"指令里配置)# 数据源:Sheet1的A1:F1000# 透视表位置:Sheet2的A1# 行字段:公司名称、科目名称# 列字段:(无)# 值字段:借方金额(求和)、贷方金额(求和)

设置数据透视表字段
用"Excel-设置数据透视表字段"指令,可以动态修改数据透视表的行字段、列字段、值字段、筛选字段。

# 动态修改值字段的计算方式# 默认是"求和",可以改成"计数"、"平均值"、"最大值"、"最小值"等# 在影刀RPA的"Excel-设置数据透视表字段"指令里配置

刷新数据透视表
当数据源发生变化时,数据透视表不会自动更新。用"Excel-刷新数据透视表"指令可以手动刷新。

# 刷新所有数据透视表# 在影刀RPA的"Excel-刷新数据透视表"指令里,选择"刷新所有透视表"

七、多Excel合并:让分散的数据集中起来

除了合并多个子公司的报表,有时还需要合并同一个月的多张 sheet 页,或者合并多个工作簿的相同格式的数据。

合并多个工作簿
用"文件循环"指令遍历文件夹里的所有Excel文件,然后用"Excel-读取"指令读取每个文件的数据,最后用"Excel-写入"指令写入合并后的文件。

合并多个工作表
用"Excel-获取所有工作表名称"指令获取当前工作簿的所有工作表名称,然后用ForEach循环遍历每个工作表,读取数据并合并。

# 合并当前工作簿的所有工作表sheet_names=excel.get_sheet_names()forsheet_nameinsheet_names:# 切换到工作表excel.switch_sheet(sheet_name)# 读取数据data=excel.read_all()# 写入合并表...

合并时的常见坑

坑1:每个Excel文件的列顺序不一样。有的文件"公司名称"在第2列,有的在第1列。解决办法是在读取前先用"Excel-获取所有列名"指令获取列名,然后根据列名而不是列序号来读取数据。

坑2:每个Excel文件的sheet名称不一样。有的叫"Sheet1",有的叫"数据"。解决办法是指定读取"第一个Sheet",不管它叫什么名字。

坑3:数据格式不一致。有的文件金额是数字格式,有的是文本格式(带"¥"符号)。解决办法是在读取后统一做数据清洗,把文本格式的金额转换成数字格式。

# 清洗金额数据(移除"¥"符号和逗号)importredefclean_amount(amount_str):ifisinstance(amount_str,str):# 移除"¥"符号和逗号clean_str=re.sub(r'[¥,]','',amount_str)# 转换成floatreturnfloat(clean_str)else:returnfloat(amount_str)# 应用到每一行数据forrowindata:row[3]=clean_amount(row[3])# 借方金额row[4]=clean_amount(row[4])# 贷方金额

八、自动发邮件:让报表自动送达

财务报表生成完之后,通常需要通过邮件发送给财务总监、各子公司财务负责人等相关人员。影刀RPA可以自动发送邮件,并把生成的报表作为附件。

邮件配置
用"发送邮件"指令,填写SMTP服务器信息、发件人邮箱、收件人邮箱、主题、正文、附件等。

# 邮件配置(在影刀RPA的"发送邮件"指令里填写)# SMTP服务器:smtp.qq.com(QQ邮箱)# 端口:465(SSL加密)# 发件人:your_email@qq.com# 授权码:在QQ邮箱设置里获取(不是邮箱密码)# 收件人:finance_director@company.com(财务总监)# 抄送:subsidiary_finance@company.com(各子公司财务负责人)# 主题:{}季度财务报表 - 请查收# 正文:尊敬的领导,附件为{}季度财务报表,请查收并审阅。如有疑问,请随时联系我。# 附件:D:/报表/财务报表_{quarter}.xlsx

邮件发送的常见坑

坑1:授权码填写错误。很多人把邮箱密码填到授权码字段里,导致发送失败。解决办法是到邮箱设置里获取正确的授权码(QQ邮箱、163邮箱、126邮箱都需要手动开启SMTP服务并获取授权码)。

坑2:收件人邮箱格式错误。如果有多个收件人,要用分号";"分隔,不能用逗号。解决办法是用"文本分割"指令把收件人列表转换成用分号分隔的字符串。

坑3:附件路径错误。附件路径必须是绝对路径,不能用相对路径。解决办法是用"文件路径拼接"指令把相对路径转换成绝对路径。

importos# 相对路径转绝对路径relative_path="./报表/财务报表.xlsx"absolute_path=os.path.abspath(relative_path)# 多个收件人用分号分隔recipients=["user1@company.com","user2@company.com"]recipients_str=";".join(recipients)

九、数据处理:Excel公式在财务中的应用

财务报表中经常需要用Excel公式来做计算。影刀RPA可以在写入数据的同时写入Excel公式,让报表自动计算。

常用财务公式

  1. SUM函数(求和):
=SUM(D2:D100)

计算D2到D100单元格的总和(比如借方金额合计)。

  1. IF函数(条件判断):
=IF(D2>E2, "盈利", "亏损")

如果借方金额大于贷方金额,显示"盈利",否则显示"亏损"。

  1. VLOOKUP函数(查找匹配):
=VLOOKUP(A2, 科目映射表!A:B, 2, FALSE) [video(video-rlkPgdC7-1783008146010)(type-csdn)(url-https://live.csdn.net/v/embed/526817)(image-https://v-blog.csdnimg.cn/asset/1d3c3709da119dd8c13ab01e9b282520/cover/Cover0.jpg)(title-TEMU店群矩阵自动化运营核价报活动)]

在"科目映射表"工作表中查找A2单元格的值,返回对应的科目名称。

  1. SUMIF函数(条件求和):
=SUMIF(A:A, "子公司A", D:D)

对A列等于"子公司A"的所有行,求D列的总和。

  1. 数据透视表相关公式
=GETPIVOTDATA("借方金额", '数据透视表'!A1, "公司名称", "子公司A")

从数据透视表中提取"子公司A"的"借方金额"合计。

在影刀RPA中写入公式
用"Excel-写入单元格"指令,在写入内容前加一个等号"=",影刀RPA会自动识别为公式。

# 写入SUM公式excel.write_cell("D101","=SUM(D2:D100)")# 写入IF公式excel.write_cell("G2",'=IF(D2>E2, "盈利", "亏损")')# 写入VLOOKUP公式(注意引号要用双引号,或者直接写英文引号)excel.write_cell("C2",'=VLOOKUP(A2, 科目映射表!A:B, 2, FALSE)')

十、进阶技能:Python协同处理Excel

影刀RPA内置了Python环境,可以直接调用Python的第三方库来处理Excel。最常用的是openpyxl库(处理xlsx格式)和xlrd/xlwt库(处理xls格式)。

安装openpyxl库
在影刀RPA的"Python-执行代码"指令里,先用pip安装库:

importsubprocess subprocess.check_call(['pip','install','openpyxl'])

用openpyxl合并多个Excel文件

fromopenpyxlimportload_workbook,Workbook# 创建一个新的工作簿(合并后的报表)merged_wb=Workbook()merged_ws=merged_wb.active merged_ws.title="合并报表"# 写入表头headers=["公司名称","科目代码","科目名称","借方金额","贷方金额","日期"]merged_ws.append(headers)# 遍历所有子公司的报表report_files=["子公司A.xlsx","子公司B.xlsx","子公司C.xlsx"]forreport_fileinreport_files:# 打开子公司报表wb=load_workbook(report_file)ws=wb.active# 读取数据(跳过表头)forrowinws.iter_rows(min_row=2,values_only=True):# 写入合并报表merged_ws.append(row)# 保存合并后的报表merged_wb.save("合并报表.xlsx")

用openpyxl创建数据透视表
很遗憾,openpyxl库不支持创建数据透视表。要实现这个功能,可以调用win32com库(需要安装Microsoft Excel软件)。

importwin32com.clientaswin32# 启动Excelexcel=win32.Dispatch("Excel.Application")excel.Visible=True# 可视化运行# 打开工作簿wb=excel.Workbooks.Open("合并报表.xlsx")ws=wb.ActiveSheet# 创建数据透视表缓存pivot_cache=wb.PivotCaches.Create(SourceType=1,# xlDatabaseSourceData=ws.UsedRange)# 创建数据透视表pivot_table=pivot_cache.CreatePivotTable(TableDestination="Sheet2!R1C1",TableName="数据透视表")# 设置行字段pivot_table.PivotFields("公司名称").Orientation=1# xlRowFieldpivot_table.PivotFields("科目名称").Orientation=1# xlRowField# 设置值字段pivot_table.AddDataField(pivot_table.PivotFields("借方金额"))pivot_table.AddDataField(pivot_table.PivotFields("贷方金额"))# 保存并关闭wb.Save()wb.Close()excel.Quit()

十一、系统联动:飞书通知与定时任务

财务报表生成完并发送邮件后,通常需要通知相关人员。影刀RPA可以对接飞书,自动发送消息通知。

飞书消息通知配置
用"飞书-发送消息"指令,填写应用App ID和App Secret,然后填写接收人的open_id和消息内容。

财务报表生成完成通知: 共合并报表 15 份 生成数据透视表 3 个 保存路径:D:/报表/ 生成时间:2024-01-01 10:30:00

飞书多维表格记录财务数据
每次生成报表后,把关键财务数据写到飞书多维表格里,方便后续跟踪和分析。用"飞书多维表格-添加记录"指令,填写表格ID和字段值。

定时任务配置
如果要每月1号自动生成上个月的财务报表,用"定时任务"指令。设置触发方式为"按CRON表达式",比如"0 9 1 * *"表示每月1号早上9点执行。

# CRON表达式格式:分 时 日 月 周# 每月1号早上9点执行cron_expression="0 9 1 * *"# 每周一早上9点执行cron_expression="0 9 * * 1"# 每天早上9点执行cron_expression="0 9 * * *"

定时任务的常见坑

坑1:CRON表达式写错。比如想设置"每月1号执行",写成了"1 9 * * *",这会让程序每天9点01分执行,而不是每月1号执行。

坑2:时区设置错误。影刀RPA的定时任务默认使用北京时间(Asia/Shanghai),如果你的公司在其他时区,需要手动修改时区设置。

坑3:任务执行失败没有通知。如果定时任务执行失败,默认不会发送通知。解决办法是在流程开头和结尾加上"飞书-发送消息"指令,执行成功或失败时都发送通知。

十二、工程化与规范

当你写的流程超过50条指令时,一定要做子流程封装。我把财务报表汇总流程拆成了5个子流程:读取Excel配置、合并多个Excel文件、创建数据透视表、发送邮件通知、记录执行日志。每个子流程负责一个独立的功能,主流程只需要按顺序调用这5个子流程。

子流程封装与参数传递
子流程可以定义输入参数和输出参数。比如"合并Excel文件"子流程,输入参数是folder_path(文件夹路径)和file_pattern(文件匹配模式),输出参数是merged_file_path(合并后的文件路径)和success(是否成功)。

调试技巧
我第一次写完财务报表汇总流程,运行时在第五条指令就报错了。后来学会了打断点调试:在可能出错的指令前点一下行号,出现橙色圆点就是断点。运行到断点时会暂停,这时可以在下方的调试变量面板看到所有变量的值。

命名规范
指令的命名要能看懂是干什么的。比如不要叫"指令1"、“指令2”,要叫"启动Excel读取配置文件"、“打开集团总表”、“写入合并数据”、“创建数据透视表”。变量名也要有意义,不要叫a、b、c,要叫report_folder_path、merged_file_path、pivot_table_sheet_name。

版本选择
社区版免费但有指令数限制(最多100条指令),适合学习和个人使用。创业版和企业版没有指令数限制,支持调度API、多人协作、版本管理。如果你要做的财务报表汇总流程指令数会超过100条,建议直接上创业版。

常见报错速查表

报错信息原因解决方法
AttributeError: ‘NoneType’ object has no attribute ‘get_active_sheet’Excel对象为None,没有成功启动Excel检查Excel文件路径是否正确,文件是否被占用
Can not convert Array to StringExcel某单元格是数组不是单个值用"列表转换为文本"指令转换
SaveAs方法失败文件名包含Windows非法字符替换掉/😗?"<>
文件已被另一个进程使用Excel文件被占用未关闭每次循环结束前关闭Excel文件
KeyError: ‘公司名称’字典里没有’公司名称’这个键用dict.get(‘公司名称’,默认值)方式安全取值
数据透视表字段无效指定的字段在数据源中不存在先获取所有列名,检查字段是否存在
SMTPAuthenticationError邮箱授权码错误到邮箱设置里重新获取授权码

#影刀RPA #财务报表 #Excel合并 #数据透视表 #RPA教程 #新手入门 #自动化办公 #财务报表自动化 #邮件自动发送

作者:林焱

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询