parser open example python windows excel com

open - xlrd python example



Controle 2 instancias de Excel separadas por COM de forma independiente... ¿se puede hacer? (3)

Tengo una aplicación heredada que se implementa en varios libros de Excel. No es algo que tenga la autoridad para volver a implementar, sin embargo, otra aplicación que mantengo debe ser capaz de invocar funciones en el libro de Excel.

Se le ha dado una interfaz de python usando la biblioteca de Win32Com. Otros procesos pueden invocar funciones en mi paquete python que, a su vez, invoca las funciones que necesito a través de Win32Com.

Lamentablemente, COM no me permite especificar un proceso COM particular, por lo que, por el momento, no importa cuán poderoso sea mi servidor, solo puedo controlar una instancia de Excel a la vez en la computadora. Si tuviera que intentar ejecutar más de una instancia de Excel, no habría forma de garantizar que la capa de python esté vinculada a una instancia de Excel específica.

Me gustaría poder ejecutar más de 1 de mis aplicaciones de Excel en mi servidor de Windows al mismo tiempo. ¿Hay alguna forma de hacer esto? Por ejemplo, ¿podría compartimentar mi entorno para poder ejecutar tantas combinaciones de Excel _ Python como mi aplicación sea compatible?


Consulte "Iniciar una nueva instancia de una aplicación COM" de Tim Golden , también mencionado aquí , que da la sugerencia de usar

xl_app = DispatchEx("Excel.Application")

más bien que

xl_app = Dispatch("Excel.Application")

para comenzar un proceso separado. Entonces deberías poder hacer:

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

Tenga en cuenta que cuando haya terminado, para cerrar la aplicación, he descubierto que es necesario hacerlo:

xl_app.Quit() xl_app = None

Descubrí que el proceso no se cerrará hasta que xl_app = None , es decir, el recuento de referencias del objeto COM de Python vaya a cero.

Tenga en cuenta que tengo un problema restante: mientras mi programa Python se está ejecutando, si hago doble clic en un archivo de Excel en el Explorador (al menos, en Win2k), termina abriendo el archivo en el proceso existente de Excel que inició Python (que se ejecuta oculto), lo que interrumpe el programa Python. Todavía no he encontrado una resolución para esto.


No sé nada de Python, lamentablemente, pero si funciona a través de COM, Excel no es una aplicación de instancia única, por lo que debería poder crear tantas instancias de Excel como lo permita la memoria.

Usando C # puedes crear múltiples instancias de aplicaciones de Excel a través de:

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

Usando el enlace tardío en C #, puede usar:

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

Si usa VB.NET, VB6 o VBA, puede usar CreateObject de la siguiente manera:

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

Lamentablemente, en Python, no tengo ni idea. Pero a menos que haya alguna limitación para Python (que no me puedo imaginar?) Entonces pensaría que es muy factible.

Dicho esto, la idea de tener varias instancias de Excel actuando como algún tipo de servidor para otras operaciones suena bastante difícil ... Sería cuidadoso probar lo que estás haciendo, especialmente con respecto a la cantidad de instancias que puedes tener abiertas en una vez, sin quedarse sin memoria y lo que sucede con el programa de llamadas si Excel falla por alguna razón.


Si su aplicación usa un solo archivo de Excel que contiene macros a las que llama, me temo que la respuesta probablemente no sea, ya que, aparte de COM Excel, no permite que se abra el mismo archivo con el mismo nombre (incluso en directorios diferentes). Es posible que pueda evitar esto copiando dinámicamente el archivo a otro nombre antes de abrirlo.

Mi conocimiento de Python no es enorme, pero en la mayoría de los idiomas hay una forma de especificar cuándo se crea un objeto COM, ya sea que se desee que sea un objeto nuevo o se conecte a una instancia preexistente de forma predeterminada. Compruebe los documentos de Python para algo en esta línea.

¿Puede enumerar el tipo de problemas específicos que tiene y exactamente lo que espera hacer?