从Excel工作表导入时DateTime格式不匹配
我正在使用以下代码将数据从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
dd/MM/yyyy
27/12/2009
)。 如何指定日期格式?
编辑(添加更多细节):
它没有抛出任何exception。 将数据导入DataSet
直到遇到无效Date
格式的行。 我在Excel表格中的日期为dd/MM/yyyy
。 当我使用OleDbDataAdapter
导入时,期望Excel工作表中的日期为MM/dd/yyyy
。 当它遇到诸如27/2/2009
之类的日期时,它会自然地停止导入过程,但不会抛出任何错误/exception。 所以我在DataTable
中只有部分结果。
请帮忙。
过去拉入日期或其他混合数据列项会让我用Excel。
似乎他们的提供者“偷看”XX行(取决于Provider版本)以确定列类型在运行时是什么。 将属性应用于连接的先前答案在过去帮助了我,但是当列中有BLANK日期和/或不同的值时,它们没有帮助 – 它会混淆Excel驱动程序。
我建议您使用FileHelpers或其他第三方库。 Infragistics Excel组件对我很好,而FileHelpers是开源的。
在MS Access中链接Excel电子表格时,如果列具有混合数据类型,则会出现问题。 例如,如果列中的第一行是“Text”而其余的是Numeric,则Numeric字段将被格式化为Text和#Error out。 同样,日期和非日期混合在同一列中。
在那里有一些很好的尝试答案,但这里是一个简单的解决方案来读取这些混合数据类型没有数据类型不匹配错误:
尝试将“ IMEX = 1 ”添加到MS Access SQL,例如:
选择类型,宽度,重量
来自[Excel 8.0; IMEX = 1 ; DATABASE = C:\ TEMP \ MySpreadsheet.xls] .MyExcelTable
谢谢,Brian Jasmer
您可以使用英国文化信息以英国格式dd / MM / YYYY解析日期
CultureInfo culture = new CultureInfo("en-GB"); DateTime date = DateTime.Parse("27/12/2009", culture);
其中“27/12/2009”是您的日期字段
您有多少行,并且是日期列有效日期中的所有单元格? 如果前8行中的单元格中存在某些不一致,有时OleDB例程会错误地将列标识为文本。 (8是为确定数据类型而读取的默认行数)
也许尝试格式化excel中的日期列然后导入?
您可能想要检查您当前运行的文化是否支持英国式日期。这是一个如何在线程级别检查和更改此链接的链接http://support.microsoft.com/kb/306162
OleDb连接字符串似乎支持“; Locale Identifier =”。 我认为eb-GB标识符是2057(不要引用我;)),你也可以尝试一下。
至于不被抛出的exception,我认为在填充期间,您可能希望根据此链接查看RowUpdated事件http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.rowupdated (VS.80).aspx 。
这就是DataSet的Fill方法如何工作它将在有问题的行上退出,使用上面的事件你可能有一些忽略行或重新格式化的选项。
您应该始终在连接字符串中指定的一件事是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);
如何以编程方式而不是通过数据适配器填充数据集?
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
您可以使用此function将您收到的任何日期格式格式化为您需要的格式。
这是代码:
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
我也遇到了同样的问题。 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”不起作用。