2010-08-20 17 views
5

Tengo un problema con la lectura de DateColumns de una hoja de Excel.¿Hay alguna manera de forzar a Microsoft.Jet.OLEDB a obtener Columnas de fecha en formato MM/DD/AAAA desde Excel?

A veces las personas usan formatos de fecha diferentes y esto trae un problema. Digamos que cuando espero 07/26/2010 de una columna de Excel obtengo 26-Jul-2010 porque el usuario ha cambiado su formato de fecha.

Uso Microsoft.Jet.OLEDB para leer la hoja xls en un DataTable.

¿Puedo de alguna manera forzar el lector OleDb independientemente de que el formato de fecha esté configurado en XLS, para convertir todas las fechas en formato MM/DD/YYYY?

utilizo este pedazo de código para leer el archivo de 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(); 
} 

Respuesta

4

No tiene que recorrer el conjunto de datos como se sugiere. Puede hacer que su consulta realice todo el formateo especificando en su consulta el formato que desea.
Un ejemplo es el siguiente:

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

Esto se garantiza que funcione todo el tiempo que está utilizando OLEDB de JET o el proveedor de datos OLE DB Ace. No puedo garantizar que funcionará con otros proveedores de datos, pero siempre puedes verificarlo.

+1

gracias Alex. ¿Conoce algún recurso que cubra el lenguaje de consulta utilizado por JET OLEDB? – pencilCake

+0

AFAIK, JET OLEDB se ejecuta en SQL y para ese propósito, uso un libro en SQL como referencia. (De allí obtuve la consulta.) El libro es SQL Fundamentals 3ed. por John J. Patrick. Es publicado por Prentice Hall. –

+0

Dado que JET es el motor detrás de Access, las consultas para Excel deben usar la misma sintaxis que Access. Entonces, los documentos de referencia de Access podrían ser de ayuda. –

1

bucle a través del conjunto de datos. Para cada fecha, encubrirlo a una fecha (en caso de que la celda haya sido modificada para ser texto), y luego formatee la fecha como una cadena de formulario "MM/DD/YYYY".

El código siguiente es un ejemplo para empezar:

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 y date2B será igual y en el formato que desea.

Hay un poco de conversión de ida y vuelta y es porque tendrá que validar la entrada del usuario ya que proviene de Excel y es muy fácil para un usuario ingresar datos que no se ajustarán a tu modelo de base de datos

Será una buena idea colocar todo en un bloque Try-Catch en caso de que algunas de las fechas ingresadas no sean válidas por sí mismas.

Cuestiones relacionadas