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

时间:2010-05-20 18:33:47

标签: python com

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

import win32com.client

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

仅从第一个运行的Excel实例中打印出活动工作簿的名称。我真正想要的是我上次点击的工作簿,无论它是什么Excel实例。

感谢。

2 个答案:

答案 0 :(得分:3)

编辑评论

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

安装优秀的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

但最坏的情况是scenerio,多个实例并且您必须找到最后关注的实例,您必须枚举所有窗口并找到您关注的窗口:

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

祝你好运!

答案 1 :(得分:1)

使用xlwings,您可以轻松做到:

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

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

相关问题