java - 使用 poi api 从电子表格中读取时间值

标签 java excel datetime apache-poi spreadsheet

我正在尝试从电子表格中读取日期列和时间列。我可以从工作表中删除日期列,但不能删除时间列。

例如,我的工作表将包含以下形式的行:

日期时间

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/

相关文章:

java - 没有eclipse的独立java应用程序?

Java 文档生成器为 Xml 字符串返回空文档

java - Java 中的正则表达式将非空白字符串分解为单个字符和数字 block

sql - 用于组合范围的 Excel 函数或 VBA 脚本

java - 读取Excel工作表的空单元格

java - 如何测试需要任务花费未定义的时间才能完成的功能

将 xlsx 文件中的水平(基于行)数据读入 R 数据帧

php - 将日期转换为 unixtime php

sql - 无法将 Windows 计数器表中的字符转换为日期时间

MySQL 查询 ORDER BY DateTime 问题