使用ODBC“解决”查询Excel日期字段返回null

时间:2011-11-22 05:49:07

标签: excel jdbc odbc

我使用以下配置运行java程序以从excel文件中提取数据。其中一些列具有带时间戳上下文的数据。

  • 平台:赢7(x64)
  • ODBC:Excel(x32)[通过Office 2010];要扫描的行= 8
  • Excel架构:“some fields”,“date field 1”,“date field 2”,“date field 3”,“other fields”
  • excel中显示的日期格式:dd / mm / yyyy HH:MM
  • Java 1.6
  • JDBC / ODBC驱动程序:sun.jdbc.odbc.JdbcOdbcDriver

我尝试了以下(简化)查询来提取数据:

SELECT [field 1], [date field 1], [date field 2] from [Sheet1$]

SELECT [field 1], [date field 1], [date field 2] from [Sheet1$] where [field 1] = "sample values"

我确定“日期字段2”包含有效的日期值(但是前20行已清空) 并且java程序始终为该列返回null。

所以,我的问题是初始行的[date field 2]的空值,即8行,会影响JDBC / ODBC的行为吗?如果是,如何避免它(没有对excel文件中的数据进行排序)?

- 编辑 - 实际上,我问的是前几行(比如说8)中该字段的空值是否会使驱动程序无法提取该列的值(即使后续行包含有效值)。我也很困惑,如果它是特定于实现的,驱动程序将简单地拒绝提取该字段,为所有条件返回null,甚至不尝试将列视为字符串类型或返回空字符串(而不是NULL)

- 编辑 - 请参阅此KB中的信息:http://support.microsoft.com/kb/141284

[date field 2]中前几行的空值将使ODBC驱动程序在所有条件下都返回NULL。因此找到了根本原因,接下来是为Excel文件找到替代JDBC驱动程序。

感谢。

1 个答案:

答案 0 :(得分:1)

如果前8行为空,则Excel ODBC驱动程序无法将列正确标识为日期列,因此尝试获取所有其他行的日期值将不会成功。没有办法解决这个问题,这不是特定于Java的问题。

我对JDBC不是很熟悉,但是如果你调用一个方法来返回字段的日期值,请尝试调用方法来提取字符串值,然后自己将字符串解析为日期值(如果这不起作用,调用返回浮点值的方法,因为这是Excel日期在内部存储的方式。)

或者,很多更好的解决方案是不使用Excel的ODBC驱动程序(这是众所周知的错误和有限的)并使用Apache POI库,它可以本地读取Excel文件。你失去了查询的语法糖,但是通过活动行来查找数据的简单循环就可以解决问题。