iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何使用Python子进程关闭Excel自动化中的弹窗
  • 772
分享到

如何使用Python子进程关闭Excel自动化中的弹窗

2023-06-15 13:06:45 772人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

本篇文章为大家展示了如何使用python子进程关闭excel自动化中的弹窗,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。利用Python进行Excel自动化操作的过程中,尤其是涉及VBA时,可能遇到

本篇文章为大家展示了如何使用python子进程关闭excel自动化中的弹窗,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

利用Python进行Excel自动化操作的过程中,尤其是涉及VBA时,可能遇到消息框/弹窗(MsgBox)。此时需要人为响应,否则代码卡死直至超时 [^1] [^2]。根本的解决方法是VBA代码中不要出现类似弹窗,但有时我们无权修改被操作的Excel文件,例如这是我们进行自动化测试的对象。所以本文记录从代码角度解决此类问题的方法。

假想场景

使用xlwings(或者其他自动化库)打开Excel文件test.xlsm,读取Sheet1!A1单元格内容。很简单的一个操作:

import xlwings as xw  wb = xw.Book('test.xlsm')  msg = wb.sheets('Sheet1').range('A1').value  print(msg)  wb.close()

然而不幸的是,打开工作簿时进行了热情的欢迎仪式:

Private Sub Workbook_Open()      MsgBox "Welcome"      MsgBox "to open"      MsgBox "this file."  End Sub

第一个弹窗Welcome就卡住了Excel,Python代码相应卡死在第一行。

如何使用Python子进程关闭Excel自动化中的弹窗

基本思路

主程序中不可能直接处理或者绕过此类问题,也不能奢望有人随时蹲守点击下一步——那就开启一个子线程来护航吧。因此,解决方案是利用子线程监听并随时关闭弹窗,直到主程序圆满结束。

解决这个问题,需要以下两个知识点(基础知识请课外学习):

  •  Python多线程(本文采用threading.Thread)

  •  Python界面自动化库(本文涉及pywinauto和pywin32)

pywinauto方案

pywinauto顾名思义是windows界面自动化库,模拟鼠标和键盘操作窗体和控件 [^3]。不同于先获取句柄再获取属性的传统方式,pywinauto的api更加友好和pythonic。例如,两行代码搞定窗口捕捉和点击:

from pywinauto.application import Application  win = Application(backend="win32").connect(title='Microsoft Excel')  win.Dialog.Button.click()

本文采用自定义线程类的方式,启动线程后自动执行run()函数来完成上述操作。具体代码如下,注意构造函数中的两个参数:

  •  title 需要捕捉的弹窗的标题,例如Excel默认弹窗的标题为Microsoft Excel

  •  interval 监听的频率,即每隔多少秒检查一次 

# listener.py  import time  from threading import Thread, Event  from pywinauto.application import Application  class MsgBoxListener(Thread):      def __init__(self, title:str, interval:int):          Thread.__init__(self)          self._title = title           self._interval = interval           self._stop_event = Event()         def stop(self): self._stop_event.set()      @property      def is_running(self): return not self._stop_event.is_set()      def run(self):          while self.is_running:              try:                  time.sleep(self._interval)                  self._close_msgbox()              except Exception as e:                  print(e, flush=True)      def _close_msgbox(self):          '''Close the default Excel MsgBox with title "Microsoft Excel".'''                 win = Application(backend="win32").connect(title=self._title)          win.Dialog.Button.click()  if __name__=='__main__':     t = MsgBoxListener('Microsoft Excel', 3)      t.start()      time.sleep(10)      t.stop()

于是,整个过程分为三步:

  •  启动子线程监听弹窗

  •  主线程中打开Excel开始自动化操作

  •  关闭子线程 

import xlwings as xw  from listener import MsgBoxListener  # start listen thread  listener = MsgBoxListener('Microsoft Excel', 3)  listener.start()  # main process as before  wb = xw.Book('test.xlsm')  msg = wb.sheets('Sheet1').range('A1').value  print(msg)  wb.close()  # stop listener thread  listener.stop()

到此问题基本解决,本地运行效果完全达到预期。但我的真实需求是以系统服务方式在服务器上进行Excel文件自动化测试,后续发现,当以系统服务方式运行时,pywinauto竟然捕捉不到弹窗!这或许是pywinauto一个潜在的问题 [^4]。

win32gui方案

那就只好转向相对底层的win32gui,所幸完美解决了上述问题。

win32gui是pywin32库的一部分,所以实际安装命令是:

pip install pywin32

整个方案和前文描述完全一致,只是替换MsgBoxListener类中关闭弹窗的方法:

import win32gui, win32con  def _close_msgbox(self):      # find the top window by title      hwnd = win32gui.FindWindow(None, self._title)      if not hwnd: return      # find child button      h_btn = win32gui.FindWindowEx(hwnd, None,'Button', None)      if not h_btn: return      # show text      text = win32gui.GetWindowText(h_btn)     print(text)      # click button             win32gui.PostMessage(h_btn, win32con.WM_LBUTTONDOWN, None, None)      time.sleep(0.2)      win32gui.PostMessage(h_btn, win32con.WM_LBUTTONUP, None, None)      time.sleep(0.2)

更一般的方案

更一般地,当同时存在默认标题和自定义标题的弹窗时,就不便于采用标题方式进行捕捉了。例如

MsgBox "Message with default title.", vbInfORMation,   MsgBox "Message with title My App 1", vbInformation, "My App 1"  MsgBox "Message with title My App 2", vbInformation, "My App 2"

那就扩大搜索范围,依次点击所有包含确定性描述的按钮(例如OK,Yes,Confirm)来关闭弹窗。同理替换MsgBoxListener类的_close_msgbox()方法(同时构造函数中不再需要title参数):

def _close_msgbox(self):     '''Click any button ("OK", "Yes" or "Confirm") to close message box.'''      # get handles of all top windows      h_windows = []      win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), h_windows)       # check each window          for h_window in h_windows:                   # get child button with text OK, Yes or Confirm of given window          h_btn = win32gui.FindWindowEx(h_window, None,'Button', None)          if not h_btn: continue          # check button text          text = win32gui.GetWindowText(h_btn)          if not text.lower() in ('ok', 'yes', 'confirm'): continue          # click button          win32gui.PostMessage(h_btn, win32con.WM_LBUTTONDOWN, None, None)          time.sleep(0.2)          win32gui.PostMessage(h_btn, win32con.WM_LBUTTONUP, None, None)          time.sleep(0.2)

最后,实例演示结束全文,以后再也不用担心意外弹窗了。

如何使用Python子进程关闭Excel自动化中的弹窗

[^1]: Handling VBA popup message boxes in Microsoft Excel

[^2]: Trying to catch MsgBox text and press button in xlwings

[^3]: What is pywinauto

[^4]: Remote Execution Guide

上述内容就是如何使用Python子进程关闭Excel自动化中的弹窗,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网Python频道。

--结束END--

本文标题: 如何使用Python子进程关闭Excel自动化中的弹窗

本文链接: https://www.lsjlt.com/news/280311.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用Python子进程关闭Excel自动化中的弹窗
    本篇文章为大家展示了如何使用Python子进程关闭Excel自动化中的弹窗,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。利用Python进行Excel自动化操作的过程中,尤其是涉及VBA时,可能遇到...
    99+
    2023-06-15
  • 如何在linux中使用kill命令关闭进程
    本篇文章给大家分享的是有关如何在linux中使用kill命令关闭进程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命...
    99+
    2023-06-10
  • JS如何使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能
    这篇文章给大家分享的是有关JS如何使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:HTML部分:<div ...
    99+
    2024-04-02
  • 如何在Excel中调用Python脚本,实现数据自动化处理!
    说起Excel,那绝对是数据处理领域王者般的存在,尽管已经诞生三十多年了,现在全球仍有7.5亿忠实用户,而作为网红语言的Python,也仅仅只有700万的开发人员。Excel是全世界最流行的编程语言。对,你没看错,自从微软引入了LAMBDA...
    99+
    2023-05-14
    Python Excel
  • c#如何使用OleDbDataAdapter从Excel文件中的电子表格中进行SELECT
    要使用OleDbDataAdapter从Excel文件中的电子表格中进行SELECT,您需要按照以下步骤进行操作:1. 在代...
    99+
    2023-09-16
    c#
  • c#如何使用OleDbDataAdapter从Excel文件中的任何电子表格中进行SELECT
    要使用OleDbDataAdapter从Excel文件中的任何电子表格中进行SELECT,可以按照以下步骤操作:1. 导入所...
    99+
    2023-09-17
    c#
  • 如何使用Python实现给喜欢的主播自动发弹幕
    这篇文章主要为大家展示了“如何使用Python实现给喜欢的主播自动发弹幕”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用Python实现给喜欢的主播自动发弹幕”这篇文章吧。前言发弹幕只是其...
    99+
    2023-06-22
  • Python 编程中的算法:如何使用 API 进行优化?
    Python 是一种非常强大的编程语言,可以用于编写各种各样的应用程序和算法。在 Python 编程中,算法是非常重要的一部分,因为它们可以帮助我们解决各种各样的问题,例如数据分析、机器学习、图像处理等。 在 Python 编程中,有很多...
    99+
    2023-10-27
    编程算法 打包 api
  • C#中如何使用单元测试框架进行自动化测试
    C#中如何使用单元测试框架进行自动化测试引言:在软件开发过程中,自动化测试是一个非常重要的环节。通过编写和运行测试代码,可以帮助我们验证和确保代码的正确性和稳定性。在C#开发中,我们可以使用单元测试框架来实现自动化测试。本文将介绍C#中常用...
    99+
    2023-10-22
    自动化测试 C# 单元测试
  • 如何使用python把Excel中的数据在页面中可视化
    小编给大家分享一下如何使用python把Excel中的数据在页面中可视化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一. 需求最近我们数据可视化的老师让我们把广...
    99+
    2023-06-29
  • 如何使用Python和Bash自动化您的Apache服务器?
    Apache是一款流行的Web服务器,广泛用于互联网上的网站和应用程序。然而,管理Apache服务器可以是一项繁琐和重复的任务,特别是当您需要处理大量虚拟主机和配置文件时。在本文中,我们将介绍如何使用Python和Bash脚本来自动化Ap...
    99+
    2023-07-23
    bash ide apache
  • 如何使用 Python 和 JavaScript 实现 Windows 同步的自动化?
    在现代科技时代,我们总是需要在多个设备之间同步数据。同步数据可以使我们的工作更加高效和有条理。在 Windows 操作系统中,同步文件和文件夹是非常常见的需求。现在,我们可以使用 Python 和 JavaScript 来实现 Windo...
    99+
    2023-09-09
    javascript windows 同步
  • 如何使用Python中的进程间通信
    如何使用Python中的进程间通信进程间通信(IPC,Inter-Process Communication)是计算机科学中一个重要的概念,它允许不同的进程在同一个计算机系统中进行数据交换和共享资源。在Python中,有多种方式可以实现进程...
    99+
    2023-10-22
    Python 进程通信 IPC
  • 如何在 Python 学习笔记中使用 Laravel 和 Bash 实现自动化?
    在Python学习笔记中,使用Laravel和Bash可以实现自动化,这可以帮助你更高效地完成你的工作。Laravel是一个流行的PHP框架,它提供了很多方便的工具和函数。Bash是一种Unix shell,它提供了一个命令行界面来操作Li...
    99+
    2023-08-02
    学习笔记 laravel bash
  • 如何使用DB2 UDB的电子商务OLTP应用程序进行性能优化
    这篇文章给大家分享的是有关如何使用DB2 UDB的电子商务OLTP应用程序进行性能优化的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  一、 监视开关  确保已经打开监视开关。如...
    99+
    2024-04-02
  • 如何使用Python中的协程进行异步编程
    如何使用Python中的协程进行异步编程在传统的同步编程模型中,一个任务必须等待另一个任务完成后才能继续进行,这样会造成程序的执行效率降低。为了解决这个问题,异步编程模型应运而生。Python中的协程是一种支持异步编程的重要概念,它可以让我...
    99+
    2023-10-28
    Python 协程 异步编程
  • python实现接口自动化测试中如何使用pymysql直连数据库
    这篇文章给大家介绍python实现接口自动化测试中如何使用pymysql直连数据库,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实现步骤1 PyMySQL 安装启动命令行,联网的前提下键入命令: pip install...
    99+
    2023-06-04
  • 如何使用Python中的pickle模块进行对象序列化
    如何使用Python中的pickle模块进行对象序列化概述:在Python编程中,我们经常需要将数据保存到文件或通过网络传输。而对象序列化是一种将对象转化为可存储或传输的格式的过程,而pickle模块正是Python中一种常用的序列化模块。...
    99+
    2023-10-22
    Python pickle 对象序列化
  • Java编程算法中,如何使用关键字框架来进行代码优化?
    在Java编程中,算法是不可避免的话题。算法的好坏直接决定了代码的效率和质量。而关键字框架是一种优化算法的重要手段。在本文中,我们将介绍Java编程算法中如何使用关键字框架来进行代码优化。 一、什么是关键字框架? 关键字框架(Keywor...
    99+
    2023-08-19
    编程算法 关键字 框架
  • Java编程算法中,如何使用关键字框架来进行数据结构的优化?
    Java作为一种广泛使用的编程语言,可以使用丰富的数据结构和算法来进行程序设计。在Java编程中,数据结构的优化是非常重要的,因为它可以提高程序的效率和性能。为了实现数据结构的优化,我们可以使用关键字框架(Keyword Framewor...
    99+
    2023-08-19
    编程算法 关键字 框架
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作