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

Sal*_*ley 6 python windows com excel

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

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

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

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

Cra*_*een 7

请参阅此处引用的Tim Golden的"启动COM应用程序的新实例",它提供了使用提示

xl_app = DispatchEx("Excel.Application")
Run Code Online (Sandbox Code Playgroud)

而不是

xl_app = Dispatch("Excel.Application")
Run Code Online (Sandbox Code Playgroud)

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

xl_app_1 = DispatchEx("Excel.Application")
xl_app_2 = DispatchEx("Excel.Application")
xl_app_3 = DispatchEx("Excel.Application")
Run Code Online (Sandbox Code Playgroud)

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

xl_app.Quit()
xl_app = None
Run Code Online (Sandbox Code Playgroud)

我发现进程不会关闭,直到xl_app = NonePython COM对象的引用计数变为零.

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


Mik*_*lum 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();
Run Code Online (Sandbox Code Playgroud)

在 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"));
Run Code Online (Sandbox Code Playgroud)

如果使用 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")
Run Code Online (Sandbox Code Playgroud)

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

也就是说,让多个 Excel 实例充当某种服务器来执行其他操作的想法听起来相当冒险......我会小心测试你正在做什么,特别是关于你可以打开多少个实例一旦没有耗尽内存,如果 Excel 由于某种原因崩溃,调用程序会发生什么情况。