2009-05-22 14 views
11

Używam klasy OleDbConnection do pobierania danych z Excel 2000/2003 skoroszycie:komórkowe Wartości Excel są obcinane przez OLEDB-provider

string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + 
          "Data Source=" + filename + ";" + 
          "Extended Properties=\"Excel 8.0;IMEX=1\";"; 

OleDbConnection connection = new OleDbConnection(connectionString); 
connection.Open(); 

// code to get table name from schema omitted 

var dataAdapter = new OleDbDataAdapter(string.Format("SELECT * FROM [{0}]", name),connection); 
var myDataSet = new DataSet(); 
dataAdapter.Fill(myDataSet, "ExcelInfo"); 

Teraz okazuje się, że komórki w arkuszu z długości większej ponad 255 znaków jest obcinanych. Czy jest to ograniczenie w dostawcy Microsoft.Jet.OLEDB, czy jest coś, co mogę z tym zrobić?

Ktoś?

Odpowiedz

17

Dostawca OLEDB dla programu Excel spróbuje automatycznie określić typy danych oparte na pierwszych 8 wierszach danych, można to ustawić za pomocą właściwości HDR = Tak/Nie w ciągu połączenia. Ponadto istnieje wiele typów, które można zastosować do kolumn tekstowych. Typ memo zawiera ponad 255 znaków, więc jeśli żaden z pierwszych 8 wierszy go nie ma, wówczas niepoprawnie ustawi typ danych.

Sposób zmiany to zmieniając ustawienie rejestru nazwie TypeGuessRows, jak opisano tutaj: Microsoft Support

UWAGA: Poprawny zakres wartości dla klucza TypeGuessRows wynosi od 0 do 16. Jednakże, jeśli wartość wynosi 0 , liczba skanowanych wierszy źródłowych to 16384. Więc jeśli masz bardzo duży plik, upewnij się, że pierwsze są największe.

+1

dzięki. Jest to nieco brzydkie rozwiązanie, ponieważ mój instalator będzie musiał zmodyfikować rejestr użytkownika, ale spodziewam się, że zadziała. Tak długo, jak administrator uruchamia instalator .. –

+1

Nie rozumiem sugestii microsofts tutaj/jeśli zmienisz go na 16, czy nie sprawdza się tylko pierwszych 16 wierszy ?? – leora

+1

@ooo Po zmianie na 0, skanuje wszystkie wiersze. Bądź jednak ostrożny, ponieważ może to mieć wpływ na wydajność większych tabel. – rmoore

1

Wypróbuj OleDBAdapter Excel QA Opublikowałem przez przepełnienie stosu.

I zaludnionych komórkę arkusza (Wiersze [0] [4]) w/445 znaków i to działało dobrze ... Dodaj to do końca kodu dla ouput

// DataSet:   
Object row0Col3 = ds.Tables["xlsImport"].Rows[0][2]; 
Object row0Col4 = ds.Tables["xlsImport"].Rows[0][4]; 

string rowZeroColumn3 = row0Col3.ToString(); 
string rowZeroColumn4 = row0Col4.ToString(); 

Console.WriteLine("Row 0, Col 4 string length: {0} " + Environment.NewLine + "Excel content: {1}", rowZeroColumn4.Length, rowZeroColumn4);   
Powiązane problemy