Falta de coincidencia del formato de DateTime en la importación desde la hoja de Excel

Estoy importando datos de una hoja de Excel a un DataTable usando el siguiente código:

 OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties=Excel 8.0"); con.Open(); _myDataSet = new DataSet(); OleDbDataAdapter myCommand = new OleDbDataAdapter(" SELECT * FROM [" + "Sheet1" + "$]", con); myCommand.Fill(_myDataSet); con.Close(); 

Tengo una columna de Date en la hoja de Excel en el formato dd/MM/yyyy . El código anterior falla cuando la fecha es dd/MM/yyyy (p. Ej., 27/12/2009 ). ¿Cómo especificar el formato de fecha?

EDITAR (añadiendo más detalles):

No está lanzando ninguna excepción. Los datos se importan al conjunto de datos hasta la fila donde se encuentra un formato de Date no válido. Tengo la fecha como dd/MM/yyyy en la hoja de Excel. Cuando importo usando OleDbDataAdapter , se espera que la fecha en la hoja de Excel esté en MM/dd/yyyy . No, naturalmente, cuando encuentra una fecha como 27/2/2009 , detiene el proceso de importación, aunque no se produce ningún error / excepción. Así que estoy teniendo solo resultados parciales en DataTable .

Por favor ayuda.

La introducción de elementos de fecha u otra columna de datos mixtos en el pasado me ha mordido con Excel.

Parece que su proveedor “se asoma” por delante de las filas XX (según la versión del Proveedor) para determinar cuál es el tipo de columna en tiempo de ejecución . Las respuestas anteriores que aplican propiedades a su conexión me han ayudado en el pasado, pero no ayudan cuando tiene fechas en BLANCO y / o valores diferentes en la columna en sí misma, confunde el controlador de Excel.

Lo que recomiendo es que use FileHelpers u otra biblioteca de terceros. El componente de Excel de Infragistics me ha tratado muy bien, mientras que FileHelpers es OpenSource.

Al vincular las hojas de cálculo de Excel en MS Access, surge un problema cuando una columna tiene tipos de datos mixtos. Por ejemplo, si la primera fila de la columna es “Texto” y las restantes son Numéricas, los campos Numéricos se formatearán como Texto y #Error out. Igualmente con fechas y no fechas mezcladas en la misma columna.

Hay algunos buenos bashs de respuestas allí, pero aquí está la solución simple para leer estos tipos de datos mixtos sin un error de coincidencia de tipos de datos:

Intente agregar ” IMEX = 1 ” a su MS Access SQL, como por ejemplo:

SELECCIONE Tipo, Ancho, Peso

DE [Excel 8.0; IMEX = 1 ; DATABASE = C: \ TEMP \ MySpreadsheet.xls] .MyExcelTable

Gracias, Brian Jasmer

Puede usar la información de la cultura británica para analizar la fecha en formato británico dd / MM / YYYY

 CultureInfo culture = new CultureInfo("en-GB"); DateTime date = DateTime.Parse("27/12/2009", culture); 

donde “27/12/2009” es tu campo de fecha

¿Cuántas filas tiene, y todas las celdas en la columna de fecha son fechas válidas? A veces, las rutinas de OleDB identificarán incorrectamente una columna como texto si hay alguna inconsistencia en las celdas de las primeras 8 filas. (8 es el número predeterminado de filas que se lee para determinar los tipos de datos)

Tal vez intente formatear la columna de fecha en Excel y luego importar?

Es posible que desee comprobar que la cultura actual que se está ejecutando admite fechas de estilo del Reino Unido. Aquí hay un enlace sobre cómo verificar y cambiar esto en el nivel de subproceso http://support.microsoft.com/kb/306162

La cadena de conexión OleDb parece admitir “; Locale Identifier =”. Creo que el identificador eb-GB es 2057 (No me cites;)), también puedes intentarlo.

En cuanto a las excepciones que no se lanzan, creo que durante el relleno es posible que desee ver los eventos RowUpdated en este enlace http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.rowupdated (VS.80) .aspx .

Así es como funciona el método de relleno del conjunto de datos que se cerrará en la fila donde hay un problema. Al usar los eventos anteriores, es posible que tenga algunas opciones para ignorar la fila o reformatearla.

Una cosa que siempre debes especificar en tu cadena de conexión es IMEX = 1:

 Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties=\"Excel 8.0;IMEX=1\" 

Ayuda a analizar columnas que contienen tanto números como cadenas. También podría ayudar con el análisis de fecha, pero luego tendría que convertir manualmente todas las fechas con:

 System.IFormatProvider format = new System.Globalization.CultureInfo("en-US", true); DateTime d = DateTime.Parse(dataSet.Tables[0].Rows[i]["MyDate"] as string,format); 

¿Qué hay de llenar el conjunto de datos mediante progtwigción en lugar de a través de un adaptador de datos?

 OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties=Excel 8.0"); Dim _myDataSet As New DataSet Dim con As New OleDb.OleDbConnection con.Open() Dim cmd As New OleDb.OleDbCommand(" SELECT * FROM [" + "Sheet1" + "$]", con) Using dr = cmd.ExecuteReader() While dr.Read Dim row = _myDataSet.Tables(0).NewRow() With dr.Item("excel date column").ToString Dim dt As New Date(CInt(.Substring(6)), CInt(.Substring(3, 2)), CInt(.Substring(0, 2))) row.Item("dataset datecolumn") = dt End With \*'populate other columns here' *\ _myDataSet.Tables(0).Rows.Add(row) End While End Using 

Puede usar esta función para formatear cualquier formato de fecha que recibió al formato que necesita.

Aquí está el código:

 Public Shared Function ConvertToDate(ByVal dateString As String, ByRef result As DateTime) As Boolean Try 'Here is the date format you desire to use Dim supportedFormats() As String = New String() {”dd/MM/yyyy”} 'Now it will be converted to what the machine supports result = DateTime.ParseExact(dateString, supportedFormats,System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None) Return True Catch ex As Exception Return False End Try End Function 

También me enfrenté al mismo problema. La columna Fecha en la hoja de Excel es dd / MM / aaaa. Pero según la configuración de mi sistema, el formato de datos es MM / dd / aaaa. Por lo tanto, si la fecha es 31/07/2013, por ejemplo, el campo Fecha se muestra como una cadena vacía.

El uso de IMEX1 junto con el controlador “Microsoft.ACE.OLEDB.12.0” solucionó el problema.

“Proveedor = Microsoft.ACE.OLEDB.12.0; Fuente de datos =” + FilePath + “; Propiedades extendidas = ‘Excel 12.0; HDR = Sí; IMEX = 1;'”

Pero “Provider = Microsoft.Jet.OLEDB.4.0;” + “Fuente de datos =” + FilePath + “; Propiedades extendidas = Excel 8.0; IMEX = 1” no funciona.