【发布时间】:2014-01-07 12:49:02
【问题描述】:
我现在正在为工作编写大量的提取转换加载代码。为了更容易从 SSIS 中读取用户生成的 Excel 电子表格中的数据,我编写了一个小库,它从 Excel 文件中读取列标题布局,并将数据转储到 MS SQL 数据库中的表中,该表具有与 Excel 文件相同的架构。到目前为止它运行良好,但我遇到了一些奇怪的问题。
(是的,我知道 SSIS 本身就支持这样的东西。我选择的方法有技术原因,解释它们超出了本文的范围。)
问题在于,对于某些输入文件,任何包含日期信息的列都会被破坏。例如,当我执行导入时,日期字符串12/09/2013 被修改为41617; Dec 9, 2013 9:19:58 AM 变为 41617.388866。我正在检查它是否试图将12/09/2013 视为数学方程式,但(12/09)/2013 = 6.62361。此外,我检查了此电子表格上的单元格格式以及其他一些导入日期字段且没有错误的其他格式,并且在任何地方都是相同的 - 自定义、mm/dd/yyyy。
这里最大的问题是,由于我编写的过程的性质,一切都取决于我在运行时不知道文件的结构。我可以即时转换数据,但我不知道如何从41617 向后工作到12/09/2013。
DateTime.TryParse 也无济于事:
DateTime dt;
DateTime.TryParse("41617", out dt);
Console.WriteLine(dt.ToString());
输出
1/1/0001 12:00:00 AM
这是我遇到问题的电子表格的剥离、去标识化副本的链接:View / Download from Google Drive
我正在使用 OLE DB 连接字符串从 Excel (2007) 文件中读取数据:
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FilePath + ";Extended Properties = \"Excel 12.0 XML; HDR=YES; IMEX=1\";"
使用互操作类不是一种选择。它们没有在服务器上设置,作为承包商,我不太可能让 IT 进行设置。
然后,我使用 OleDbCommand(),它只针对 Excel 工作表运行 SELECT *,并用结果填充 DataSet。
这让我很困惑,如果能提供任何帮助,我将不胜感激。
【问题讨论】: