2011-11-22 26 views
1

我使用以下配置运行java程序以从excel文件中提取数据。其中一些列具有带时间戳上下文的数据。“已解决”使用ODBC查询Excel日期字段返回空值

  • 平台:Win 7(64)
  • ODBC:Excel中(X32)[经由办公室2010];要扫描的行数= 8
  • Excel架构:“某些字段”,“日期字段1”,“日期字段2”,“日期字段3”,“其他字段”
  • Excel中显示的日期格式:dd/mm/YYYY HH:MM
  • 爪哇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

在[日期字段2]的前几排的空值将在所有条件下的ODBC驱动程序返回NULL。因此找到了根本原因,接下来要找到Excel文件的替代JDBC驱动程序。

谢谢。

+0

你问是否JDBC可以处理空列(当然可以!)。还是你问如果你的代码遇到null时应该如何回应?还是你问完全其他的东西?请澄清。 – paulsm4

回答

1

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

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

或者,很多更好的解决方案是不使用Excel的ODBC驱动程序(这是出了名的错误和有限),而是使用Apache POI库,而不是原生读取Excel文件。你失去了查询的语法糖,但是通过活动行来查找数据的简单循环将会起到关键作用。

+0

感谢您的意见,但我仍然需要一个支持SQL的JDBC驱动程序来满足Excel的功能要求。 –

+1

如果您可以更改电子表格,那么您可以对行进行排序,以便在前八行中的至少一行中具有每个日期字段的值,或者可以插入一些虚拟数据,并将所有字段填入第一行的电子表格(并跳过查询中的那一行) – barrowc