影刀RPA 用友ERP自动化实战:凭证录入与报表导出
2026/7/21 6:22:23 网站建设 项目流程

影刀RPA 用友ERP自动化实战:凭证录入与报表导出

作者:林焱


写在前面

用友U8、用友NC、用友T+是国内中小企业用得最多的ERP系统。财务对账、凭证录入、月末报表这些工作,重复度极高,影刀可以接管。

本文聚焦实战,讲清楚用友ERP的桌面自动化核心技术和三个真实场景。


一、用友ERP的界面特点

用友U8/NC是基于Java Swing或.NET的桌面程序,特点:

  1. 控件是标准Windows控件:大多数输入框、按钮可以直接用影刀捕获
  2. 表格控件特殊:用友的录入表格是自定义控件,不能用标准"点击单元格"指令
  3. 快捷键是操控核心:用友大量功能依赖Tab键切换字段、Enter确认、F9查询

捕获用友控件时,用"桌面应用元素捕获",捕获成功率约70%。剩下30%(主要是凭证录入表格)需要用坐标操作 + 快捷键配合。


店群矩阵自动化突破运营极限!

二、关键操作技巧

技巧1:Tab键驱动录入

用友凭证录入的核心是Tab键流转字段,影刀用"发送按键"指令:

点击[凭证日期输入框] 输入文本 → 2024-01-15 发送按键 → Tab (跳到下一字段) 输入文本 → 100 (金额) 发送按键 → Tab 输入文本 → 1001 (科目代码) 发送按键 → Enter (确认并跳到下一行)

技巧2:科目查询弹窗处理

录入科目代码后,用友会弹出"科目查询"窗口。判断是否弹出:

importtimeimportpyautogui time.sleep(0.5)# 等待可能的弹窗# 截图识别标题栏是否有"科目查询"screenshot=pyautogui.screenshot()# 用影刀OCR识别截图# 如果出现弹窗,发送Enter或ESC处理

更可靠的方式:直接输入完整科目编码(确保编码正确),大多数情况下不会触发弹窗。

技巧3:坐标定位表格行

用友录入表格的每行高度相对固定(一般18-22像素)。定位第N行的公式:

# 获取表格起始坐标(手动测量一次)table_start_x=150# 表格第一列起始Xtable_start_y=320# 表格第一行起始Yrow_height=20# 每行高度(测量得到)defclick_cell(row,col_offset):"""点击表格中指定行、列偏移处的单元格"""![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8eb4fa863a144423aac5a051d7a11b61.png#pic_center)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e2c8283f0d244aa5a770c7e5ac58aeb3.png#pic_center)x=table_start_x+col_offset y=table_start_y+(row-1)*row_height pyautogui.click(x,y)time.sleep(0.2)

三、实战案例一:批量录入记账凭证

场景:每月有300-500条费用报销凭证,从Excel导入用友。

Excel格式
| 日期 | 摘要 | 借方科目 | 借方金额 | 贷方科目 | 贷方金额 |

流程设计

importopenpyxlimportpyautoguiimporttimedefinput_voucher(date,summary,debit_account,debit_amount,credit_account,credit_amount):"""录入一张凭证"""# 点击"新增"按钮pyautogui.hotkey('alt','a')# 用友新增快捷键time.sleep(0.5)# 录入日期date_field=pyautogui.locateOnScreen('uf_date_field.png',confidence=0.8)ifdate_field:pyautogui.click(date_field)pyautogui.hotkey('ctrl','a')pyautogui.typewrite(date,interval=0.05)pyautogui.press('tab')# 录入借方行# 摘要pyautogui.typewrite(summary,interval=0.03)pyautogui.press('tab')# 科目pyautogui.typewrite(debit_account,interval=0.05)pyautogui.press('tab')# 借方金额pyautogui.typewrite(str(debit_amount),interval=0.05)pyautogui.press('tab')pyautogui.press('tab')# 跳过贷方金额列# 换行录入贷方pyautogui.press('enter')pyautogui.typewrite(summary,interval=0.03)pyautogui.press('tab')pyautogui.typewrite(credit_account,interval=0.05)pyautogui.press('tab')pyautogui.press('tab')# 跳过借方金额列pyautogui.typewrite(str(credit_amount),interval=0.05)# 保存凭证pyautogui.hotkey('ctrl','s')time.sleep(1)# 检查是否弹出确认框confirm=pyautogui.locateOnScreen('uf_confirm_btn.png',confidence=0.8)ifconfirm:pyautogui.click(confirm)# 读取Excel执行批量录入wb=openpyxl.load_workbook("费用凭证.xlsx")ws=wb.active success_count=0fail_count=0fori,rowinenumerate(ws.iter_rows(min_row=2,values_only=True),start=2):date,summary,debit_acc,debit_amt,credit_acc,credit_amt=rowtry:input_voucher(str(date),summary,debit_acc,debit_amt,credit_acc,credit_amt)success_count+=1print(f"第{i}行录入成功")time.sleep(0.5)exceptExceptionase:fail_count+=1print(f"第{i}行录入失败:{e}")# 截图记录现场pyautogui.screenshot(f"error_row_{i}.png")print(f"完成:成功{success_count}条,失败{fail_count}条")

四、实战案例二:月末报表自动导出

场景:每月末需要从用友导出"资产负债表"、"利润表"到Excel,发给老板。

defexport_financial_report(report_name,period,save_path):""" 从用友导出财务报表 report_name: 报表名称(如"资产负债表") period: 期间(如"202401") save_path: 保存路径 """# 打开报表模块(根据实际菜单调整)report_menu=pyautogui.locateOnScreen('uf_report_menu.png',confidence=0.85)ifreport_menu:pyautogui.click(report_menu)time.sleep(1)# 找到对应报表target_report=pyautogui.locateOnScreen(f'uf_{report_name}.png',confidence=0.80)iftarget_report:pyautogui.doubleClick(target_report)time.sleep(2)# 设置期间period_field=pyautogui.locateOnScreen('uf_period_field.png',confidence=0.8)ifperiod_field:pyautogui.click(period_field)pyautogui.hotkey('ctrl','a')pyautogui.typewrite(period,interval=0.05)pyautogui.press('enter')time.sleep(2)# 导出:文件 → 另存为 → Excelpyautogui.hotkey('alt','f')# 打开文件菜单time.sleep(0.5)pyautogui.press('a')# 另存为time.sleep(1)# 文件名save_dialog=pyautogui.locateOnScreen('uf_save_dialog.png',confidence=0.8)ifsave_dialog:filename_field=pyautogui.locateOnScreen('uf_filename_input.png',confidence=0.8)iffilename_field:pyautogui.click(filename_field)pyautogui.hotkey('ctrl','a')pyautogui.typewrite(save_path,interval=0.03)pyautogui.press('enter')time.sleep(1)print(f"报表已导出:{report_name}{save_path}")

五、稳定性保障策略

temu店群自动化报活动案例

用友自动化容易不稳定,几个关键保障措施:

1. 状态验证,不盲目操作

每一步操作后验证是否成功:

defverify_operation(expected_image,timeout=5):"""等待预期界面出现"""start=time.time()whiletime.time()-start<timeout:ifpyautogui.locateOnScreen(expected_image,confidence=0.8):returnTruetime.sleep(0.5)returnFalse![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/dceaf2c3c8df4fa7b1e1f970957249fb.png#pic_center)# 保存后验证pyautogui.hotkey('ctrl','s')ifnotverify_operation('uf_save_success.png',timeout=5):raiseException("保存凭证失败,界面未出现成功提示")

2. 出错时截图留底

importdatetimedeftake_error_screenshot(step_name):timestamp=datetime.datetime.now().strftime("%Y%m%d_%H%M%S")filename=f"error_{step_name}_{timestamp}.png"pyautogui.screenshot(filename)print(f"错误截图已保存:{filename}")

3. 定期重启保持新鲜

用友长时间运行后容易卡顿,建议每处理100条凭证后,退出并重新登录用友,消除内存积累。


总结

用友ERP自动化的三把钥匙:

  1. Tab键是主角:字段切换靠Tab,比点击可靠
  2. 图像识别做导航:找按钮、菜单用图像识别,比坐标更稳
  3. 等待要充足:用友响应慢,每步操作后留0.5-1秒等待

财务场景下凭证录入出错的成本很高,一定要做好日志和异常截图,出问题了能快速定位是哪行数据、哪个步骤出了问题。

署名:林焱

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

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

立即咨询