2015-07-28 14 views
6

Sto scrivendo una libreria C# per leggere in file Excel (sia xls che xlsx) e sto riscontrando un problema.Estrazione dati Excel - Problema con tipo di dati colonna

Esattamente come quello che è stato espresso in this question, se il mio file di Excel ha una colonna che ha valori di stringa, ma ha un valore numerico in prima fila, il provider OLE DB presuppone che colonna sia numerica e restituisce NULL per la valori in quella colonna che non sono numerici.

Sono consapevole del fatto che, come in the answer provided, posso apportare una modifica al registro, ma poiché si tratta di una libreria che prevedo di utilizzare su molte macchine e non voglio modificare i valori di registro di ogni utente, mi chiedevo se c'è una soluzione migliore.

Forse un provider DB diverso da ACE.OLEDB (e sembra che JET non sia più supportato abbastanza bene da essere considerato)?

Inoltre, poiché questo deve funzionare su XLS/XLSX, opzioni come i lettori EPPlus/XML non funzioneranno per la versione xls.

+0

Il modo in cui ho questo problema attualmente è quello di utilizzare l'interfaccia di Excel COM e un po 'C#, per aprire il file in Excel e ri-salvare come '.csv' file. Ho anche una macro che viene caricata ed eseguita per riordinare le cose ma in questo modo rimuove tutta la formattazione e consente un'importazione più semplice. – AeroX

+0

Grazie, @AeroX, stavo pensando a questo, ma sto cercando di evitare Interop se possibile dal momento che apre dozzine di altre lattine di vermi :) ... Spero che qualcun altro abbia un'altra soluzione, ma grazie così molto per condividere il tuo metodo !! –

+0

Utilizzare invece Sdk OpenXml. –

risposta

1

la stringa di connessione dovrebbe essere simile

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcelfile.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1"; 

IMEX = 1 nella stringa di connessione è la parte che è necessario trattare la colonna come tipo di dati misti. Questo dovrebbe funzionare bene senza la necessità di modificare il registro.

HDR = Sì è semplicemente per contrassegnare la prima riga come intestazioni di colonna e non è necessaria per il tuo particolare problema, tuttavia l'ho incluso comunque.

Per utilizzare sempre IMEX = 1 è un modo più sicuro per recuperare i dati per colonne di dati misti.

Fonte: https://www.connectionstrings.com/excel/

Edit:

Ecco i dati che sto utilizzando:

data

Ecco l'output:

enter image description here

.210

Questo è il codice esatto che ho usato:

string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\test.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"""; 

using (DbClass db = new DbClass(connString)) 
{ 
    var x = db.dataReader("SELECT * FROM [Sheet1$]"); 
    while (x.Read()) 
    { 
     for (int i = 0; i < x.FieldCount; i++) 
      Console.Write(x[i] + "\t"); 
     Console.WriteLine(""); 
    } 
} 

Il dbClass è un semplice involucro che ho fatto al fine di rendere la vita più facile. Si può trovare qui:

http://tech.reboot.pro/showthread.php?tid=4713

+0

KoBe, ho letto anche questo e ho impostato IMEX = 1, ma non ha funzionato .... –

+0

FYI, purtroppo, Kobe, l'ho trovato online e sembra avere senso: 'imposta" IMEX = 1 "in la sezione Proprietà estese della stringa di connessione. Questo impone l'ImportMixedTypes = Impostazione del registro di testo. È possibile modificare l'imposizione del tipo modificando [HKLM \ Software \ Microsoft \ Jet \ 4.0 \ Engines \ Excel \ ImportMixedTypes] in formato numerico. '- Fondamentalmente IMEX = 1 rinforza le impostazioni del registro, ma non è abbastanza buono di per sé. –

+0

Ho aggiunto il codice esatto che ho usato per testare. Puoi fornire un link a dove l'hai trovato? Inoltre, non ho quelle impostazioni di registro, per JET o ACE. Quindi, non vedo come possa essere così. – Cory