win32com dispatch找不到已经打开的应用程序实例

时间:2014-08-14 00:26:23

标签: python excel com win32com

我正在使用python来解析Excel文件,并且在重新启动开始时使用excel = Dispatch('Excel.Application')访问应用程序COM,代码将很快找到应用程序对象,并且我将能够访问活动工作簿。

当我打开两个Excel实例并关闭第一个实例时出现问题。从那时起,每次调用excel = Dispatch('Excel.Application')都会提供一个与Excel的打开实例不同的应用程序对象。如果我尝试excel.Visible=1,它会打开一个新的Excel实例,而不是显示已经打开的excel实例。如何获取已打开的Excel实例的COM对象而不是创建新实例?

1 个答案:

答案 0 :(得分:2)

当一个应用程序注册自己时,只有第一个实例被注册,直到它死掉,然后注册的下一个实例才会被注册。

没有注册队列,所以当你的第一个实例死亡时,第二个实例会保持未注册状态,因此对Excel.Application的任何调用都会启动第三个实例,并且它们会继续使用它直到它也死掉。

总之,在注册实例之间启动的实例永远不会被注册。

如果需要重用实例,则必须保留指向它的指针。

也就是说,如果您获得了一个打开的Excel文件的实例,您可能会获得一个指向未注册的Excel实例的链接。例如,如果Excel 1(已注册)已打开工作簿1,并且Excel 2(未注册)已打开工作簿2,则如果要求工作簿2,则将获得Excel 2的实例(例如,通过Workbook.Application)。 / p>