python - para - ¿Hay una mejor manera(además de COM) de controlar de forma remota Excel?
python para excel (5)
Estoy trabajando en una herramienta de prueba de regresión que validará una gran cantidad de hojas de cálculo de Excel. En este momento los controlo a través de COM desde un script de Python usando la última versión del producto pywin32. Desafortunadamente COM parece tener una serie de inconvenientes molestos:
Por ejemplo, el más mínimo trastorno parece ser capaz de romper la conexión con el servidor COM, una vez que se cortó no parece haber una forma segura de volver a conectarse a la aplicación Excel. No hay seguridad incorporada en el objeto de la aplicación COM.
La interfaz COM de Excel no me permitirá controlar remotamente de forma segura dos instancias separadas de la aplicación Excel que operan en el mismo archivo de libro de trabajo, incluso si son de solo lectura.
Además, cuando algo sale mal, rara vez recibo mensajes de error útiles ... en el mejor de los casos excepto un código de error numérico o un mensaje apenas útil como "Se ha producido una excepción". Es casi imposible saber por qué algo salió mal.
Finalmente, COM no tiene la capacidad de controlar algunos de los aspectos más fundamentales de Excel. Por ejemplo, no hay forma de hacer un cierre garantizado del proceso de Excel al que está conectado un cliente COM. Ni siquiera puede usar COM para encontrar el PID de Excel.
Entonces, ¿qué pasaría si abandonara completamente COM? ¿Hay alguna forma alternativa de controlar Excel?
Todo lo que quiero hacer es ejecutar macros, abrir y cerrar libros de trabajo y leer y escribir rangos de celdas. Quizás algunos expertos de .NET conozcan un truco o dos que todavía no han surgido en la comunidad de Python. ¿Qué hay de los hackers de la oficina? ¿Podría haber una forma mejor de acceder a las entrañas de Excel que COM?
¿Has mirado los paquetes xlrd y xlwt ? Ya no los necesito, pero tuve éxito con xlrd en mi último proyecto. Lo último que supe es que no podían procesar macros, pero podían hacer lecturas básicas y escribir hojas de cálculo. Además, son independientes de la plataforma (¡el programa que escribí estaba destinado a ejecutarse en Linux)!
No hay forma de que elude por completo a COM. Puede usar VSTO (Visual Studio Tools para Office), que tiene bonitos .NET wrappers en los objetos COM, pero todavía es COM debajo.
Puede usar Jython con JExcelApi ( http://jexcelapi.sourceforge.net/ ) para controlar su aplicación de Excel. He estado considerando implementar esta solución con uno de mis proyectos de PyQt, pero aún no he tenido tiempo de probarlo. He utilizado efectivamente el JExcelApi en aplicaciones Java antes, pero no he usado Jython (aunque sé que puede importar clases de Java).
NOTA: el JExcelApi puede ser COM bajo el capó (no estoy seguro).
También es posible ejecutar Excel como una aplicación de servidor y usarlo como un motor de cálculo. Esto permite a los usuarios que no son de TI especificar reglas comerciales dentro de Excel y llamarlas a través de servicios web. No he trabajado con esto yo mismo, pero sé que un colega mío lo usó una vez. Tutorial: Desarrollar una aplicación personalizada Usar Excel Web Services podría ser un buen punto de partida. Un primer vistazo a esa página parece que requiere Sharepoint. Esto podría no ser apto para todos los entornos.
La interfaz COM de Excel no me permitirá controlar remotamente de forma segura dos instancias separadas de la aplicación Excel que operan en el mismo archivo de libro de trabajo, incluso si son de solo lectura.
Esto no es una limitación de COM, esta es una limitación de Excel . Excel ni siquiera le permitirá abrir dos archivos con el mismo nombre al mismo tiempo si existen en diferentes directorios. Es una limitación fundamental del programa Excel.
Para responder a tus otras preguntas
Si revisa su documentación de python, debería haber una forma de conectarse a un servidor existente si la conexión se pierde.
La falta de mensajes de error útiles puede tener que ver con Python.
Ni siquiera puede usar COM para encontrar el PID de Excel.
COM es un modelo de objeto interno y expuso lo que desea. Los PID están disponibles para procesos externos tanto como para internos, no hay un motivo real para exponer como una interfaz COM.