2010-08-20 2 views
5

Ho un problema con la lettura di DateColumns da un foglio Excel.Esiste un modo per forzare Microsoft.Jet.OLEDB a ottenere le colonne di data nel formato MM/GG/AAAA da Excel?

A volte le persone utilizzano formati di data diversi e questo comporta un problema. Diciamo che quando mi aspetto 07/26/2010 da una colonna di Excel ottengo 26-Jul-2010 perché l'utente ha cambiato il formato della data.

Io uso Microsoft.Jet.OLEDB per leggere il foglio xls in un DataTable.

Posso forzare in qualche modo il lettore OleDb qualunque sia il DateFormat impostato su XLS, per convertire tutte le date nel formato MM/GG/AAAA?

Io uso questo pezzo di codice per leggere il file di Excel:

string strConn; 
strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;" + 
      "Data Source=" + uploadedFileInfo.FullName + ";" + 
      @"Extended Properties=""Excel 8.0;HDR=NO;"""; 


using (OleDbConnection connToExcel = new OleDbConnection(strConn)) 
{ 
    //You must use the $ after the object you reference in the spreadsheet 
    connToExcel.Open(); 

    string firstSheetName = ExcelUploadedFileReaderBuilder 
          .GetFirstExcelSheetName(connToExcel); 

    OleDbDataAdapter myCommand 
    = new OleDbDataAdapter(String.Format("SELECT * FROM [{0}]", firstSheetName), connToExcel); 

    DataSet myDataSet = new DataSet(); 

    myCommand.Fill(myDataSet, "uploadedExcelTable"); 

    DataTable dtUploadedExcel = myDataSet.Tables["uploadedExcelTable"]; 

    lineCount = GetLineNumberWhereNULLRowOccured(dtUploadedExcel) + 1; 

    connToExcel.Close(); 
} 

risposta

4

Non è necessario scorrere il set di dati come suggerito. Puoi fare in modo che la query esegua tutta la formattazione specificando nella query il formato desiderato.
Un esempio è il seguente:

OleDbDataAdapter myCommand = 
    new OleDbDataAdapter("SELECT FORMAT([DateCol], 'MM/dd/yyyy') as [DateCol] FROM [SheetName]", connToExcel); 

Questo è garantito il funzionamento fino a quando si sta utilizzando OLE DB JET o il provider di dati OLE DB Ace. Non posso garantire che funzionerà con altri fornitori di dati ma puoi sempre controllare.

+1

grazie Alex. Conosci qualche risorsa che copre il linguaggio di query che viene utilizzato da JET OLEDB? – pencilCake

+0

AFAIK, JET OLEDB gira su SQL ea tale scopo, utilizzo un libro su SQL come riferimento. (Ecco da dove ho ottenuto la query.) Il libro è SQL Fundamentals 3ed. di John J. Patrick. È pubblicato da Prentice Hall. –

+0

Poiché JET è il motore di Access, le query per Excel devono utilizzare la stessa sintassi di Access. Quindi i documenti di riferimento di Access potrebbero aiutare. –

1

loop attraverso il set di dati. Per ogni data, copiarlo in una data (nel caso in cui la cella sia stata modificata per essere testo), quindi formattare la data come una stringa di modulo "MM/GG/AAAA".

Il codice seguente è un esempio per iniziare:

string date1 = "07/26/2010"; 
string date2 = "26-Jul-2010"; 

DateTime dt1 = Convert.ToDateTime(date1); 
DateTime dt2 = Convert.ToDateTime(date2); 

string date1B = dt1.ToString("MM/DD/YYYY"); 
string date2B = dt2.ToString("MM/DD/YYYY"); 

date1B e date2B sarà uguale e nel formato che desiderate.

C'è un po 'di conversione avanti e indietro in corso e questo è dovuto al fatto che è necessario convalidare l'input dell'utente poiché proviene da Excel ed è molto facile per un utente inserire dati che non saranno conformi modello di database.

Sarà una buona idea mettere tutto in un blocco Try-Catch nel caso in cui alcune delle date immesse non siano date valide.

Problemi correlati