2010-02-10 6 views
12

Environnement:Essayer de faire Office Automation avec Excel 2007, mais en utilisant Excel 2003 permet de rester

machine Windows XP
deux Excel 2007 et Excel 2003 est installé (dans cet ordre, et non par ordre chronologique).
C# 3.5

Problème:

Lorsque j'utilise les PIA pour faire un peu de bureautique, j'utilise la ligne de code suivante:

var excel = new ApplicationClass(); 

La version du PIA se réfère spécifiquement à ce que Excel 12.
C: \ WINDOWS \ assembly \ GAC \ Microsoft.Office.Interop.Excel \ 12.0.0.0__71e9bce111e9429c \ Microsoft.Office.Interop.Excel.dll
Mais:

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

Ainsi, lorsque je tente d'ouvrir un fichier avec extention .xlsx, il me met en garde contre la fonctionnalité perdue dans la conversion de fichiers, et l'ouvre avec Excel 2003. Je suis sûr qu'il doit faire avec l'installation ordre étant 2007 -> 2003, mais je ne peux pas désinstaller 2003 sur ma machine b/c nous avons un peu de bureautique sur notre serveur web pour un projet indépendant qui utilise excel 2003.

J'ai regardé le Policy.11.0 choses .Microsoft.Office.Interop.Excel.config, mais il dit

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

donc, je suis à une perte. Pourquoi ne puis-je pas dire à COM Interop quelle version d'Excel utiliser?

+0

Pourriez-vous essayer d'exécuter une réparation d'Excel 2007 et voir si cela rectifie? – x0n

+0

C'est possible, mais je crains que cela ne fasse grimper les PIA 2003 pour le code du site quand je dois y travailler. Je suppose que je pourrais rebondir, mais je suis un peu préoccupé par la façon dont cela fonctionnera une fois installé sur les machines de nos utilisateurs internes. –

+0

Cela ne changera pas les PIA. Vous pouvez vérifier le GAC pour être sûr, mais il est 99,99% certain que vous avez déjà les PIA Excel 2003 et Excel 2007 sur votre machine. Les configurations PIA ne changeront donc pas en faisant une réparation. Mais une réparation doit corriger le registre pour que la version actuelle soit Excel 2007 au lieu d'Excel 2003. Voir ma réponse ci-dessous pour plus de détails. –

Répondre

23

Vous ne pouvez pas commander par programme la version d'Excel à utiliser. Les PIA ne dictent que l'interface ou le modèle d'objet que vous développez. Mais quelle version d'Excel est en cours d'exécution est contrôlée par le registre. Toutefois, en ce qui concerne l'exécution des assemblys PIA, vous exécuterez réellement le PIA de plus haut niveau installé sur le système. Donc, si vous développez par rapport à Excel 2003 PIA, mais que le client a Excel 2007 avec le PIA Excel 2007, votre code s'exécutera contre le PIA Excel 2007 - et il devrait fonctionner correctement, car le PIA Excel 2007 est rétrocompatible. C'est-à-dire que chaque version de PIA de numéro supérieur (et le modèle d'objet Excel) est rétrocompatible avec les commandes compilées avec un ancien PIA et un ancien modèle d'objet Excel. Notez que si le client avait à la fois les PIA Excel 2007 et Excel 2003 sur la machine, le PIA versionné supérieur se chargerait, quelle que soit la version d'Excel en cours d'exécution, de sorte que le PIA Excel 2007 s'exécuterait si les deux PIA étaient disponibles. [Edit: Une mise en garde est que les PIA Excel 2007 doivent être 100% rétrocompatible lorsque vous utilisez VB.NET ou C# 4.0. Si vous utilisez C# 3.0 ou inférieur, le fait que les paramètres optionnels soient réellement requis lorsqu'ils sont appelés à partir de C# 3.0 ou inférieur créera une rupture dans du code lors de l'exécution sur le PIA ou le modèle objet de version supérieure. C'est relativement rare cependant, et avec C# 4.0, ce problème devrait disparaître, en théorie.]

Ok, donc vous n'avez pas beaucoup de contrôle sur les PIAs parce que le PIA que vous avez développé ne le fait pas contrôlez quel PIA sera réellement exécuté sur l'ordinateur client.

Vous n'avez pas beaucoup de contrôle sur la version d'Excel qui est lancée.Par exemple, lorsque vous créez une nouvelle instance Excel via:

Excel.Application excelApp = new Application(); 

L'application Excel chargée est définie en fonction de la version actuelle définie dans le registre. La version actuelle est enregistrée à:

HKEY_CLASSES_ROOT\Excel.Application\CurVer 

Il ressemble à la clé 'CurVer dans votre cas aura une valeur par défaut de « Excel.Application.11 », au lieu de « Excel.Application.12 ». Changer cela seul pourrait faire l'affaire, mais je préférerais faire une réparation à la place pour m'assurer que tous les paramètres du registre sont corrigés correctement. (Et je ne pouvais pas savoir ce que tous les paramètres doivent être.) Ok, je viens de trouver un autre: vous devez également modifier:

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

pour maintenir une valeur de « Excel.Application.12 » . Mais je recommande fortement d'effectuer une réparation à la place. Je ne sais pas quels autres paramètres pourraient avoir besoin d'être modifiés, donc les changer à la main est un peu risqué.

En outre, vous devriez trouver les clés suivantes ainsi:

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

Parce que ce sont les versions d'Excel que vous avez installés.

(Voir here pour une nouvelle discussion.)

Je suis sûr qu'il a à voir avec le installer pour être 2007 -> 2003

Oui, cela est correct à 100% . Vous pourriez essayer d'exécuter une réparation sur Excel 2007, ce serait la chose la plus facile à faire. Si cela ne fonctionne pas, alors je désinstallerais les deux puis les réinstallerais les deux. Je voudrais désinstaller Excel 2003, puis désinstaller 2007 (en inversant l'ordre dans lequel vous les avez installés), puis installer Excel 2003 et ensuite installer Excel 2007 de sorte que vous installez les deux versions dans le bon ordre. Mais n'oubliez pas que Excel 2007 sera exécuté par défaut lorsque vous appelez Excel.Application excelApp = new Application().

La pratique réellement recommandée est et non pour que les deux versions d'Excel s'exécutent sur la machine du développeur. Pour en savoir plus, voir:

je l'habitude d'avoir plusieurs versions d'Excel sur ma même machine de développement, et je me sentais personnellement que les inconvénients étaient pas aussi compliqué que ces articles le font sonner. En général, le PIA Excel 2007 est rétrocompatible avec le PIA Excel 2003 et tout fonctionne correctement. Mais une fois, je me suis retrouvé dans un gâchis de registre semblable au vôtre et j'ai décidé de «faire la bonne chose». J'ai désinstallé les deux et ensuite seulement réinstallé Excel 2007.

De là j'ai installé Virtual PC, ce qui est gratuit (VMware est en fait un peu mieux, mais ce n'est pas gratuit), puis installé mes versions inférieures d'Excel pour 2003 , 2002, 2000 et 1997 sur des machines virtuelles distinctes. C'est certainement un travail à mettre en place, mais une fois que vous faites cela, tout est propre à 100%.Cela dit, je ne voudrais probablement pas réellement développer contre les versions inférieures d'Excel sur une machine virtuelle, il serait trop difficile d'utiliser Visual Studio hébergé dans une machine virtuelle. Ces machines virtuelles ne sont donc utiles que pour tester le déploiement afin de s'assurer que votre système peut fonctionner avec différentes configurations client. Avoir du sens?

Espérons que cela aide!

Mike

+0

C'est une richesse incroyable d'informations, merci. Ma seule préoccupation était que le serveur web sur lequel réside notre site n'a pas de PIA Excel 2007. C'est seulement jusqu'en 2003. Je vais devoir essayer et voir si cela fonctionne. En fait, je pense que le modèle fourni par mon BA est en train d'être rétrogradé à un .xls compatible 2003, c'est le chemin de moindre résistance selon le manager. Si j'ai l'occasion, j'essaierai certainement ceci. –

+0

Glad it helps. :-) Dans ce cas, vous * devriez * pouvoir référencer les PIA 2003 sur votre machine de développement et tout ira bien. Gardez toutefois à l'esprit que lorsque vous exécutez et déboguez réellement, vous serez * exécuté * contre les assemblys PIA 2007, car il semble que vous ayez les assemblys PIA 2003 et 2007 sur votre système. Cela devrait fonctionner correctement, car les PIA sont rétrocompatibles. Toutefois, lorsque vous déployez sur un système Excel 2003, le PIA de niveau le plus élevé doit être le PIA 2003, et c'est donc sur cette base qu'il sera exécuté. Tout cela est "en théorie" cependant - il est préférable de tester cela fortement. –

+0

Encore une fois, le mieux serait pour vous d'avoir seulement Excel 2003 sur votre machine de développement, et la lecture des articles Andrew Whitechapel énumérés ci-dessus est la clé. Mais si vous devez avoir les deux sur votre système, référez-vous simplement aux PIA Excel 2003 et vous devriez être ok. Mais assurez-vous de tester intensivement. Personnellement, cependant, j'ai fait le changement pour avoir seulement une version d'Excel sur ma machine et tous les autres dans les machines virtuelles et je suis heureux d'avoir fait le changement. Quelque chose pour vous de penser à long terme. –

Questions connexes