影刀RPA 用友ERP自动化实战:凭证录入与报表导出
作者:林焱
写在前面
用友U8、用友NC、用友T+是国内中小企业用得最多的ERP系统。财务对账、凭证录入、月末报表这些工作,重复度极高,影刀可以接管。
本文聚焦实战,讲清楚用友ERP的桌面自动化核心技术和三个真实场景。
一、用友ERP的界面特点
用友U8/NC是基于Java Swing或.NET的桌面程序,特点:
- 控件是标准Windows控件:大多数输入框、按钮可以直接用影刀捕获
- 表格控件特殊:用友的录入表格是自定义控件,不能用标准"点击单元格"指令
- 快捷键是操控核心:用友大量功能依赖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):"""点击表格中指定行、列偏移处的单元格"""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# 保存后验证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自动化的三把钥匙:
- Tab键是主角:字段切换靠Tab,比点击可靠
- 图像识别做导航:找按钮、菜单用图像识别,比坐标更稳
- 等待要充足:用友响应慢,每步操作后留0.5-1秒等待
财务场景下凭证录入出错的成本很高,一定要做好日志和异常截图,出问题了能快速定位是哪行数据、哪个步骤出了问题。
署名:林焱