C'è un modo per forzare Microsoft.Jet.OLEDB per ottenere la data di colonne in MM / DD / YYYY formato da Excel?

StackOverflow https://stackoverflow.com/questions/3532197

Domanda

Sto avendo un problema con la lettura DateColumns da un foglio excel.

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

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

Posso in qualche modo costringo lettore OleDb qualunque sia il DateFormat è impostato su XLS, per convertire tutte le date in MM / DD / YYYY formato?

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();
}
È stato utile?

Soluzione

Non c'è bisogno di scorrere il set di dati come suggerito. Si può avere la query fare tutto il formattazione per voi specificando nella query formato desiderato.
Un esempio è il seguente:

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

Questa è 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 si può sempre controllare.

Altri suggerimenti

Loop attraverso il set di dati. Per ogni data, convertirlo in una data (nel caso la cella è stata modificata per essere testo), quindi formattare la data come una stringa di forma "MM / GG / AAAA".

Il seguente codice è 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 saranno uguali e nel formato che desiderate.

C'è un po 'di avanti e indietro la conversione in corso e che è perché è necessario l'input dell'utente validate dal momento che è venuta da Excel ed è molto facile per un utente di immettere dati che non saranno conformi con voi modello di database.

Sarà una buona idea di mettere tutto in un blocco try-catch in caso alcune delle date immesse non sono date valide stessi.

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