Reputation: 1411
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
for wb in excel.Workbooks:
print(wb.Name)
When I run this script using Sublime Text: A list of the names of open workbooks is printed.
When I run this script using PyCharm: I get a blank list.
Both are on the same PC and are using the same version of Python (3.5 32-bit).
Not sure if this piece of info makes a difference, but I never ran the PyCharm installer when I first downloaded PyCharm. I downloaded the zip file and just run the PyCharm.exe from the unzipped folder every time. Could this be the reason why?
Upvotes: 6
Views: 1260
Reputation: 36046
The reason must be that in one case, you connect to a running Excel instance while in the other one, open a new one (or connect to some other one).
To ensure connecting to an existing instance, you can use win32com.client.GetActiveObject(<ProgID>)
as per Attaching to an already running Office application from your application using GetActiveObject or BindToMoniker – .NET4Office.
These are the patterns that I noticed that govern which Excel instance an Excel.Application
object connects to:
excel.exe
instance is spawned by the svchost.exe
process hosting the DCOM process launcher service
.Quit
as long as there are references to it, so any further dispatches from the same process while it has references to it will get the same instance.So if you e.g. run your code from interactive console, or the IDE doesn't restart the Python process each time (unlikely but possible), you may have old existing references.
Upvotes: 3