tutoriales tutorial support office microsoft funciona como aprender excel com automation

support - tutoriales excel microsoft



¿Cómo puedo comenzar una versión de Excel específica en automatización de com? (6)

Este artículo puede ser de utilidad:

http://forums.devx.com/showthread.php?p=457900#post457900

Al igual que los comentaristas anteriores, no tengo claro por qué Excel 11 tendría problemas con una hoja de cálculo de Excel 9

Uso Excel a través de la automatización COM (en c #), pero parece que el problema no tiene control sobre qué versión de Excel se inicia en el cuadro: utilizamos tanto Excel 9 como Excel 11 y un conjunto específico de hojas de cálculo requiere Excel 9 no funcionará

Incluí las referencias de Excel 9 com, pero en otra máquina de personas, comenzó excel 11. Cómo puedo arreglar esto ?


No estoy seguro de los ProgId (nombres descriptivos en las guías CLSID) utilizados para Excel, pero una mirada rápida me lleva a ''Excel.Application'', como el tipo que puede activar.

Eche un vistazo bajo HKEY_CLASSES_ROOT, en mi máquina veo "Excel.Application" y "Excel.Application.12", sospecho que está activando "Excel.Application", si mira debajo de la tecla "CurVer" en "Excel". Aplicación "apunta a" Excel.Application.12 ", inspeccione este valor en sus máquinas repro.

Supongo que está iniciando Excel. Aplicación, puede forzarlo a iniciar Excel.Application.9 si el ID de programa existe en su máquina de destino.

Aquí hay una pequeña muestra de código:

Type excel9Type = Type.GetTypeFromProgID("Excel.Application.9"); Type excelType = Type.GetTypeFromProgID("Excel.Application"); if (excelType == excel9Type) { Console.WriteLine("Default Excel.Application is pointing to ''Verion 9'' yay"); } else { Console.WriteLine("Excel is installed, but it''s not ''Version 9''"); } if (excel9Type == null) { throw new InvalidOperationException("Excel.Application.9 is not a registered progid"); } object excelApplication = Activator.CreateInstance(excel9Type); // Cast excelApplication to whatever you are using as your application type.


Ok, entonces revisé las dos máquinas que dan un comportamiento diferente, después de cambiar a la solución Activator sugerida por Phils. Ambas máquinas tienen Excel.Application.9 en el curkey CurVer; pero uno comienza 11 y uno comienza 9. Todavía estoy un poco perdido hasta ahora.

Noté en el depurador que el objeto Type devuelto de Excel.Application.9 tiene alguna evidencia de XL11 adentro.

¿Alguna otra sugerencia?


¿Qué dicen las Guias de identificación de clase en la progid para Excel.Application.9 y .11 en las dos máquinas diferentes?


No tiene nada que ver con CurVer. Esto es COM Al igual que con todas las aplicaciones COM, Windows descubre cómo iniciarlas consultando las configuraciones LocalServer o InprocServer en la clave CLSID relevante en el registro.

El CLSID para Excel es:

{00024500-0000-0000-C000-000000000046}

Si observa esta clave en HKCR / CLSID (HKCR / Wow6432Node / CLSID está ejecutando una edición de Windows de 64 bits), verá estas claves. Si Excel 2003 y Excel 2007 están instalados, estas tres teclas:

HKCR/Excel.Appplication HKCR/Excel.Appplication.11 HKCR/Excel.Appplication.12

Apuntará al mismo mismo CLSID, razón por la cual Windows solo sabe cómo iniciar una versión de Excel.

Si descubre que Excel 2003 se está iniciando, es porque las claves secundarias del CLSID apuntan a la instalación de OFFICE11.

Para cambiar este comportamiento, cambie la ruta para que apunte a la ruta OFFICE12 (u OFFICE14). Windows usará la variante Unicode del comando por preferencia (que es ininteligible). Entonces, a menos que sepa cómo actualizar el Unicode, simplemente elimine los valores del ''comando''.


Para obtener una versión de Excel específica, puede iniciar el ejecutable binario directamente usando

System.Diagnostics.Process process = System.Diagnostics.Process.Start(@"C:/Program Files/Microsoft Office/Office11/Excel.exe"); int processId = process.Id;

Esto le dará la identificación del proceso de Excel. Ahora puede conectarse a esta instancia de Excel y puede obtener el modelo de objetos llamando a AccessibleObjectFromWindow .

Este método requiere que use P / Invoke y también debe obtener primero un control de la ventana de Excel. Dado que esto es un poco más de trabajo, simplemente haré referencia a la siguiente pregunta donde todo se describe en detalle:

¿Cómo utilizar el enlace tardío para obtener la instancia de Excel?