Quirky SELECT da file di Excel tramite il metodo OleDbDataAdapter (C #)
-
29-09-2019 - |
Domanda
Io ho un file di Excel in questa forma:
Column 1 Column 2 Column 3
data1 data2
data1 data2
data1 data2
data1 data2
data1 data2 data3
Cioè, tutta la colonna 3 è vuota ad eccezione dell'ultima riga. Io sono l'accesso al file Excel tramite OleDbDataAdapter, restituendo un DataTable: ecco il codice.
query = "SELECT * FROM [" + query + "]";
objDT = new DataTable();
objCmdSQL = this.GetCommand();
objCmdSQL.CommandText = query;
objSQLDad = new OleDbDataAdapter(objCmdSQL);
objSQLDad.Fill(objDT);
return objDT;
Il punto è, in questo scenario il mio codice restituisce un DataTable con appena Colonna 1 e Colonna 2.
La mia ipotesi è che cerca di motori a reazione per inferire tipo di colonna per il tipo della prima cella di ogni colonna; essendo il primo valore null, l'intera colonna viene ignorata.
Ho cercato di compilare zeri e questo codice è realmente restituendo le tre colonne; Questo è ovviamente la soluzione meno preferibile perché devo trattare un gran numero di file di piccole dimensioni.
Invertendo l'intervallo di selezione (da, ad esempio "A1: C5" a "C5: A1") non funziona neanche.
Sto cercando qualcosa di più elegante.
Ho già trovato un paio di post parlano tipo non corrispondente (cellule varchar colonne int e viceversa), ma in realtà non ho trovato nulla legati a questo.
Grazie per la lettura!
modifica
comportamentoStrano nuovo. Devo lavorare su Excel 2003 per lo più file .xls, ma poiché questa domanda è stato risposto pensavo di poter testare il mio codice contro Excel 2007 xslx file. La stringa di connessione è il seguente:
string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + _fileName.Trim() + @";Extended Properties=""Excel 12.0;HDR=No;IMEX=1;""";
ho la "tabella esterna non è nel formato previsto" eccezione, che mi sa che è l'eccezione standard quando v'è una mancata corrispondenza tra la versione ACE / JET e il file che si apre.
La stringa
Provider=Microsoft.ACE.OLEDB.12.0
significa che sto usando la versione più recente di OLE DB, ho preso una rapida occhiata in giro e questa versione è utilizzato ovunque ci sia bisogno di collegarsi a .xlsx.
Ho provato con un semplice fornitore di vaniglia (solo Excel 12.0, senza IMEX nè HDR) ma ottengo la stessa eccezione.
Sono in .NET 2.0.50727 SP2, forse il tempo per l'aggiornamento?
Soluzione
Ho ricreato la vostra situazione e seguito restituito correttamente le 3 colonne. Cioè, le prime due colonne completamente popolato con dati e la terza nullo contenente fino all'ultima fila, che aveva dati.
string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";";
DataTable dt = new DataTable();
OleDbConnection conn = new OleDbConnection(connString);
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn);
adapter.Fill(dt);
Si noti che ho usato il provider Access Database Engine(ACE)
, che è succeduto al vecchio provider Joint Engine Technology(JET)
, ei miei risultati possono rappresentare una differenza di comportamento tra i due. Naturalmente, se non si utilizza già lo suggerisco utilizzando il provider ACE
come credo Microsoft sarebbe troppo. Inoltre, nota Extended Properties
della connessione:
"HDR = Yes;" indica che la prima riga contiene columnnames e non i dati. "HDR = no;" indica il contrario.
"IMEX = 1;" dice al conducente di sempre leggere "mescolati" (numeri, date, stringhe ecc) colonne di dati come testo. Si noti che questa opzione potrebbe influenzare excel accesso foglio di scrittura negativo.
Fammi sapere se questo aiuta.