c# - .NET DataTable 正在处理 Excel 文件中的日期字段

标签 c# .net excel oledb etl

我现在正在为工作编写大量 Extract Transform Load 代码。为了更容易从 SSIS 中读取用户生成的 Excel 电子表格中的数据,我编写了一个小库,它从 Excel 文件中读取列标题布局,并将数据转储到 MS SQL 数据库中的表中,该数据库具有与 Excel 文件相同的架构。到目前为止它运行良好,但我遇到了一些奇怪的问题。

(是的,我知道 SSIS 本身就支持这样的东西。我选择的方法有技术原因,解释它们超出了本文的范围。)

问题是对于某些输入文件,任何包含日期信息的列都会被破坏。例如,当我执行导入时,日期字符串 12/09/2013 被破坏为 416172013 年 12 月 9 日上午 9:19:58 变为 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\";"

使用 Interop 类不是一种选择。它们未在服务器上设置,作为承包商,我不太可能让 IT 部门进行设置。

然后,我使用一个 OleDbCommand(),它只针对 Excel 工作表运行 SELECT *,并用结果填充数据集。

这让我非常难过,如果有任何帮助,我将不胜感激。

最佳答案

尝试使用

DateTime.FromOADate(value)

关于c# - .NET DataTable 正在处理 Excel 文件中的日期字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20972085/

相关文章:

c# - 在 C# 中实现 SNMP Reporter(代理)(必须在 Mono 上运行)?

c# - 如何创建具有热插拔能力的松散耦合架构?

excel - 检测(在 VBA 中)包含 Excel 实例的窗口何时变为事件状态

c# - 是否有任何内置函数用于字符串包含或不包含货币符号?

c# - 如何在自定义方法中处理错误的参数值?

c# - 将c#的datetimepicker值存储到mysql数据库中

vba - 将预定义的 excel 函数应用于 VBA for 循环数组以创建新函数

c# - 防止在 ASP.NET Webforms 中过度发布

c# - 使用枚举值创建泛型类型

vba - 展平工作表中的循环