当前位置: 首页 > 面试题库 >

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

晏树
2023-03-14
问题内容

我正在尝试编写一个Python脚本,该脚本将使用Excel
COM界面访问和修改活动的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实例正在运行?
您可以使用以下方法获取每个实例:

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

祝你好运!



 类似资料:
  • 本文向大家介绍excel-vba 检索活动工作簿中的所有工作表名称,包括了excel-vba 检索活动工作簿中的所有工作表名称的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 本文向大家介绍如何使用python在Selenium中的工作簿中获取活动表?,包括了如何使用python在Selenium中的工作簿中获取活动表?的使用技巧和注意事项,需要的朋友参考一下 我们可以在Selenium的工作簿中获得活动表。Excel是电子表格,扩展名为.xlsx。一个excel工作簿有多个工作表,每个工作表都由行和列组成。 在所有工作表中,当我们访问一个称为活动工作表的特定工作表时。

  • 所以在问这个之前,我搜索并发现了一些与我在这里想要做的相似的事情。 基本上我有工作簿AlphaMaster。这个工作簿是一个模板,我想用它来创建每周的新工作簿。 在本工作簿中,有名为“周一至周六”的工作表,以及带有相应日期的周一、周二等其他工作表。 我创建了一个在打开工作簿时加载的表单。我想要的是当我单击表单运行时,它将: > 将代码保存模板作为新工作簿运行 根据userform1的输入重命名工作

  • 我有一本有工作表的工作簿。为了简单起见,假设我的工作簿有一个工作表。在我的工作表中,它被称为“SHEET1”,在单元格A1到A4中有数据。 我希望我的VBA代码做的是: 将工作簿“A”的第1行(或特别是单元格A1至A4)复制到范围变量“我的范围”中 创建一个新的工作簿,我们将此工作簿称为'B' 为工作簿'B'的默认“sheet1”指定一个新名称为“测试名称” 打开工作簿'B'(尽管我意识到VBA代

  • 我想将工作簿的一页(包括样式)复制到新的工作簿。 我尝试对所有单元格进行迭代 抛出java.lang.IllegalStateException:超出了单元格样式的最大数目。在.xls工作簿中最多可以定义4000个样式 抛出java.lang.IllegalArgumentException:此样式不属于提供的工作簿。是否尝试将样式从一个工作簿分配到另一个工作簿的单元格? 正确的样式复制方法是什么