2010-02-10 12 views
12

Środowisko:Próbując zrobić Office Automation w programie Excel 2007, ale wciąż za pomocą programu Excel 2003

Windows XP maszyna
Zarówno Excel 2007 i Excel 2003 zainstalowano (w tej kolejności, a nie chronologicznie).
C# 3.5

Problem:

Kiedy używać PIA zrobić kilka automatyki biurowej, używam następujący wiersz kodu:

var excel = new ApplicationClass(); 

wersja Pia nawiązuje wyraźnie do niego jako Excel 12.
C: \ WINDOWS \ assembly \ GAC \ Microsoft.Office.Interop.Excel \ 12.0.0.0__71e9bce111e9429c \ Microsoft.Office.Interop.Excel.dll
Ale:

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

Tak więc, gdy próbuję otworzyć plik z rozszerzeniem .xlsx ostrzega mnie o utraconej funkcjonalności w konwersji pliku i otwiera go w programie Excel 2003. Jestem pewien, że ma do czynienia z instalacji zamawiam na rok 2007 -> 2003, ale nie mogę odinstalować 2003 na mojej maszynie b/c mamy automatyzację biurową na naszym serwerze internetowym dla niepowiązanego projektu, który używa Excel 2003.

Sprawdziłem Policy.11.0 .Microsoft.Office.Interop.Excel.config rzeczy, ale mówi

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

Tak, jestem w rozterce. Dlaczego nie mogę powiedzieć COM Interop, której wersji programu Excel używać?

+0

Czy możesz spróbować uruchomić naprawę programu Excel 2007 i sprawdzić, czy to rozwiązuje? – x0n

+0

Jest to możliwe, ale obawiam się, że podniesie PIA z 2003 roku do kodu strony, kiedy będę musiał nad tym popracować. Sądzę, że mógłbym podskakiwać w przód iw tył, ale jestem trochę zaniepokojony tym, jak to będzie działało po zainstalowaniu na komputerach naszych wewnętrznych użytkowników. –

+0

Nie spowoduje to zmiany PIA. Możesz sprawdzić GAC, ale masz 99,99% pewności, że już posiadasz PIA w programie Excel 2003 i Excel 2007. Tak więc konfiguracje PIA nie zmienią się, wykonując naprawę. Ale naprawa powinna naprawić rejestr, aby bieżąca wersja była Excel 2007 zamiast Excel 2003. Zobacz moją odpowiedź poniżej, aby uzyskać więcej szczegółów. –

Odpowiedz

23

Nie można zaprogramować polecenia, której wersji programu Excel użyć. PIAs tylko dyktują, z którym interfejsem, lub modelem obiektu, nad którym pracujesz. Ale która wersja programu Excel faktycznie działa, jest kontrolowana przez rejestr.

Jeśli chodzi o uruchamianie PIA, będzie to jednak działać przeciwko PIA najwyższego poziomu zainstalowanej w systemie. Jeśli więc rozwiniesz się przeciwko PIA w programie Excel 2003, ale klient ma Excel 2007 z PIA programu Excel 2007, twój kod będzie działał przeciwko PIA programu Excel 2007 - i powinien działać dobrze, ponieważ program Excel 2007 PIA jest zgodny wstecz. Oznacza to, że każda wersja PIA o wyższym numerze (i model obiektowy programu Excel) jest wstecznie kompatybilna z komendami skompilowanymi ze starszym modelem PIA i starszym modelem obiektów programu Excel. Zauważ, że gdyby klient miał zarówno PIAs Excel 2007, jak i Excel 2003 na maszynie, to ładowałaby się PIA z wyższą wersją, niezależnie od wersji Excela, więc uruchomiłaby PIA programu Excel 2007, gdyby obie PIA były dostępne.

[Edytuj: jednym zastrzeżeniem jest to, że oceny PIA programu Excel 2007 powinny być w 100% zgodne z poprzednimi wersjami podczas korzystania z VB.NET lub C# 4.0. Jeśli używasz C# 3.0 lub poniżej, fakt, że opcjonalne parametry są rzeczywiście wymagane, gdy zostanie wywołany z C# 3.0 lub poniżej, spowoduje złamanie jakiegoś kodu podczas działania na wyższej wersji PIA lub modelu obiektowego. Jest to stosunkowo rzadkie, ale z C# 4.0 problem ten powinien zniknąć, teoretycznie.]

OK, więc nie masz dużej kontroli nad PIA, ponieważ PIA, które opracowałeś przeciw kontrolować, które PIA będą faktycznie działać na komputerze klienta.

Nie masz dużej kontroli nad wersją programu Excel.Na przykład podczas tworzenia nowej instancji programu Excel za pomocą:

Excel.Application excelApp = new Application(); 

Załadowana aplikacja Excel jest ustawiona zgodnie z aktualną wersją ustawioną w rejestrze. Obecna wersja jest zapisywana w:

HKEY_CLASSES_ROOT\Excel.Application\CurVer 

Wygląda klawisza „Curver” w Twoim przypadku będzie mieć wartość domyślną „Excel.Application.11”, zamiast „Excel.Application.12”. Samo zmienienie tego może załatwić sprawę, ale wolałbym zamiast tego wykonać naprawę, aby upewnić się, że wszystkie ustawienia rejestru zostały poprawione poprawnie. (I nie mógł wiedzieć, co wszystkie ustawienia powinny być.) Ok, ja po prostu znaleźć jeszcze jedno: czy trzeba także zmienić:

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

posiadać wartość „Excel.Application.12” . Ale zdecydowanie zaleciłbym wykonanie naprawy zamiast tego. Nie wiem, jakie inne ustawienia mogą wymagać zmiany, więc zmiana ich ręcznie jest nieco ryzykowna.

Ponadto, należy znaleźć następujące klucze, a także:

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

Ponieważ są to wersje programu Excel, które zostały zainstalowane.

(Patrz here do dalszej dyskusji.)

Jestem pewien, że ma do czynienia z zainstalować kolejność jest 2007 -> 2003

Tak, to jest 100% poprawne . Możesz spróbować uruchomić naprawę w programie Excel 2007, byłoby to najłatwiejsze do zrobienia. Jeśli to nie zadziała, to odinstaluj oba, a następnie zainstaluję je ponownie. Chciałbym odinstalować program Excel 2003, a następnie odinstalować 2007 (odwracając kolejność, w której zostały zainstalowane), a następnie zainstalować program Excel 2003, a następnie zainstalować program Excel 2007, aby zainstalować obie wersje we właściwej kolejności.

Należy jednak pamiętać, że w ten sposób program Excel 2007 będzie domyślnie uruchamiany po wywołaniu Excel.Application excelApp = new Application().

Zalecana praktyka to , a nie, aby obie wersje programu Excel działały na komputerze programisty. Więcej na ten temat patrz:

Kiedyś miałem kilka wersji programu Excel na moim samej maszynie rozwoju, a ja osobiście czułem, że downsides się nie tak skomplikowane, jak te artykuły sprawiają, że brzmi. Zasadniczo program Excel 2007 PIA jest kompatybilny z poprzednimi wersjami programu Excel 2003 PIA i wszystko działa poprawnie. Ale kiedyś dostałem się do rejestru podobnego do twojego i zdecydowałem się "postąpić właściwie". Odinstalowałem oba, a następnie ponownie zainstalowałem program Excel 2007.

Stamtąd zainstalowałem Virtual PC, który jest darmowy (VM ware jest w rzeczywistości trochę lepszy, ale nie jest darmowy), a następnie zainstalowałem moje niższe wersje programu Excel 2003 , 2002, 2000 i '97 na oddzielnych maszynach wirtualnych. Z pewnością jest trochę pracy do skonfigurowania, ale kiedy to zrobisz, wszystko jest w 100% czyste.

To powiedziawszy, prawdopodobnie nie chciałbym faktycznie rozwijać przeciwko niższych wersji programu Excel na maszynie wirtualnej, byłoby zbyt trudno używać Visual Studio hostowane w maszynie wirtualnej. Tak więc te maszyny wirtualne są dobre tylko do testowania wdrażania, aby upewnić się, że system może działać w różnych konfiguracjach klienta. Ma sens?

Mam nadzieję, że to pomoże!

Mike

+0

To niesamowite bogactwo informacji, dziękuję. Moim jedynym zmartwieniem było to, że serwer internetowy, na którym znajduje się nasza witryna, nie ma PIA w programie Excel 2007. Dopiero do 2003 roku. Będę musiał spróbować i sprawdzić, czy to się uda. Właściwie uważam, że szablon dostarczony przez BA został obniżony do zgodnego z 2003 r. .xls b/c to była ścieżka najmniejszego oporu według menadżera. Jeśli dostanę szansę, na pewno spróbuję tego. –

+0

Cieszę się, że to pomaga. :-) W tym przypadku możesz * powinieneś * móc odwoływać się do PIA na 2003 r. Na maszynie programistycznej i wszystko będzie dobrze. Pamiętaj jednak, że po uruchomieniu i debugowaniu * będziesz * działał * w stosunku do PIA z 2007 roku, ponieważ brzmi to tak, jakbyś miał zarówno PIAs 2003 i 2007 w swoim systemie. To powinno się jednak udać, ponieważ PIA są kompatybilne wstecznie. Jednak po wdrożeniu w systemie Excel 2003 najwyższą miarą PIA powinna być PIA z 2003 r., A więc to, do czego będzie działać. To wszystko "w teorii" - najlepiej to przetestować. –

+0

Ponownie, najlepiej byłoby, gdybyś posiadał tylko program Excel 2003 na maszynie programistycznej, a przeczytanie artykułów Andrew Whitechapel wymienionych powyżej jest kluczowe. Ale jeśli * masz * mieć oba w swoim systemie, to po prostu odwołaj się do PIA programu Excel 2003, a Ty * powinieneś * być w porządku. Ale pamiętaj, aby dokładnie przetestować. Osobiście jednak postanowiłem, że mam tylko jedną wersję programu Excel na moim komputerze i wszystkie inne w maszynach wirtualnych i cieszę się, że dokonałem zmiany. Coś do przemyślenia na dłuższą metę. –