Próbuję odczytać plik Excel (xlsx) przy użyciu kodu pokazanego poniżej. Otrzymuję komunikat „Tabela zewnętrzna nie jest w oczekiwanym formacie”. błąd, chyba że mam już otwarty plik w programie Excel. Innymi słowy, muszę najpierw otworzyć plik w programie Excel, zanim będę mógł czytać z mojego programu C #. Plik xlsx znajduje się w udziale w naszej sieci. Jak mogę odczytać plik bez konieczności jego wcześniejszego otwierania? Dzięki
string sql = "SELECT * FROM [Sheet1$]";
string excelConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathname + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\"";
using (OleDbDataAdapter adaptor = new OleDbDataAdapter(sql, excelConnection)) {
DataSet ds = new DataSet();
adaptor.Fill(ds);
}
c#
excel-2007
xlsx
import-from-excel
Sisiutl
źródło
źródło
Odpowiedzi:
„Tabela zewnętrzna nie ma oczekiwanego formatu”. zwykle występuje podczas próby użycia pliku Excel 2007 z parametrami połączenia, które używają: Microsoft.Jet.OLEDB.4.0 i Extended Properties = Excel 8.0
Wydaje się, że użycie następujących parametrów połączenia rozwiązuje większość problemów.
źródło
Dzięki za ten kod :) Naprawdę to doceniam. Pracuje dla mnie.
Więc jeśli masz wersję diff pliku Excel, pobierz nazwę pliku, jeśli jego rozszerzenie to .xlsx , użyj tego:
a jeśli to .xls , użyj:
źródło
.xls
plik na komputerze, na którym nie jest zainstalowany Jet OleDb.(Mam zbyt niską reputację, aby komentować, ale to jest komentarz do wpisu JoshCaby, używającego silnika Ace zamiast Jet for Excel 2007)
Jeśli nie masz zainstalowanego / zarejestrowanego Ace na swoim komputerze, możesz go pobrać pod adresem : https://www.microsoft.com/en-US/download/details.aspx?id=13255
Dotyczy to również programu Excel 2010.
źródło
We're sorry, this download is no longer available
.Po prostu dodaj moją walizkę. Mój plik xls został utworzony przez funkcję eksportu danych ze strony internetowej, rozszerzenie pliku to xls, można go normalnie otworzyć w programie MS Excel 2003. Ale zarówno Microsoft.Jet.OLEDB.4.0, jak i Microsoft.ACE.OLEDB.12.0 otrzymały „ Wyjątek: tabela zewnętrzna nie ma oczekiwanego formatu.
Wreszcie problem polega na tym, jak powiedział wyjątek, „nie jest w oczekiwanym formacie”. Chociaż jego nazwa rozszerzenia to xls, ale kiedy otwieram go w edytorze tekstu, jest to właściwie dobrze sformatowany plik HTML, wszystkie dane znajdują się w <table>, każdy <tr> jest wierszem, a każdy <td> jest komórka. Wtedy myślę, że mogę to przeanalizować w sposób html.
źródło
Extended Properties=""HTML Import;HDR=No;IMEX=1
Miałem ten sam problem. które rozwiązano, wykonując następujące czynności:
1.) Kliknij Plik
2.) Wybierz „zapisz jako”
3.) Kliknij listę rozwijaną (Zapisz jako typ)
4.) Wybierz skoroszyt programu Excel 97-2003
5.) Kliknij przycisk Zapisz
źródło
Miałem ten sam problem (używając ACE.OLEDB) i tym, co go dla mnie rozwiązało, był ten link:
http://support.microsoft.com/kb/2459087
Istotą tego jest to, że zainstalowanie wielu wersji pakietu Office i różnych pakietów SDK, zestawów itp. Doprowadziło do odwołania ACEOleDB.dll w rejestrze wskazującego na folder OFFICE12 zamiast OFFICE14 w
Z linku:
źródło
Widziałem również ten błąd podczas próby użycia złożonych formuł INDIRECT () na importowanym arkuszu. Zauważyłem to, ponieważ była to jedyna różnica między dwoma skoroszytami, w których jeden importował, a drugi nie. Oba były plikami .XLSX 2007+ i zainstalowano silnik 12.0.
Potwierdziłem, że to problem przez:
i błąd zniknął.
źródło
Otrzymywałem błędy podczas czytania skoroszytu XLSX przez strony trzecie i Oledb. Wygląda na to, że problem dotyczy ukrytego arkusza roboczego, który powoduje błąd. Odkrywanie arkusza umożliwiło zaimportowanie skoroszytu.
źródło
Jeśli plik jest tylko do odczytu, po prostu go usuń i powinien znów działać.
źródło
Wpadłem na ten sam problem i znalazłem ten wątek. Żadna z powyższych sugestii nie pomogła, z wyjątkiem komentarza @ Smitha do zaakceptowanej odpowiedzi 17 kwietnia 2013 roku.
Tło mojego problemu jest wystarczająco zbliżone do @ zhiyazw - w zasadzie próba ustawienia wyeksportowanego pliku Excela (w moim przypadku SSRS) jako źródła danych w pakiecie dtsx. Wszystko, co zrobiłem, po kilku majstrach, to zmiana nazwy arkusza. Nie musi to być małe, jak zasugerował @Smith.
Przypuszczam, że ACE OLEDB oczekuje, że plik Excela będzie miał określoną strukturę XML, ale usługi Reporting Services w jakiś sposób nie są tego świadome.
źródło
Ten adres pliku programu Excel może mieć nieprawidłowe rozszerzenie. Możesz zmienić rozszerzenie z xls na xlsx lub odwrotnie i spróbować ponownie.
źródło
plik może być zablokowany przez inny proces, musisz go skopiować, a następnie załadować zgodnie z tym poście
źródło
Może to być również plik zawierający obrazy lub wykresy, zobacz: http://kb.tableausoftware.com/articles/knowledgebase/resolving-error-external-table-is-not-in-expected-format
Zaleca się, aby zapisać jako Excel 2003
źródło
Dodam tylko moje rozwiązanie tego problemu. Przesyłałem plik .xlsx na serwer sieciowy, a następnie czytałem z niego i masowo wstawiałem do SQL Server. Otrzymuję ten sam komunikat o błędzie, wypróbowano wszystkie sugerowane odpowiedzi, ale żadna nie działała. Ostatecznie zapisałem plik jako excel 97-2003 (.xls), który działał ... jedyny problem, jaki mam teraz, to fakt, że oryginalny plik miał ponad 110 000 wierszy.
źródło
Jeśli nadal masz ten problem, sprawdź swoje uprawnienia, wypróbowałem wiele z tych sugestii, a moim konkretnym problemem było to, że plik, który chciałem przetworzyć, znajdował się pod kontrolą źródła, a wątek nie miał uprawnień, musiałem zmienić uprawnienia całego folderu i zaczęło działać (przetwarzałem tam wiele plików) ... Pasuje również do wielu sugestii, takich jak zmiana nazwy pliku lub sprawdzenie, czy plik nie jest loickowany przez inny proces.
Mam nadzieję, że Ci to pomoże.
źródło
Miałem ten problem i zmiana Extended Properties na HTML Import naprawił go zgodnie z tym postem Marcusa Mirisa:
źródło
Zamiast OleDb można użyć programu Excel Interop i otworzyć arkusz jako tylko do odczytu.
https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.workbooks.open(v=office.15).aspx
źródło
ACE zastąpiło JET
Ace Obsługuje wszystkie poprzednie wersje pakietu Office
Ten kod działa dobrze!
źródło
Taka sytuacja może wystąpić, gdy skoroszyt jest chroniony hasłem. Istnieje kilka obejść, aby usunąć tę ochronę, ale większość przykładów, które znajdziesz w Internecie, jest nieaktualna. Tak czy inaczej, prostym rozwiązaniem jest ręczne wyłączenie ochrony skoroszytu, w przeciwnym razie użycie czegoś takiego jak OpenXML, aby programowo usunąć ochronę.
źródło
Niedawno widziałem ten błąd w kontekście, który nie pasuje do żadnej z wcześniej wymienionych odpowiedzi. Okazało się, że był to konflikt z AutoVerem . Obejście: tymczasowo wyłącz AutoVer.
źródło
Niedawno miałem ten „System.Data.OleDb.OleDbException (0x80004005): zewnętrzna tabela nie jest w oczekiwanym formacie”. wystąpił błąd. Polegałem na programie Microsoft Access 2010 Runtime. Przed aktualizacją, która została automatycznie zainstalowana na moim serwerze 12 grudnia 2018 r., Mój kod C # działał poprawnie przy użyciu dostawcy Microsoft.ACE.OLEDB.12.0. Po zainstalowaniu aktualizacji z 12 grudnia 2018 r. Zacząłem otrzymywać komunikat „Zewnętrzna tabela nie jest w oczekiwanym formacie” w moim pliku dziennika.
Porzuciłem środowisko wykonawcze programu Microsoft Access 2010 i zainstalowałem środowisko wykonawcze programu Microsoft Access 2013, a mój kod C # zaczął ponownie działać bez wyjątku „System.Data.OleDb.OleDbException (0x80004005): tabela zewnętrzna nie jest w oczekiwanym formacie”. błędy.
Wersja 2013, która naprawiła ten błąd https://www.microsoft.com/en-us/download/confirmation.aspx?id=39358
Wersja 2010, która działała dla mnie przed aktualizacją, która została automatycznie zainstalowana na moim serwerze 12 grudnia. https://www.microsoft.com/en-us/download/confirmation.aspx?id=10910 https://www.microsoft.com/en-us/download/confirmation.aspx?id=10910
Również ten błąd wystąpił w zeszłym miesiącu w zautomatyzowanym procesie. Kod C # działał poprawnie, gdy uruchomiłem debugowanie. Okazało się, że konto usługi, na którym działa kod, również wymaga uprawnień do folderu C: \ Windows \ Temp.
źródło
Mój zakres obejmuje pobranie szablonu i weryfikację szablonu, gdy jest wypełniony danymi.
1) Pobierz plik szablonu (.xlsx) z wierszem nagłówka. plik jest generowany przy użyciu openxml i działa doskonale.
2) Prześlij ten sam plik bez żadnych zmian w stosunku do stanu pobrania. Spowoduje to błąd połączenia i niepowodzenie (połączenie OLEDB jest używane do odczytu arkusza Excela).
Tutaj, jeśli dane są wypełnione, program działa zgodnie z oczekiwaniami.
Każdy, kto ma pomysł, że problem jest związany z plikiem, który tworzymy, jest w formacie xml formacie , jeśli go otworzymy i po prostu zapiszemy, przekonwertuj go do formatu Excel i działa dobrze.
Masz pomysł na pobranie programu Excel z preferowanym typem pliku?
źródło
Pracując ze starszym kodem, natrafiłem na ten sam ogólny wyjątek. Bardzo trudno jest wyśledzić problem, więc pomyślałem, że dodam tutaj na wypadek, gdyby ktoś inny pomógł.
W moim przypadku nie było kod gdzie indziej w projekcie, który został otwarcie StreamReader plik Excel przed OleDbConnection spróbowało otworzyć plik (zostało to zrobione w klasie bazowej).
Zasadniczo musiałem
Close()
najpierw wywołać obiekt StreamReader, a następnie pomyślnie otworzyć połączenie OleDb. Nie miało to nic wspólnego z samym plikiem Excela ani z ciągiem znaków OleDbConnection (który jest oczywiście tym, na co patrzyłem jako pierwszy).źródło