影刀RPA 用友ERP自动化实战:凭证录入与报表导出
影刀RPA 用友ERP自动化实战凭证录入与报表导出作者林焱写在前面用友U8、用友NC、用友T是国内中小企业用得最多的ERP系统。财务对账、凭证录入、月末报表这些工作重复度极高影刀可以接管。本文聚焦实战讲清楚用友ERP的桌面自动化核心技术和三个真实场景。一、用友ERP的界面特点用友U8/NC是基于Java Swing或.NET的桌面程序特点控件是标准Windows控件大多数输入框、按钮可以直接用影刀捕获表格控件特殊用友的录入表格是自定义控件不能用标准点击单元格指令快捷键是操控核心用友大量功能依赖Tab键切换字段、Enter确认、F9查询捕获用友控件时用桌面应用元素捕获捕获成功率约70%。剩下30%主要是凭证录入表格需要用坐标操作 快捷键配合。店群矩阵自动化突破运营极限二、关键操作技巧技巧1Tab键驱动录入用友凭证录入的核心是Tab键流转字段影刀用发送按键指令点击[凭证日期输入框] 输入文本 → 2024-01-15 发送按键 → Tab (跳到下一字段) 输入文本 → 100 (金额) 发送按键 → Tab 输入文本 → 1001 (科目代码) 发送按键 → Enter (确认并跳到下一行)技巧2科目查询弹窗处理录入科目代码后用友会弹出科目查询窗口。判断是否弹出importtimeimportpyautogui time.sleep(0.5)# 等待可能的弹窗# 截图识别标题栏是否有科目查询screenshotpyautogui.screenshot()# 用影刀OCR识别截图# 如果出现弹窗发送Enter或ESC处理更可靠的方式直接输入完整科目编码确保编码正确大多数情况下不会触发弹窗。技巧3坐标定位表格行用友录入表格的每行高度相对固定一般18-22像素。定位第N行的公式# 获取表格起始坐标手动测量一次table_start_x150# 表格第一列起始Xtable_start_y320# 表格第一行起始Yrow_height20# 每行高度测量得到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)xtable_start_xcol_offset ytable_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_fieldpyautogui.locateOnScreen(uf_date_field.png,confidence0.8)ifdate_field:pyautogui.click(date_field)pyautogui.hotkey(ctrl,a)pyautogui.typewrite(date,interval0.05)pyautogui.press(tab)# 录入借方行# 摘要pyautogui.typewrite(summary,interval0.03)pyautogui.press(tab)# 科目pyautogui.typewrite(debit_account,interval0.05)pyautogui.press(tab)# 借方金额pyautogui.typewrite(str(debit_amount),interval0.05)pyautogui.press(tab)pyautogui.press(tab)# 跳过贷方金额列# 换行录入贷方pyautogui.press(enter)pyautogui.typewrite(summary,interval0.03)pyautogui.press(tab)pyautogui.typewrite(credit_account,interval0.05)pyautogui.press(tab)pyautogui.press(tab)# 跳过借方金额列pyautogui.typewrite(str(credit_amount),interval0.05)# 保存凭证pyautogui.hotkey(ctrl,s)time.sleep(1)# 检查是否弹出确认框confirmpyautogui.locateOnScreen(uf_confirm_btn.png,confidence0.8)ifconfirm:pyautogui.click(confirm)# 读取Excel执行批量录入wbopenpyxl.load_workbook(费用凭证.xlsx)wswb.active success_count0fail_count0fori,rowinenumerate(ws.iter_rows(min_row2,values_onlyTrue),start2):date,summary,debit_acc,debit_amt,credit_acc,credit_amtrowtry:input_voucher(str(date),summary,debit_acc,debit_amt,credit_acc,credit_amt)success_count1print(f第{i}行录入成功)time.sleep(0.5)exceptExceptionase:fail_count1print(f第{i}行录入失败{e})# 截图记录现场pyautogui.screenshot(ferror_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_menupyautogui.locateOnScreen(uf_report_menu.png,confidence0.85)ifreport_menu:pyautogui.click(report_menu)time.sleep(1)# 找到对应报表target_reportpyautogui.locateOnScreen(fuf_{report_name}.png,confidence0.80)iftarget_report:pyautogui.doubleClick(target_report)time.sleep(2)# 设置期间period_fieldpyautogui.locateOnScreen(uf_period_field.png,confidence0.8)ifperiod_field:pyautogui.click(period_field)pyautogui.hotkey(ctrl,a)pyautogui.typewrite(period,interval0.05)pyautogui.press(enter)time.sleep(2)# 导出文件 → 另存为 → Excelpyautogui.hotkey(alt,f)# 打开文件菜单time.sleep(0.5)pyautogui.press(a)# 另存为time.sleep(1)# 文件名save_dialogpyautogui.locateOnScreen(uf_save_dialog.png,confidence0.8)ifsave_dialog:filename_fieldpyautogui.locateOnScreen(uf_filename_input.png,confidence0.8)iffilename_field:pyautogui.click(filename_field)pyautogui.hotkey(ctrl,a)pyautogui.typewrite(save_path,interval0.03)pyautogui.press(enter)time.sleep(1)print(f报表已导出{report_name}→{save_path})五、稳定性保障策略temu店群自动化报活动案例用友自动化容易不稳定几个关键保障措施1. 状态验证不盲目操作每一步操作后验证是否成功defverify_operation(expected_image,timeout5):等待预期界面出现starttime.time()whiletime.time()-starttimeout:ifpyautogui.locateOnScreen(expected_image,confidence0.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,timeout5):raiseException(保存凭证失败界面未出现成功提示)2. 出错时截图留底importdatetimedeftake_error_screenshot(step_name):timestampdatetime.datetime.now().strftime(%Y%m%d_%H%M%S)filenameferror_{step_name}_{timestamp}.pngpyautogui.screenshot(filename)print(f错误截图已保存{filename})3. 定期重启保持新鲜用友长时间运行后容易卡顿建议每处理100条凭证后退出并重新登录用友消除内存积累。总结用友ERP自动化的三把钥匙Tab键是主角字段切换靠Tab比点击可靠图像识别做导航找按钮、菜单用图像识别比坐标更稳等待要充足用友响应慢每步操作后留0.5-1秒等待财务场景下凭证录入出错的成本很高一定要做好日志和异常截图出问题了能快速定位是哪行数据、哪个步骤出了问题。署名林焱

相关新闻

二维小波变换C++实现:从原理到图像处理实战

二维小波变换C++实现:从原理到图像处理实战

1. 项目概述:为什么二维小波变换值得深挖?如果你在图像处理或信号分析领域摸爬滚打过一阵子,肯定对傅里叶变换不陌生。它能告诉你信号里有哪些频率成分,但有个致命短板:它没法告诉你这些频率成分是在什么时候出现的。比…

2026/10/28 15:37:08 阅读更多 →
Dify API Base URL 填到 /v1 后 404?先拆开 /v1/chat-messages

Dify API Base URL 填到 /v1 后 404?先拆开 /v1/chat-messages

Dify API Base URL 填到 /v1 后 404?先拆开 /v1/chat-messages 调用 Dify 应用 API 时,如果返回 404 Not Found,很多人会先换 API Key、模型,甚至重启整套 Docker。对于路径配置错误,最快的检查其实只有一个&#xff…

2026/10/28 15:37:08 阅读更多 →
亲密关系暴力:危险信号识别与心理干预策略

亲密关系暴力:危险信号识别与心理干预策略

1. 亲密关系暴力中的危险信号识别与应对 "她被男朋友咬掉鼻子却求法官宽恕他,一年后惨死于他刀下"这个标题揭示了一个令人痛心的现实——亲密关系暴力(Intimate Partner Violence, IPV)的恶性循环。作为长期关注家庭暴力干预的社会…

2026/11/1 11:20:17 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/3 1:09:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/2 10:46:11 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/2 10:47:40 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/3 2:27:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/2 10:46:31 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/2 10:46:26 阅读更多 →

日新闻

周新闻

月新闻