2010-04-22 10 views
10

Próbując uzyskać odwołanie do arkuszy (z wykorzystaniem współdziałanie Excel):Dlaczego nie można ustawić rzutowania obiektu z Excela?

Excel.Application xl = new Excel.ApplicationClass(); 
Excel.Workbooks xlWorkBooks = xl.Workbooks; 
Excel.Workbook xlWorkBook = xlWorkBooks.Open(fileName, 0, false, 5, "", 
         "", true, Excel.XlPlatform.xlWindows, "\t", 
         false, false, 0, true, 1, 0); 

// Next line crashes 
Excel.Worksheets xlWorkSheets = (Excel.Worksheets) xlWorkBook.Worksheets; 

błędu jest to, że nie może oddać go:

Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.Excel.Worksheets'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{000208B1-0000-0000-C000-000000000046}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

Czy moja obsada błędna?

Odpowiedz

8

Tak, obsada jest źle.

_Workbook.Sheets daje instancję Sheets. Ten interfejs zapewnia wszystkie typy arkuszy, a nie tylko arkusze robocze; głównie obejmuje wykresy, makra itp.

Z drugiej strony interfejs Worksheets udostępnia jedynie arkusze robocze, a nie wykresy.

Interfejsy nie są wzajemnie przypisywane; w związku z tym pojawia się błąd COM. To jest mylące - nie jestem nawet pewien, czy można uzyskać instancję interfejsu Worksheets przez PIA - ale to jest Office Interop dla ciebie.

Dopóki używasz właściwość zamiast właściwości _Workbook.Sheets_Workbook.Worksheets, należy uzyskać instancję Sheets że zwraca tylko Worksheet obiektów - pomimo faktu, że interfejs jest zdolny świadczenia inne rodzaje arkuszy.

+0

@Zach i @Joel też mają rację, ale byłeś pierwszy w bramce wyjściowej, zielony czek. – AngryHacker

+0

Chociaż jest to dobrze udokumentowane, może to być jedno z pytań/odpowiedzi, które sprawiają, że warto. – TheBlastOne

+0

Dziękuję za to. "Gotcha" była dla mnie, że 'Excel.Workbook.Worksheets' zwraca obiekt' Excel.Sheets', a nie obiekt Excel.Worksheets. – Lopsided

0

Jeśli masz do czynienia z programem Excel 2007+, sugeruję użycie System.IO.Packaging + System.Xml.Linq (LINQ to XML) do manipulowania arkuszami programu Excel. Jest znacznie czystszy i nie wymaga od Excela zainstalowania na komputerze, na którym uruchamiasz swoją aplikację.

Spowoduje również mniej kolizji COM (takich jak powyżej w swoim wpisie).

Jeśli próbujesz edytować program Excel 2003 lub starszy, niestety nie możemy Ci pomóc.

+1

To pytanie zostało oznaczone jako .net-2.0', co oznacza, że ​​nie może używać Linq do XML ani żadnej z klas pakowania. Nawet gdyby mógł, nadal nie odpowiedziałoby na to pytanie. – Aaronaught

2

Dziwna. Według this page, ma on być typu Sheets, a nie Worksheets. Nie testowałem - daj temu wir?

4

Zgodnie z MSDN, Workbook.Worksheets zwraca Microsoft.Office.Interop.Excel.Sheets.

Więc chcesz rzucić go tak:

Microsoft.Office.Interop.Excel.Sheets sheets = 
    (Microsoft.Office.Interop.Excel.Sheets)xlWorkBook.Worksheets 

Albo zakładając Excel mapy do Microsoft.Office.Interop.Excel (jak wynika z pytania)

Excel.Sheets sheets = (Excel.Sheets)xlWorkBook.Worksheets 
3

Jeśli działa w jednym środowisku, ale nie w innym, sprawdź klucze reg KLK/HL Classes.

Jest możliwe, że próbujesz uruchomić na HKCR \ TypeLib {00020813-0000-0000-C000-000000000046} \ 1,6 ale coś zainstalowaną użytkownik dodał kluczowe: HKCR \ TypeLib {00020813- 0000-0000-C000-000000000046} \ 1.7 powodujące wywołanie Interop, aby rzucić wyjątek.

Jeśli to nie jest to może być coś w GAC z powodu różnych wersji systemu operacyjnego.

Miałem ten problem, który działał na naszych komputerach programistycznych z systemem Windows 7, i spowodował ten błąd na komputerze użytkownika z systemem XP.

0

To mogło się stać po aktualizacji do najnowszej wersji pakietu Office. Spróbuj przejść do programów i funkcji, znajdując instalację i "naprawiając" ją. Najwyraźniej zaktualizował i/lub ponownie rejestruje plik DLL interop używany do tworzenia tych obiektów.

Może to wymagać wykonania w połączeniu z poprawką rejestru opisaną przez @ codesforcoffee.

Powiązane problemy