win32com 调用无法找到已打开的应用实例
我正在用Python来解析一个Excel文件,开始时我通过 excel = Dispatch('Excel.Application')
来访问Excel应用程序。刚开始重启的时候,这段代码能顺利找到Excel的应用对象,我也能访问到当前打开的工作簿。
问题出现在我打开了两个Excel实例,然后关闭了第一个。之后每次调用 excel = Dispatch('Excel.Application')
时,得到的应用对象就和当前打开的Excel实例不一样了。如果我尝试 excel.Visible=1
,它会打开一个新的Excel实例,而不是显示已经打开的那个Excel实例。我该怎么做才能获取到已经打开的Excel实例的COM对象,而不是创建一个新的实例呢?
1 个回答
2
当一个应用程序注册自己时,只有第一个实例会被注册,直到它关闭,然后下一个注册的实例才会被注册。
没有注册队列,所以当第一个实例关闭后,第二个实例并不会自动注册。这样一来,任何对 Excel.Application
的调用都会启动一个第三个实例,它们会一直使用这个实例,直到它也关闭。
总的来说,在已注册的实例之间启动的实例是不会被注册的。
如果你想重复使用一个实例,你必须保持对它的引用。
另外,如果你获取了一个打开的Excel文件的实例,你可能会得到一个未注册的Excel实例的链接。例如,如果注册的Excel 1打开了工作簿1,而未注册的Excel 2打开了工作簿2,当你请求工作簿2时,你会得到Excel 2的实例(比如通过 Workbook.Application
)。