通过COM独立控制两个独立的Excel实例。。。能做到吗?

2024-10-01 05:06:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

我希望能够在Windows服务器上同时运行一个以上的excel应用程序。有办法吗?例如,我是否可以划分我的环境,以便我可以运行尽可能多的Excel\uupython组合以支持我的应用程序?在


Tags: 实例函数服务器com应用程序环境进程windows
3条回答

参见"Starting a new instance of a COM application" by Tim Golden,也引用了here,它给出了使用的提示

xl_app = DispatchEx("Excel.Application")

而不是

^{pr2}$

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

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程序。我还没有找到解决办法。在

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

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

你能列出你遇到的具体问题以及你希望做什么吗?在

不幸的是,我对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中使用后期绑定,您可以使用:

^{pr2}$

如果使用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由于某种原因崩溃,调用程序会发生什么情况。在

相关问题 更多 >