从Python获取活动Excel工作簿的名称

从Python获取活动Excel工作簿的名称,python,com,Python,Com,我正在尝试编写一个Python脚本,该脚本将使用Excel COM接口访问和修改活动的Excel工作簿。但是,当有多个Excel实例在运行时,我很难让它正常工作。例如,代码 import win32com.client xl = win32com.client.Dispatch("Excel.Application") print(xl.ActiveWorkbook.FullName) 仅从第一个运行的Excel实例打印活动工作簿的名称。我真正想要的是我上次单击的工作簿,不管它在哪个Exce

我正在尝试编写一个Python脚本,该脚本将使用Excel COM接口访问和修改活动的Excel工作簿。但是,当有多个Excel实例在运行时,我很难让它正常工作。例如,代码

import win32com.client

xl = win32com.client.Dispatch("Excel.Application")
print(xl.ActiveWorkbook.FullName)
仅从第一个运行的Excel实例打印活动工作簿的名称。我真正想要的是我上次单击的工作簿,不管它在哪个Excel实例中


谢谢。

编辑评论

也许有更好的方法可以做到这一点

安装优秀的

现在枚举窗口,但获取窗口标题和pid

windowPidsAndTitle = []
win32gui.EnumWindows(lambda hwnd, resultList: resultList.append((win32gui.GetWindowThreadProcessId(hwnd),win32gui.GetWindowText(hwnd))), windowPidsAndTitle)
现在只需找到excelPids中的第一个pid

  for pid,title in windowPidsAndTitle:
    if pid in excelPids:
      return title 
结束编辑

这里有许多事情需要考虑:

一个实例是否打开了多个工作簿?在这种情况下

xl = win32com.client.Dispatch("Excel.Application")
xl.ActiveWorkbook.FullName
将确实为您提供最后一个活动工作簿

或者是否有单独的EXCEL.EXE实例在运行?:

但这与目的背道而驰,因为你需要知道它的名字,而这不会告诉你最后一个焦点是哪一个

对于上面的@tgrays注释,如果保证您的excel实例是前台窗口,则:

import win32gui
win32gui.GetWindowText(win32gui.GetForegroundWindow()) 
#parse this and use GetObject to get your excel instance
但最坏的情况是场景,多个实例,并且您必须找到最后一个焦点,您必须枚举所有窗口并找到您关心的窗口:

windows = []
win32gui.EnumWindows(lambda hwnd, resultList: resultList.append(win32gui.GetWindowText(hwnd)),windows)
#enumerates all the windows open from the top down
[i for i in windows if "Microsoft Excel" in i].pop(0)
#this one is closest to the top

祝你好运

使用xlwings,您只需执行以下操作:

import xlwings as xw
print(xw.books.active.name)

即使您打开了多个Excel实例,这也能正常工作。

没有答案。你考虑使用XLRD,XLWT吗?在我看来,它比Win32Com更透明。在运行时,您希望Excel实例成为当前活动窗口吗?jaoquin-这些模块不用于进程间通信,这正是我在这里需要的。目标工作簿将被打开,它需要对Python程序发出的命令做出实时反应。对不起,我不太明白你的问题。基本上,我希望活动图书是我关注的最后一本工作簿。当我运行我的程序时,工作簿自然仍然是打开的。非常感谢Mark,这很有效。我只是有一个后续问题。可能会返回标题中有文本“Microsoft Excel”但不是Excel窗口的窗口。事实上,我之所以想到这一点,是因为我实际上有一个PDF打开,标题中有这些词。有没有办法检查我们返回的窗口实际上是对Excel应用程序的引用?
windows = []
win32gui.EnumWindows(lambda hwnd, resultList: resultList.append(win32gui.GetWindowText(hwnd)),windows)
#enumerates all the windows open from the top down
[i for i in windows if "Microsoft Excel" in i].pop(0)
#this one is closest to the top
import xlwings as xw
print(xw.books.active.name)