我正在尝试从电子表格中读取日期列和时间列。我可以从工作表中删除日期列,但不能删除时间列。
例如,我的工作表将包含以下形式的行:
日期时间
11/2/2012 12:15:01
我有以下代码来获取日期列:
while(cellIterator.hasNext()) {
HSSFCell cell = (HSSFCell)cellIterator.next();
switch(cell.getCellType()){
case HSSFCell.CELL_TYPE_NUMERIC:
HSSFCellStyle style = cell.getCellStyle();
if (HSSFDateUtil.isCellDateFormatted(cell))
{
d = (Date)getDateValue(cell);
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
System.out.println(dateFormat.format(d));
}
}
}
protected static Object getDateValue(HSSFCell cellDate)
{
double numericDateValue = cellDate.getNumericCellValue();
Date date = HSSFDateUtil.getJavaDate(numericDateValue);
return date;
}
如你所见,我使用
HSSFDateUtil.isCellDateFormatted(cell)
检查单元格中是否有日期值。我想知道我是否可以使用任何函数检查单元格是否具有时间值。
Excel 工作表来自外部来源。所以,我将无法对其格式进行任何修改。
现在,我得到了日期列的正确日期值。但是,对于时间列,我得到了
12/31/1899
作为所有行的结果
最佳答案
Excel 中日期和时间的快速入门。由于在创建文件格式时很有意义但现在看起来很困惑的原因,Excel 没有 Date 或 Time 或 DateTime 类型。相反,它拥有的是数字和特殊的格式规则。
如何查看?在 Excel 单元格中键入 10.5,然后将其格式化为日期 + 时间。您将在 1900 年 1 月的某个日期得到中午。
因此,当您询问 POI 单元格是否采用日期格式时,没有简单的标志/类型可供检查。相反,POI 所能做的就是读取应用于单元格的格式字符串,并查看它是否看起来像一个可疑的日期。
奖励标记 - 尝试存储 1900 年 2 月 28 日,然后添加一个 - Excel 忠实地再现了 1900 闰年左右的 Lotus 123 错误......
作为一般规则,DateUtil.isCellDateFormatted(cell)
将为日期单元格、时间单元格和日期时间单元格返回 true。但是,有时您会得到一种非常奇怪的格式,Excel 知道它是日期或时间,但 POI 却无法识别。对于那些,您仍然可以要求单元格值作为日期,POI 会转换它。
因此,在您的情况下,如果 POI 表示它是日期格式的,请将值作为日期获取。现在,看看格式字符串。如果是日期查找,请将格式设置为日期。寻找日期和时间?格式为您喜欢的日期 + 时间。只有时间?格式化为时间?时区?你一定在笑……
哦,只要你不使用 1900 年左右的真实日期,你基本上可以说 DateUtil.isCellDateFormatted(cell)
+ value < 100 -> 可能只是一个时间( >1 如果它是耗时)。如果你的数字是一个整数,它可能只是一个日期(但也可能是午夜)。如果它是非整数(ish - 记住 excel 使用 float )它可能有时间分量。
关于java - 使用 poi api 从电子表格中读取时间值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15710888/