oledb excel 一些日期列 return 空

oledb excel some date-columns return null

我正在通过 oledb 读取 xlsx 文件。有些行的列(包含日期字符串)return 为空,有些行的列(也包含日期字符串)return 为日期字符串。在 excel 中,列类型设置为 "date"。

这是我的连接字符串:

$"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={PATH_TO_FILE};Extended Properties=\"Excel 12.0 Xml;HDR=NO\""

这里是查询数据的命令文本:

$"SELECT * FROM [SHEET_NAME$A4:BC] WHERE F1 IS NOT NULL"

这是我从数据记录中读取数据的方式:

var test = dataRecord.GetValue(dataRecord.GetOrdinal("F39"));

这是检查员在测试包含日期字符串时向我展示的一些示例:

{07.01.1975 00:00:00}
{03.08.1987 00:00:00}
{03.10.1988 00:00:00}
{01.05.1969 00:00:00}
{20.12.2016 00:00:00}
{18.07.2011 00:00:00}

在其他情况下,检查器只显示:

{}

这是 xlsx 文档的屏幕截图,其中我用红色标记了一条线,其中 return 值是空的,而绿色是实际日期字符串是 returned:

日期字符串的格式类似于 dd.mm.yyyy

为什么这些行 return 是空值而不是日期字符串?


正如 AndyG 所建议的,我已经检查了日期字符串值是否可能因格式的依赖而失败("dd.mm.yyyy" 与 "mm.dd.yyyy")。但是有些情况对 "mm.dd.yyyy" 无效但不会失败。

我没能解决问题,但通过将 Excel 中的 column-type 更改为文本可以绕过它。

我不得不复制整个xls-file,删除复制的内容,将column-type设置为文本,从第一个文件复制内容并粘贴到第二个文件中。否则 Excel 将 date-strings 更改为用于存储日期的数字。

现在我可以正确读取单元格了。

两年太晚了,但在为这个问题苦苦挣扎了好几个小时之后,我希望这能对某人有所帮助:

听起来您的 excel 文档中的第一行可能包含列名而不是实际数据,这意味着它们属于不同的 Excel 数据类型(General/Text + DateTime) .

要处理的修复非常简单 - 使用扩展属性中的 HDR 属性 调整您的连接字符串以反映这一点:

$"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={PATH_TO_FILE};Extended Properties=\"Excel 12.0 Xml;HDR=YES\""

HDR = true 表示第一行包含字段名称

您可以在此处阅读更多相关信息: https://www.connectionstrings.com/ace-oledb-12-0/

此外,如果您像 OP 一样在文档中的奇数行遇到此问题,请确保整个列的数据类型相同,但列标题除外(如果使用 HDR=true) Excel 有时可以将 DateTime 字段翻转为 General 字段,这会导致此行为