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

comportamento

Strano 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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top