string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=localhost;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=2"
Ciao. Qual è lo scopo di IMEX?Che cos'è IMEX nella stringa di connessione OLEDB?
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=localhost;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=2"
Ciao. Qual è lo scopo di IMEX?Che cos'è IMEX nella stringa di connessione OLEDB?
"Se volete leggere le intestazioni delle colonne nel set di risultati (utilizzando HDR = NO anche se c'è un colpo di testa) e i dati della colonna è numerico, utilizzare IMEX = 1 per evitare incidente.
per utilizzare sempre IMEX = 1 è un modo più sicuro per recuperare i dati per le colonne di dati misti. .."
si prega di notare che il valore IMEX può essere molto importante quando si ha bisogno di scrivere di nuovo i dati in Excel. Una ricerca veloce su Internet su IMEX ha trovato numerosi articoli su problemi con vari valori IMEX
Quando si legge un file Excel in una tabella dati, la tabella dati legge i valori della colonna e dopo circa 8-10 record, sarà assegna il tipo di dati a una colonna. Per esempio, se i valori della colonna sono
11,0
22,0
33,0
44,0
55,0
66,0
77,0
88,0
99,0
abc
Quindi, la tabella dei dati non avrà il valore abc poiché alla colonna è stato assegnato il tipo di dati "Double". Per evitare questo, e per leggere i dati completi viene utilizzato IMEX = 1.
Si prega di commentare per ulteriori domande.
Si prega di utilizzare una funzione generalizzata in un modulo ...
Public Function DeleteBlankRowsfromDataset(ByRef Dtset As DataSet) As Boolean
Try
Dtset.Tables(0).AsEnumerable().Where(Function(row) row.ItemArray.All(Function(field) field Is Nothing Or field Is DBNull.Value Or field.Equals(""))).ToList().ForEach(Sub(row) row.Delete())
Dtset.Tables(0).AcceptChanges()
DeleteBlankRowsfromDataset = True
Catch ex As Exception
MsgBox("Deleting Blank Records in Dataset Failed")
DeleteBlankRowsfromDataset = False
End Try
End Function
C'è un potenziale problema durante la lettura di file di Excel con un'OleDbConnection.
Se si utilizza
"Extended Properties='Excel 8.0;HDR=NO;IMEX=3;'"
per una colonna come il seguente dove i primi 8 righe hanno 4 (o più) valori numerici, quindi il tipo è considerato essere numerici ei valori stringa vengono letti come nullo.
Si noti che l'intestazione non è utilizzata come intestazione qui (HDR = NO) quindi la riga "zipcode" è la prima riga. (Questi codici di avviamento postale sono dalla Svezia nel caso in cui non si riconosce il loro formato.)
1) zipcode
2) 125 45
3) 115 50
4) 18735
5) 11335
6) 13940
7) 181 55
8) 11759
9) 176 74
10) 137 38
ma se vi dati assomiglia a questo, in cui solo 3 sono numerica dei primi 8 righe
1) zipcode
2) 125 45
3) 115 50
4) 18735
5) 11335
6) 139 40 <-- This one changed so that it is a string
7) 181 55
8) 11759
9) 176 74
10) 137 38
poi funziona, legge tutto, come stringhe.
Quindi il primo caso è un problema. Ma c'è una soluzione.
Diciamo che si utilizza
"Extended Properties='Excel 8.0;HDR=YES;IMEX=1;'"
dove abbiamo cambiato IMEX a 1 e HDR a SÌ, allora sarà leggere i dati come stringhe in entrambi i casi di cui sopra. Ma diciamo abbiamo dati come questo
1) zipcode
2) 12545
3) 11550
4) 18735
5) 11335
6) 13940
7) 18155
8) 11759
9) 17674
10) 137 38
allora tutti i primi 8 righe di dati sono numerici e poi di nuovo errore, anche se abbiamo IMEX = 1.
È possibile risolvere questo problema nel modo seguente. Modificare la stringa di connessione a questa
"Extended Properties='Excel 8.0;HDR=NO;IMEX=1;'"
Avviso che abbiamo tenuto IMEX = 1, ma cambiato di nuovo HDR su NO.
Ora la riga 1 non viene più trattata come un'intestazione e "zipcode" è letti come dati e poiché è chiaramente una stringa, tutte le righe vengono lette come stringhe (è così che IMEX = 1 funziona).
Ci sono un paio di inconvenienti con questo metodo. Entrambi possono essere risolti:
1) Non è possibile fare riferimento alla colonna in base al suo nome (codice postale) ma è necessario utilizzare ad esempio F7 a seconda di dove si trova la colonna.
È possibile risolvere questo problema capire dove si trova la colonna codice postale (può essere fatto a livello di codice) e modificare il testo SQL di conseguenza cambia "codice postale" per esempio "F7".
2) Il valore "zipcode" verrà visualizzato nei dati.
Questo può essere risolto avendo F7 <> 'codice postale' nel tuo clausola WHERE. Uno potrebbe pensare che ciò contrasterebbe il fatto che abbiamo incluso lo zip (essendo una stringa) per assicurarci che tutte le righe siano trattate come stringhe. Dopo averlo provato, si scopre però che la clausola where che esclude "zipcode" non ha un effetto antagonista .
Grazie per la spiegazione dettagliata. Mi sto occupando di questo problema con il codice postale degli Stati Uniti. I codici postali a 5 cifre vengono considerati come valori doppi e i codici di avviamento postale 5-4 vengono ignorati poiché sono stringhe :( – Shiva
Ok, quindi per quanto riguarda IMEX = 2? –
Da qui: http://www.instantpages.ltd.uk/ADODB_WP.htm "MEX = 0 e IMEX = 2 risultato in ImportMixedTypes che viene ignorato e viene utilizzato il valore predefinito di 'MajorityType'." – kmp
Capito. Viene utilizzato per le colonne con tipo di dati misti. Grazie per le risposte –