Почему я получаю разные списки открытых книг в Excel COM, в зависимости от того, какая среда IDE выполняет код? - PullRequest
0 голосов
/ 29 сентября 2018
import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')
for wb in excel.Workbooks:
    print(wb.Name)

Когда я запускаю этот скрипт с использованием Sublime Text: выводится список имен открытых книг.

Когда я запускаю этот скрипт с помощью PyCharm: я получаю пустой список.

Оба находятся на одном компьютере и используют одну и ту же версию Python (3.5 32-разрядная).

Не уверен, что эта часть информации имеет значение, но я никогда не запускал установщик PyCharm, когда впервыескачал PyCharm.Я скачал zip-файл и просто запускаю PyCharm.exe из разархивированной папки каждый раз.Может ли это быть причиной?

1 Ответ

0 голосов
/ 30 сентября 2018

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

Чтобы обеспечить подключение к существующемуНапример, вы можете использовать win32com.client.GetActiveObject(<ProgID>) согласно Присоединение к уже запущенному приложению Office из вашего приложения с помощью GetActiveObject или BindToMoniker - .NET4Office .


Я не совсем уверен, когдаможет произойти или другое, но я заметил, что эти шаблоны могут объяснить то, что вы видите:

  • Если у вас есть экземпляр Excel, который был запущен вручную до запуска вашей программы, программа подключается к этому экземпляру
  • Если нет, экземпляр excel.exe порождается процессом svchost.exe, на котором размещена служба запуска процесса DCOM
    • Этот экземпляр изначально не имеет открытых рабочих книг
  • Однако, если вы запустите Excel вручную, будет создан второй экземпляр.Экземпляр DCOM имеет приоритет.
  • Экземпляр не закрывается даже после .Quit, пока есть ссылки на него , поэтому любые дальнейшие отправки из того же процесса, пока он имеет ссылки наон получит тот же экземпляр.
  • Вы не можете подключиться к процессам Excel, запущенным с правами другого пользователя (в том числе с vs без повышения прав).

Так что если вы, например, запустите свой кодиз интерактивной консоли или IDE не перезапускает процесс Python каждый раз (маловероятно, но возможно), у вас могут быть старые существующие ссылки.

...