2009-05-22 23 views
11

che sto utilizzando la classe OleDbConnection per recuperare dati da un Excel 2000/2003 cartella di lavoro:cellulari valori di Excel vengono troncati da OLE DB 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"); 

Ora si scopre che le cellule nel foglio di lavoro con lunghezza superiore di 255 caratteri vengono troncati. Si tratta di una limitazione nel provider Microsoft.Jet.OLEDB o c'è qualcosa che posso fare al riguardo?

Chiunque?

risposta

17

Il provider OLEDB per excel tenterà di determinare automaticamente i DataTypes in base alle prime 8 righe di dati, questo può essere impostato con HDR = Sì/Nessuna proprietà nella stringa di connessione. Inoltre, esistono diversi tipi che può essere applicato alle colonne di testo. Il tipo di memo contiene oltre 255 caratteri, quindi se nessuna delle prime 8 righe lo ha, allora imposterà erroneamente il tipo di dati.

Il modo per cambiare questo è modificando un'impostazione del Registro chiamato TypeGuessRows, come descritto qui: Microsoft Support

NOTA: L'intervallo valido di valori per la chiave TypeGuessRows è da 0 a 16. Tuttavia, se il valore è 0 , il numero di righe di origine scansionate è 16384. Quindi se hai un file molto grande assicurati che le prime file siano le prime.

+1

Grazie. È una soluzione un po 'brutta, in quanto il mio installatore dovrà modificare il registro dell'utente, ma mi aspetto che funzioni. Finché un amministratore esegue il programma di installazione .. –

+1

non capisco il suggerimento di microsofts qui/se lo cambi a 16 non basta controllare le prime 16 righe ?? – leora

+1

@ooo Se lo si cambia a 0, esegue la scansione di tutte le righe. Fai attenzione però perché questo può avere un impatto sulle prestazioni su tavoli più grandi. – rmoore

1

Prova questo OleDBAdapter Excel QA Ho postato tramite stack overflow.

ho popolato una cella del foglio di lavoro (Righe [0] [4]) w/445 caratteri e ha funzionato bene ... Aggiungere questo alla fine del codice per l'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);   
Problemi correlati