告别手动点点点:用Python+pywinauto/pyautogui打造Windows自动化神器
每天早晨9点,财务部的张磊都要重复同样的操作:打开ERP系统、登录账号、导出前一天的销售报表,再用Excel整理格式,最后邮件发送给部门主管。这套流程至少占用他30分钟,而这样的机械性任务在企业中比比皆是。如果你也厌倦了当"人肉机器人",Python的pywinauto和pyautogui这对黄金组合,能让你用代码解放双手。本文将手把手带你实现一个真实办公场景的自动化方案——自动登录企业微信并导出日报数据。
1. 环境配置与工具准备
工欲善其事,必先利其器。在开始编写自动化脚本前,需要搭建合适的开发环境。推荐使用Python 3.8+版本,这个版本在Windows平台具有最好的兼容性表现。
必备工具包安装:
pip install pywinauto pyautogui openpyxl提示:若安装速度慢,可添加
-i https://pypi.tuna.tsinghua.edu.cn/simple使用国内镜像源
安装完成后,强烈建议准备以下辅助工具:
- Inspect.exe:Windows SDK自带的UI元素查看器(位于
C:\Program Files (x86)\Windows Kits\10\bin\10.0.xxxxx.0\x64) - 截图工具:用于捕捉需要操作的界面元素
- 延迟计时器:测量每个操作步骤的合理等待时间
验证安装是否成功:
import pywinauto import pyautogui print(pywinauto.__version__, pyautogui.__version__) # 应输出版本号2. 自动化核心原理与双模块协作
理解pywinauto和pyautogui的分工是设计高效脚本的关键。这两个库各有所长:
| 功能 | pywinauto优势 | pyautogui优势 |
|---|---|---|
| 窗口控制 | 通过句柄精准操作窗口 | 无差别屏幕坐标操作 |
| 元素定位 | 支持控件树遍历和属性匹配 | 依赖图像识别和坐标定位 |
| 执行效率 | 直接调用Windows API响应快 | 需要模拟真实操作稍慢 |
| 适用场景 | 标准Windows程序(如记事本、WPS) | 游戏、无控件接口的古老程序 |
在实际项目中,我通常采用混合策略:
- 优先使用
pywinauto操作标准窗口控件 - 对无法识别的元素改用
pyautogui图像定位 - 复杂流程中穿插
sleep()保证操作稳定性
# 典型混合使用示例 from pywinauto import Application import pyautogui import time app = Application(backend="uia").start("wechatwork.exe") main_win = app.window(title="企业微信") main_win["导出按钮"].click() # pywinauto操作标准按钮 time.sleep(1) pyautogui.click("save_icon.png") # 图像识别点击保存图标3. 实战:企业微信日报自动化系统
让我们实现一个完整的日报处理流程,包含以下功能:
- 自动登录企业微信
- 导航至日报模块
- 导出昨日数据
- 使用Excel自动整理格式
- 邮件发送结果
3.1 自动登录流程实现
首先创建应用连接,注意企业微信这类现代应用需指定backend="uia":
def wechat_login(username, password): app = Application(backend="uia").start(r"C:\Program Files\WXWork\WXWork.exe") login_win = app.window(title="企业微信") # 输入凭据 login_win["Edit1"].set_text(username) # 用户名输入框 login_win["Edit2"].set_text(password) # 密码输入框 # 处理可能的验证码 if login_win["验证码"].exists(): captcha = input("请输入验证码:") login_win["Edit3"].set_text(captcha) login_win["登录"].click() return app注意:实际控件名称需用Inspect工具查看,不同版本可能不同
3.2 日报导出与数据处理
成功登录后,操作界面元素导出数据:
def export_daily_report(app): main_win = app.window(title="企业微信") main_win["工作台"].click() main_win["日报"].click() # 切换到最新打开的日报窗口 report_win = app.window(title_re=".*日报.*") report_win["导出"].click() # 处理文件保存对话框 save_dlg = app.window(title="另存为") save_dlg["文件名"].set_text("daily_report.xlsx") save_dlg["保存"].click() # 等待导出完成 while not os.path.exists("daily_report.xlsx"): time.sleep(0.5)然后用openpyxl自动美化Excel:
def format_excel_report(): from openpyxl import load_workbook from openpyxl.styles import Font, Alignment wb = load_workbook("daily_report.xlsx") ws = wb.active # 设置标题样式 for row in ws.iter_rows(max_row=1): for cell in row: cell.font = Font(bold=True, color="FF0000") cell.alignment = Alignment(horizontal="center") # 自动调整列宽 for col in ws.columns: max_length = max(len(str(cell.value)) for cell in col) ws.column_dimensions[col[0].column_letter].width = max_length + 2 wb.save("formatted_report.xlsx")4. 高级技巧与避坑指南
在实际企业环境中,你可能会遇到这些典型问题:
4.1 界面元素定位失败解决方案
场景:更新后按钮ID变化导致脚本失效
应对策略:
- 使用模糊匹配定位元素:
# 通过部分标题匹配 app.window(title_contains="导出")- 结合图像识别:
# 先定位大致区域再精确点击 export_pos = pyautogui.locateOnScreen("export_btn.png") pyautogui.click(export_pos)4.2 多显示器环境适配
在双屏办公场景中,坐标系统会发生变化:
# 获取主显示器分辨率 primary_w, primary_h = pyautogui.size() # 将操作限制在主显示器 pyautogui.moveTo(100, 100) # 始终相对于主显示器左上角4.3 异常处理与日志记录
健壮的脚本需要完善的错误处理:
import logging logging.basicConfig(filename='automation.log', level=logging.INFO) try: app = Application().connect(title="企业微信") except Exception as e: logging.error(f"连接失败:{str(e)}") # 尝试重启应用 os.system("taskkill /f /im WXWork.exe") app = Application().start(r"C:\Program Files\WXWork\WXWork.exe")5. 性能优化与扩展思路
当自动化脚本需要处理大量操作时,这些技巧能显著提升效率:
操作加速技巧:
- 禁用
pyautogui的安全延迟:pyautogui.PAUSE = 0.1 # 每个操作后默认暂停0.1秒 - 批量操作时使用
pywinauto的wrapper_object:items = app.window(class_name="ListView").items() for item in items[:10]: # 仅处理前10项 item.double_click()
扩展应用场景:
- 结合Windows任务计划实现定时触发
- 集成Outlook自动发送邮件
- 添加异常监控自动报警功能
在最近的一个客户案例中,通过优化后的脚本将原本需要45分钟的人工操作缩短到3分钟自动完成,准确率达到100%。关键在于充分测试每个步骤的稳定性,并为可能的变化预留调整空间。