影刀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):点击表格中指定行、列偏移处的单元格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# 保存后验证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秒等待财务场景下凭证录入出错的成本很高一定要做好日志和异常截图出问题了能快速定位是哪行数据、哪个步骤出了问题。署名林焱