Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过COM独立控制2个单独的Excel实例。。。能做到吗?_Python_Windows_Excel_Com - Fatal编程技术网

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

Python 通过COM独立控制2个单独的Excel实例。。。能做到吗?,python,windows,excel,com,Python,Windows,Excel,Com,我有一个遗留应用程序,它在许多Excel工作簿中实现。我无权重新实现它,但是我维护的另一个应用程序确实需要能够调用Excel工作簿中的函数 它使用Win32Com库提供了一个python接口。其他进程可以调用我的python包中的函数,python包反过来通过Win32 COM调用我需要的函数 不幸的是,COM不允许我指定一个特定的COM进程,因此目前无论我的服务器多么强大,我一次只能在计算机上控制一个Excel实例。如果我尝试运行多个excel实例,就无法确保python层绑定到特定的exce

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

它使用Win32Com库提供了一个python接口。其他进程可以调用我的python包中的函数,python包反过来通过Win32 COM调用我需要的函数

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


我希望能够在Windows服务器上同时运行多个excel应用程序。有办法做到这一点吗?例如,我是否可以划分我的环境,以便可以运行应用程序支持的尽可能多的Excel uu-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#中使用后期绑定可以使用:

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

请参阅,也被引用,其中给出了使用提示

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\u app=None
才会关闭,也就是说,Python COM对象的引用计数变为零


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

是的,启动两个不同的Excel实例没有问题;只是,您不能让多个Excel应用程序打开并使用GetObject抓取它们的COM进程…好吧,这是真的。。。但是任何使用Excel作为任何服务后端的人都不应该通过GetObject()劫持其他Excel进程。它应该只创建和使用自己的Excel实例。否则,您的应用程序可能会与使用Excel实例的用户或其他进程发生冲突:-(非常感谢。你的解决方案让我大开眼界!你也让我大开眼界!我希望我能投票给你100次,或者给你我所有的分数!这让我发疯了!!!非常感谢汉克斯:)Excel不打开新窗口的问题很不幸是众所周知的,令人讨厌。但也许对你有帮助……在我发表上述评论7年多后,我回到这个问题,却发现我在另一个脚本上遇到了类似的问题。。。希望这能帮助我再次找到解决方案!