通过COM独立控制2个独立的Excel实例......可以这样做吗?

时间:2009-02-05 17:32:22

标签: python windows excel com

我有一个遗留应用程序,它在许多Excel工作簿中实现。这不是我有权重新实现的,但是我维护的另一个应用程序确实需要能够在Excel工作簿中调用函数。

使用Win32Com库给它一个python接口。其他进程可以调用我的python包中的函数,然后通过Win32Com调用我需要的函数。

不幸的是,COM不允许我指定特定的COM进程,所以目前无论我的服务器有多强大,我只能在计算机上一次控制一个Excel实例。如果我试图运行多个excel实例,则无法确保python层绑定到特定的Excel实例。

我希望能够在我的Windows服务器上同时运行多个我的Excel应用程序。有没有办法做到这一点?例如,我可以划分我的环境,以便我可以运行尽可能多的Excel _ Python组合,因为我的应用程序将支持吗?

3 个答案:

答案 0 :(得分:6)

请参阅"Starting a new instance of a COM application" by Tim Golden,同时引用here,其中提供了使用

的提示
xl_app = DispatchEx("Excel.Application")

而不是

xl_app = Dispatch("Excel.Application")

开始一个单独的过程。所以你应该能够做到:

xl_app_1 = DispatchEx("Excel.Application")
xl_app_2 = DispatchEx("Excel.Application")
xl_app_3 = DispatchEx("Excel.Application")

注意,当您完成后,要关闭应用,我发现有必要这样做:

xl_app.Quit()
xl_app = None

我发现在xl_app = None之前,进程不会关闭,也就是说,Python COM对象的引用计数变为零。

注意我还有一个问题:当我的Python程序正在运行时,如果我在资源管理器中双击一个Excel文件(至少在Win2k上),它最终会打开文件在Python启动的现有Excel流程(运行隐藏)中,这会破坏Python程序。我还没有找到解决方案。

答案 1 :(得分:2)

遗憾的是,我对Python不了解,但如果它通过COM工作,则Excel不是单实例应用程序,因此您应该能够在内存允许的情况下创建尽可能多的Excel实例。

使用C#,您可以通过以下方式创建多个Excel应用程序实例:

Excel.Application xlApp1 = new Excel.Application();
Excel.Application xlApp2 = new Excel.Application();
Excel.Application xlApp3 = new Excel.Application();

在C#中使用后期绑定,您可以使用:

object objXL1 = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
object objXL2 = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
object objXL3 = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));

如果使用VB.NET,VB6或VBA,您可以按如下方式使用CreateObject:

Dim objXL1 As Object = CreateObject("Excel.Application")
Dim objXL2 As Object = CreateObject("Excel.Application")
Dim objXL3 As Object = CreateObject("Excel.Application")

不幸的是,在Python中,我没有任何线索。但除非Python有一些限制(我无法想象?),否则我认为它非常可行。

也就是说,将多个Excel实例作为某种服务器用于其他操作的想法听起来相当苛刻......我会小心测试你在做什么,特别是关于你能用多少个实例在没有内存不足的情况下立即打开,如果Excel出于某种原因崩溃,调用程序会发生什么。

答案 2 :(得分:0)

如果你的应用程序使用一个包含你调用的宏的excel文件,我担心答案可能是否定的,因为除了COM外,Excel不允许使用相同的名称打开同一个文件(即使在不同的目录中) 。您可以通过在打开之前将文件动态复制到另一个名称来解决此问题。

我的python知识并不大,但在大多数语言中,有一种方法可以指定何时创建COM对象,无论您希望它是新对象还是默认情况下连接到预先存在的实例。检查python文档以了解这些内容。

您能列出您遇到的具体问题以及您希望做的事情吗?