从Excel工作表导入时DateTime格式不匹配

时间:2009-06-08 13:50:44

标签: c#

我使用以下代码将数据从Excel工作表导入DataTable

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();

Excel表格中的Date列格式为dd/MM/yyyy。当日期为dd/MM/yyyy时(例如27/12/2009),上述代码失败。如何指定日期格式?

编辑(添加更多细节):

它没有抛出任何异常。数据将导入DataSet,直到遇到无效Date格式的行。我在Excel工作表中的日期为dd/MM/yyyy。当我使用OleDbDataAdapter导入时,期望Excel工作表中的日期位于MM/dd/yyyy。当遇到诸如27/2/2009之类的日期时,它自然会停止导入过程,但不会抛出任何错误/异常。所以我在DataTable只有部分结果。

请帮忙。

10 个答案:

答案 0 :(得分:4)

过去拉入日期或其他混合数据列项会让我使用Excel。

似乎他们的提供商“偷看”XX行(取决于提供商版本)以确定列类型在运行时。将属性应用于您的连接的先前答案在过去帮助了我,但是当列中有BLANK日期和/或不同的值时,帮助 - 它会混淆Excel驱动程序。

我建议您使用FileHelpers或其他第三方库。 Infragistics Excel组件对我很好,而FileHelpers是开源的。

答案 1 :(得分:2)

在MS Access中链接Excel电子表格时,如果列具有混合数据类型,则会出现问题。例如,如果列中的第一行是“Text”而其余的是Numeric,则Numeric字段将被格式化为Text和#Error out。同样,日期和非日期混合在同一列中。

在那里有一些很好的尝试答案,但是这里有简单解决方案来读取这些混合数据类型而没有数据类型不匹配错误:

尝试将“ IMEX = 1 ”添加到MS Access SQL,例如:

选择类型,宽度,重量

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

谢谢, Brian Jasmer

答案 2 :(得分:1)

您可以使用英国文化信息以英国格式解析日期dd / MM / YYYY

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

其中“27/12/2009”是您的日期字段

答案 3 :(得分:1)

我也面临同样的问题。 Excel工作表中的日期列为dd / MM / yyyy。但根据我的系统设置,数据格式为MM / dd / yyyy。因此,如果日期为31/07/2013,则日期字段显示为空字符串。

使用IMEX1和“Microsoft.ACE.OLEDB.12.0”驱动程序解决了问题。

“Provider = Microsoft.ACE.OLEDB.12.0; Data Source =”+ FilePath +“; Extended Properties ='Excel 12.0; HDR = Yes; IMEX = 1;'”

但是“Provider = Microsoft.Jet.OLEDB.4.0;” +“Data Source =”+ FilePath +“;扩展属性= Excel 8.0; IMEX = 1”不起作用。

答案 4 :(得分:0)

您有多少行,并且日期列中的所有单元格都是有效日期?如果前8行中的单元格中存在某些不一致,有时OleDB例程会错误地将列标识为文本。 (8是为确定数据类型而读取的默认行数)

答案 5 :(得分:0)

也许尝试格式化excel中的日期列然后导入?

答案 6 :(得分:0)

您可能需要检查当前运行的文化是否支持英国式日期。这是一个关于如何在线程级http://support.microsoft.com/kb/306162检查和更改此文化的链接

OleDb连接字符串似乎支持“; Locale Identifier =”。我认为eb-GB标识符是2057(不要引用我;)),你也可以尝试一下。

至于未被抛出的异常,我认为在填充期间,您可能希望根据此链接http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.rowupdated(VS.80).aspx查看RowUpdated事件。

这就是DataSet的Fill方法如何工作,它会在出现问题的行上退出,使用上面的事件你可能有一些忽略行或重新格式化的选项。

答案 7 :(得分:0)

您应该始终在连接字符串中指定的一件事是IMEX = 1:

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

它有助于解析包含数字和字符串的列。也可能有助于日期解析,但是你必须手动转换所有日期:

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

答案 8 :(得分:0)

如何以编程方式而不是通过数据适配器填充数据集?

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

答案 9 :(得分:0)

您可以使用此功能将收到的日期格式格式化为您需要的格式。

以下是代码:

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