2010-02-10 14 views
12

Umwelt zu tun:Der Versuch, Office-Automatisierung mit Excel 2007, aber immer wieder mit Excel 2003

Windows XP Maschine
Sowohl Excel 2007 und Excel 2003 installiert ist (in dieser Reihenfolge, nicht chronologisch).
C# 3.5

Problem:

Wenn ich die PIA verwenden, um einige Office Automation zu tun, verwende ich die folgende Codezeile:

var excel = new ApplicationClass(); 

Die Version der PIA bezieht sich speziell auf sie als Excel 12.
C: \ WINDOWS \ Assembly \ GAC \ Microsoft.Office.Interop.Excel \ 12.0.0.0__71e9bce111e9429c \ Microsoft.Office.Interop.Excel.dll
Aber:

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

Wenn ich also versuchen, eine Datei mit Endung .xlsx zu öffnen, warnt mich über verlorene Funktionalität in der Dateikonvertierung und öffnet es mit Excel 2003. Ich bin mir ziemlich sicher, es hat mit dem installieren zu tun Auftrag seiend 2007 -> 2003, aber ich kann 2003 auf meiner Maschine nicht b/c deinstallieren wir haben etwas Büroautomatisierung auf unserem webserver für ein in Verbindung stehendes Projekt, das excel 2003 benutzt.

Ich habe die Policy.11.0 angeschaut Sachen .Microsoft.Office.Interop.Excel.config, aber es sagt

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

Also, bin ich ratlos. Warum kann ich COM Interop nicht mitteilen, welche Version von Excel verwendet werden soll?

+0

Können Sie versuchen, eine Reparatur von Excel 2007 laufen und sehen, ob das korrigiert? – x0n

+0

Es ist möglich, aber ich fürchte, das wird die 2003 PIAs für den Website-Code aufrüsten, wenn ich daran arbeiten muss. Ich denke, ich könnte hin und her springen, aber ich bin ein wenig besorgt darüber, wie das funktionieren wird, sobald es auf den Computern unserer internen Benutzer installiert ist. –

+0

Es wird nicht die PIAs ändern. Sie können die GAC überprüfen, um sicher zu sein, aber es ist 99,99% sicher, dass Sie sowohl die Excel 2003 und Excel 2007 PIAs auf Ihrem Computer bereits haben. Die PIA-Setups ändern sich also nicht durch eine Reparatur. Aber eine Reparatur sollte die Registrierung beheben, um die aktuelle Version Excel 2007 statt Excel 2003 zu machen. Siehe meine Antwort unten für weitere Details. –

Antwort

23

Sie können nicht programmgesteuert festlegen, welche Version von Excel verwendet werden soll. Die PIAs bestimmen nur, an welcher Schnittstelle oder an welchem ​​Objektmodell Sie sich entwickeln. Aber welche Version von Excel tatsächlich ausgeführt wird, wird von der Registrierung gesteuert.

Wenn es jedoch um die Ausführung der PIAs geht, werden Sie tatsächlich mit der höchsten auf dem System installierten PIA arbeiten. Wenn Sie also gegen die Excel 2003-PIA entwickeln, der Client aber Excel 2007 mit der Excel 2007-PIA verwendet, wird Ihr Code gegen die Excel 2007-PIA ausgeführt - und er sollte ordnungsgemäß ausgeführt werden, da die Excel 2007-PIA abwärtskompatibel ist. Das heißt, jede höher nummerierte PIA-Version (und Excel-Objektmodell) ist abwärtskompatibel zu Befehlen, die mit einem älteren PIA- und älteren Excel-Objektmodell kompiliert wurden. Beachten Sie, dass, wenn der Client sowohl die Excel 2007- als auch die Excel 2003-PIAs auf der Maschine hat, die höhere versionierte PIA geladen wird, unabhängig davon, welche Version von Excel ausgeführt wird - also würde die Excel 2007-PIA ausgeführt, wenn beide PIAs verfügbar wären.

[Bearbeiten: Eine Einschränkung ist, dass die Excel 2007 PIAs 100% abwärtskompatibel sein sollten, wenn sie VB.NET oder C# 4.0 verwenden. Wenn C# 3.0 oder niedriger verwendet wird, verursacht die Tatsache, dass optionale Parameter tatsächlich erforderlich sind, wenn sie ab C# 3.0 aufgerufen werden, bei der Ausführung mit dem PIA- oder Objektmodell der höheren Version eine Unterbrechung in einem Code. Es ist jedoch relativ selten, und mit C# 4.0 sollte dieses Problem in der Theorie weggehen.]

Ok, so haben Sie nicht viel Kontrolle über die PIAs, weil die PIA, gegen die Sie entwickelt haben, nicht wirklich steuern Sie, welche PIA tatsächlich auf dem Client-Rechner ausgeführt wird.

Sie haben auch nicht viel Kontrolle darüber, welche Version von Excel gestartet wird.Wenn Sie z. B. eine neue Excel-Instanz erstellen über:

Excel.Application excelApp = new Application(); 

Die geladene Excel-Anwendung wird entsprechend der aktuellen in der Registrierung festgelegten Version festgelegt. Die aktuelle Version wird gespeichert unter:

HKEY_CLASSES_ROOT\Excel.Application\CurVer 

Es sieht aus wie die ‚CurVer‘ Schlüssel in Ihrem Fall wird ein Standardwert von ‚Excel.Application.11‘ haben, anstelle von ‚Excel.Application.12‘. Wenn Sie dies alleine ändern, könnte es zwar ausreichen, aber ich würde lieber eine Reparatur durchführen, um sicherzustellen, dass alle Registrierungseinstellungen korrekt korrigiert werden. (Und ich konnte nicht wissen, was alle Einstellungen sein sollte.) Ok, ich habe gerade ein anderes: Sie würde auch ändern müssen:

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

einen Wert von „Excel.Application.12“ zu halten . Aber ich würde dringend empfehlen, stattdessen eine Reparatur durchzuführen. Ich weiß nicht, welche anderen Einstellungen geändert werden müssen, daher ist ein Wechsel von Hand etwas riskant.

Darüber hinaus sollten Sie die folgenden Tasten sowie finden:

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

Da das sind die Versionen von Excel, die Sie installiert haben.

(Siehe here für eine weitere Diskussion.)

ich ziemlich sicher bin, es mit den zu tun hat, um 2007 zu sein installieren -> 2003

Ja, das ist 100% richtig . Sie könnten versuchen, eine Reparatur für Excel 2007 auszuführen, dies wäre die einfachste Aufgabe. Wenn dies nicht funktioniert, dann werde ich beide deinstallieren und dann beide neu installieren. Ich würde Excel 2003 deinstallieren und dann 2007 deinstallieren (die Reihenfolge, in der Sie sie installierten) und dann Excel 2003 installieren und dann Excel 2007 installieren, so dass Sie beide Versionen in der richtigen Reihenfolge installieren.

Beachten Sie jedoch, dass Excel 2007 beim Aufruf von Excel.Application excelApp = new Application() standardmäßig ausgeführt wird.

Die tatsächliche empfohlene Praxis ist nicht zu beiden Versionen von Excel auf dem Computer des Entwicklers ausgeführt werden. Weitere Informationen hierzu finden Sie unter:

ich verwendet, um mehrere Versionen von Excel auf meinem gleichen Entwicklungsmaschine zu haben, und ich fühlte mich persönlich, dass die Nachteile waren nicht so kompliziert wie diese Artikel es klingen lassen. Im Allgemeinen ist der Excel 2007 PIA abwärtskompatibel zu Excel 2003 PIA und alles funktioniert gut. Aber ich habe mich einmal in ein Register-Chaos ähnlich wie deines geraten und beschlossen, "das Richtige zu tun". Ich deinstallierte beide und dann nur Excel 2007 neu.

Von dort installierte ich virtuellen PC, der frei ist (VM-Waren ist wirklich ein wenig besser, aber es ist nicht frei) und installierte dann meine niedrigeren Versionen von Excel für 2003 , 2002, 2000 und '97 auf separaten VMs. Es ist definitiv etwas Arbeit, aber sobald Sie das tun, ist alles 100% sauber.

Das sagte, ich würde wahrscheinlich nicht wirklich gegen niedrigere Versionen von Excel auf einer VM entwickeln möchten, wäre es zu schwer, Visual Studio innerhalb einer VM gehostet zu verwenden. Diese VMs eignen sich daher nur zum Testen der Bereitstellung, um sicherzustellen, dass Ihr System gegen verschiedene Clientkonfigurationen arbeiten kann. Sinn ergeben?

Hoffe, das hilft!

Mike

+0

Das ist eine unglaubliche Fülle von Informationen, danke. Meine einzige Sorge war, dass der Webserver, auf dem sich unsere Website befindet, keine Excel 2007 PIAs hat. Es ist nur bis 2003. Ich muss es versuchen und sehen, ob das klappt. Ich denke tatsächlich, dass die Vorlage, die meine BA zur Verfügung gestellt hat, auf eine 2003-kompatible .xls b/c herabgestuft wird, es war der geringste Widerstandspfad nach Manager. Wenn ich eine Chance bekomme, werde ich es definitiv versuchen. –

+0

Froh, dass es hilft. :-) In diesem Fall solltest du in der Lage sein, die 2003 PIAs auf deinem Entwicklungscomputer zu referenzieren, und es wird dir gut gehen. Beachten Sie jedoch, dass Sie beim Ausführen von & debuggen * gegen die PIAs 2007 laufen *, weil es sich anhört, als ob Sie die PIAs 2003 und 2007 auf Ihrem System haben. Dies sollte jedoch gut laufen, da die PIAs abwärtskompatibel sind. Wenn Sie jedoch auf einem Excel 2003-System bereitstellen, sollte der PIA der höchsten Ebene der PIA 2003 sein, und damit wird es funktionieren. Dies ist alles "in der Theorie" - es ist am besten, dies stark zu testen. –

+0

Noch einmal, das Beste wäre, wenn Sie nur Excel 2003 auf Ihrem Entwicklungscomputer hätten, und das Lesen der oben aufgelisteten Artikel von Andrew Whitechapel ist der Schlüssel. Aber wenn Sie beide auf Ihrem System haben müssen, dann verweisen Sie einfach auf die Excel 2003 PIAs und Sie sollten * in Ordnung sein. Aber seien Sie sicher, ausführlich zu prüfen. Persönlich habe ich jedoch den Umstieg auf eine einzige Version von Excel auf meinem Computer und alle anderen in VMs vorgenommen und bin froh, dass ich den Wechsel vorgenommen habe. Etwas, an das Sie auf lange Sicht denken können. –