Получить имя активной книги Excel из Python - PullRequest
1 голос
/ 20 мая 2010

Я пытаюсь написать скрипт Python, который будет обращаться к активной книге Excel и изменять ее, используя COM-интерфейс Excel. Тем не менее, я испытываю затруднения, заставляя это работать, когда работает несколько экземпляров Excel. Например, код

import win32com.client

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

выводит имя активной рабочей книги только из первого запущенного экземпляра Excel. Что мне действительно нужно, так это книга, на которую я последний раз щелкал, независимо от того, в каком экземпляре Excel она находилась.

Спасибо.

1 Ответ

3 голосов
/ 21 мая 2010

РЕДАКТИРОВАТЬ ДЛЯ КОММЕНТАРИЙ

Возможно, есть лучший способ сделать это.

Установите отличный 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)

Теперь просто найдите первый pid, который есть в наших ExcelPids

  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

Но в худшем случае 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

Удачи с этим!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...