python - 从 Python 获取事件 Excel 工作簿的名称

标签 python com

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

import win32com.client

xl = win32com.client.Dispatch("Excel.Application")
print(xl.ActiveWorkbook.FullName)

仅从第一个运行的 Excel 实例打印出事件工作簿的名称。我真正想要的是我上次单击的工作簿,而不管它位于哪个 Excel 实例中。

谢谢。

最佳答案

编辑评论

可能有更好的方法来做到这一点。

安装优秀的psutil

import psutil
excelPids = []
for proc in psutil.process_iter():
  if proc.name == "EXCEL.EXE": excelPids.append(proc.pid)

现在枚举窗口,但获取窗口标题和 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 实例在运行? You can get each instance with :

xl = win32com.client.GetObjec(None, "Excel.Application") #instance one
xl = win32com.client.GetObject("Name_Of_Workbook") #instance two

但这违背了目的,因为您需要知道名称,而且这不会告诉您最后关注的是哪一个。

上面@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

祝你好运!

关于python - 从 Python 获取事件 Excel 工作簿的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2876755/

相关文章:

c# - 收到错误 "The ' VFPOLEDB。 1' provider is not registered on the local machine"即使在安装和注册提供商之后

com - 我如何拒绝 ATL 7 中的 Windows "Service Stop"请求?

c# - COM 对象是否已与其 RCW 分离?

Delphi插件框架

Python 列表 : How can I search for another element or duplicate item in a list

Python:减少列表但保留细节

python - 为什么 subprocess.Popen(...) 不总是返回?

c# - 将参数从 VBScript 传递到 C# 中实现的 COM 接口(interface)的正确方法是什么?

python - Pandas : Replace string column values

python - 避免 python 设置时间