2010-07-08 12 views
5

Używam OleDB do odczytu pliku Excel. Jedna z kolumn ma format "Wspólny" i zawiera oba ciągi z literami i wartościami składającymi się tylko z liczb. Wartości łańcuchowe są pobierane bez problemu, ale czyste wartości numeryczne są pobierane jako DBNull.DBNull w niepustej komórce podczas odczytu pliku Excel przez OleDB

Jak rozwiązać?

używam następujący ciąg połączenia, aby otworzyć Excel 2003 plików (xls):

"Provider=Microsoft.Jet.OLEDB.4.0; 
Data Source=C:\\file.xls; 
Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"" 

Odpowiedz

6

Znalazłem kilka dokumentacji na stronie internetowej firmy Microsoft, które odnoszą się do scenariusza. Zalecają konwersję wszystkich liczb na ciągi.

http://support.microsoft.com/kb/257819

Jak stwierdzono wcześniej, ADO musi odgadnąć typu danych dla każdej kolumny w arkuszu Excel lub zakresu. (To nie ma wpływu na ustawienia formatowania komórek Excel.) Poważny problem może wystąpić, jeśli wartości numeryczne są mieszane z wartościami tekstowymi w tej samej kolumnie. Zarówno dostawca Jet, jak i ODBC zwracają dane typu większości, ale zwracają wartości NULL (puste) dla typu danych mniejszości. Jeśli oba typy są równomiernie wymieszane w kolumnie, dostawca wybiera numerycznie ponad tekst.

Na przykład:

* In your eight (8) scanned rows, if the column contains five (5) numeric values and three (3) text values, the provider returns five (5) numbers and three (3) null values. 
* In your eight (8) scanned rows, if the column contains three (3) numeric values and five (5) text values, the provider returns three (3) null values and five (5) text values. 
* In your eight (8) scanned rows, if the column contains four (4) numeric values and four (4) text values, the provider returns four (4) numbers and four (4) null values. 
+3

Dodałem 'IMEX = 1', aby wymusić tryb tekstowy (muszę pobrać te komórki jako tekstowe, a nie numeryczne), ale to nie pomogło. Niemożliwe jest ponowne wprowadzenie wartości w trybie tekstowym, ponieważ istnieje wiele z nich. Czy można to jakoś zautomatyzować? – flashnik

+0

Co się stanie, jeśli skorzystasz z tej sugestii użycia zapytania zamiast bezpośredniej nazwy tabeli/arkusza? Niewielką wadą jest to, że wszystkie kolumny występują wówczas jako ciągi. http://munishbansal.wordpress.com/2009/12/15/importing-data-from-excel-having-mixed-data-types-in-a-column-ssis/ – jdot

1

Mam ten sam problem, ale z ciągów znaków. Wartości liczbowe są zwracane, ale wartości łańcuchowe są zwracane jako NULL. Chcę załadować wartości numeryczne jako wartości ciągów. Kolumna może zawierać cyfry i kody nieliczbowe (na przykład: 100344567 i PRD001X01).

Sterownik programu Excel uważa, że ​​kolumna jest typu numerycznego, ponieważ wartości w pierwszych 8 wierszach są typu numerycznego.

Nawet jeśli zdefiniuję komórki jako Tekst (Format komórki), to nie działa.

Aby zmusić kierowcę do "zobaczenia" kolumny jako napisu, po prostu umieściłem cytat przed wartością liczbową ("100344567). Przekształca to wartość liczbową w ciąg znaków.

Ta wartość 8 wierszy jest zdefiniowana w rejestrze HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel \ -> TypeGuessRows = 8.

Mam nadzieję, że to pomoże.

Powiązane problemy