【问题标题】:oledb excel some date-columns return nulloledb excel 一些日期列返回 null
【发布时间】:2019-04-26 12:13:31
【问题描述】:

我正在通过 oledb 读取 xlsx 文件。有些行的列(包含日期字符串)返回 null,有些行的列(也包含日期字符串)返回日期字符串。在 excel 中,列类型设置为“日期”。

这是我的连接字符串:

$"Provider=Microsoft.ACE.OLEDB.12.0;数据 源={PATH_TO_FILE};扩展属性=\"Excel 12.0 Xml;HDR=NO\""

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

$"SELECT * FROM [SHEET_NAME$A4:BC] WHERE F1 不为空"

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

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 文档的屏幕截图,其中我在返回值为空的地方标记了一条红色的行,在返回实际日期字符串的地方标记为绿色:

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

为什么这些行返回一个空值而不是日期字符串?


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

【问题讨论】:

  • 日期是否以可接受的 mm.dd.yyyy 格式工作,而失败的日期是 dd.mm.yyyy? IE。美国 vs 英国格式。
  • "18.07.2011" 返回日期字符串,对 "mm.dd.yyyy" 无效。

标签: c# excel oledb


【解决方案1】:

我无法解决问题,但能够通过将 Excel 中的列类型更改为文本来绕过它。

我必须复制整个 xls 文件,删除副本的内容,将列类型设置为文本,从第一个文件复制内容并将其粘贴到第二个文件中。否则 Excel 会将日期字符串更改为用于存储日期的数字。

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

【讨论】:

    【解决方案2】:

    为时已晚两年,但在为此苦苦挣扎了几个小时后,我希望这可能对某人有所帮助:

    听起来您的 Excel 文档中的第一行可能包含列名而不是实际数据,这意味着它们属于不同的 Excel 数据类型(常规/文本 + 日期时间)。

    要处理的修复非常简单 - 使用扩展属性中的 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 字段,这会导致此行为

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 2021-03-15
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多