Pregunta

Medio Ambiente:

Windows XP máquina
Tanto Excel 2007 y Excel 2003 instalado (en ese orden, no por orden cronológico).
C # 3.5

Problema:

Cuando uso los PIA para hacer algo de automatización de oficina, utilizo la siguiente línea de código:

var excel = new ApplicationClass();

La versión del PIA se refiere específicamente a ella como Excel 12.
C: \ WINDOWS \ assembly \ GAC \ Microsoft.Office.Interop.Excel \ 12.0.0.0__71e9bce111e9429c \ Microsoft.Office.Interop.Excel.dll
Pero:

 excel.Version;//this is 11.0 instead of 12.0

Por lo tanto, cuando intento abrir un archivo con extensión .xlsx, me advierte acerca de la funcionalidad perdida en la conversión de archivos, y lo abre con Excel 2003. Estoy bastante seguro de que tiene que ver con el fin de instalar siendo 2007 - > 2003, pero no puedo desinstalar 2003 en mi máquina b / c tenemos un poco de automatización de oficinas en nuestro servidor web para un proyecto relacionado que utiliza Excel 2003.

He mirado en la materia Policy.11.0.Microsoft.Office.Interop.Excel.config, pero dice

<bindingRedirect oldVersion="11.0.0.0" newVersion="12.0.0.0"></bindingRedirect>

Por lo tanto, yo estoy en una pérdida. Por qué no puedo decir la interoperabilidad COM qué versión de Excel para usar?

¿Fue útil?

Solución

No se puede ordenar mediante programación qué versión de Excel para su uso. Los PIA sólo se dictan qué interfaz o modelo de objetos, que está desarrollando en contra. Pero la versión de Excel se ejecuta realmente es controlado por el registro.

Cuando se trata de administrar los PIA, sin embargo, en realidad se ejecute en contra de la PIA de más alto nivel instalado en el sistema. Así que si usted desarrolla en contra de la PIA de Excel 2003, pero el cliente tiene Excel 2007 con el Excel 2007 PIA, el código se ejecuta en el Excel 2007 PIA - y debería funcionar bien, porque el Excel 2007 PIA es compatible con versiones anteriores. Es decir, cada versión de mayor número de PIA (y el modelo de objetos de Excel) es compatible con versiones anteriores a los comandos compilados contra un PIA más y más viejo modelo de objetos de Excel. Tenga en cuenta que si el cliente tenía tanto en el PIA de Excel 2007 y Excel 2003 en la máquina, entonces el PIA mayor versionado cargaría, independientemente de la versión de Excel se ejecuta -. Por lo que el PIA de Excel 2007 correría, si se dispusiera de dos de los PIA

[Editar: Una advertencia es que los PIA de Excel 2007 deben ser 100% compatible hacia atrás cuando se utiliza VB.NET o C # 4.0. Si el uso de C # 3.0 o más adelante, el hecho de que los parámetros opcionales son realmente necesarios cuando se llama desde C # 3.0 o por debajo creará un descanso en algún código cuando se ejecuta en contra de la PIA de mayor versión o modelo de objetos. Es relativamente raro sin embargo, y con C # 4.0, este problema debería desaparecer, en teoría.]

Ok, por lo que no tiene mucho control sobre los PIA porque el PIA que ha desarrollado en contra no controla realmente en el cual PIA en realidad se ejecuta en la máquina cliente.

Usted no tiene mucho control sobre el que se puso en marcha cualquier versión de Excel. Por ejemplo, cuando se crea una nueva instancia de Excel a través de:

Excel.Application excelApp = new Application();

La aplicación Excel cargado se ajusta de acuerdo a la versión actual establecido en el registro. La versión actual se guarda en:

HKEY_CLASSES_ROOT\Excel.Application\CurVer

Parece que la clave 'CurVer' en su caso tendrá un valor por defecto de 'Excel.Application.11', en lugar de 'Excel.Application.12'. El cambio de este solo puede hacer el truco, pero yo preferiría hacer una reparación en su lugar para asegurarse de que todos los ajustes del registro se corrigen adecuadamente. (Y yo no podría saber qué deben ser todos los ajustes.) Ok, acabo de encontrar otra: también tendría que cambiar:

[HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\ProgID]

para mantener un valor de "Excel.Application.12". Pero no te recomiendo que ejecuta una reparación en su lugar. No sé lo que tenga que ser cambiado otros ajustes, por lo que cambiar a mano es un poco arriesgado.

Además, usted debe encontrar las claves siguientes, así:

HKEY_CLASSES_ROOT\Excel.Application.11
HKEY_CLASSES_ROOT\Excel.Application.12

Debido a que estas son las versiones de Excel que haya instalado.

(Ver aquí para una discusión adicional.)

  

Estoy bastante seguro de que tiene que ver con el   instalar orden que es 2007 -> 2003

Sí, esto es 100% correcto. Se podría intentar ejecutar una reparación en Excel 2007, esto sería lo más fácil de hacer. Si esto no funciona, entonces yo desinstale y vuelva a instalar los dos. Me desinstalar Excel 2003 y luego desinstalar 2007 (invirtiendo el orden en que se hayan instalado) y luego instalar Excel 2003 y luego instalar Excel 2007 para que va a instalar ambas versiones en el orden correcto.

Pero hay que tener en cuenta que al hacer esto, Excel 2007 se ejecuta de forma predeterminada cuando se llama Excel.Application excelApp = new Application().

La práctica recomendada es real no para tener las dos versiones de Excel que se ejecutan en la máquina del desarrollador. Para más información sobre este tema, consulte:

Yo solía tener varias versiones de Excel en mi misma máquina de desarrollo, y personalmente me pareció que las desventajas no eran tan complicados como estos artículos hacen sonar. En general, el Excel 2007 PIA es compatible con versiones anteriores a Excel 2003 PIA y todo funciona bien. Pero una vez que se metió en un lío registro similar a la suya y decidió "hacer lo correcto". He desinstalado ambos y entonces sólo re-instalado Excel 2007.

A partir de ahí he instalado Virtual PC, que es gratuito (VM ware es en realidad un poco mejor, pero no es gratis) y después se instala mis versiones inferiores de Excel para 2003, 2002, 2000 y '97 por separado en las máquinas virtuales. En definitiva, es un trabajo de configurar, pero una vez que lo hace, todo es 100% limpio.

Una vez dicho esto, yo probablemente no me gustaría en realidad desarrollan en contra de menor versiones de Excel en una máquina virtual, sería demasiado difícil de usar alojada dentro de una máquina virtual de Visual Studio. Así pues, estas máquinas virtuales sólo son buenos para probar la distribución para asegurarse de que su sistema puede trabajar en contra de diversas configuraciones de cliente. Tiene sentido?

Espero que esto ayude!

Mike

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top