当前位置: 首页 > 面试题库 >

使用POI API从电子表格读取时间值

艾焕
2023-03-14
问题内容

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

例如,我的工作表将具有以下形式的行:

约会时间

2012年1月1日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工作表来自外部来源。因此,我将无法对其格式进行任何修改。

现在,我获得日期列的正确日期值。但是,对于时间列,我得到

1899年12月31日

结果是所有行


问题答案:

Excel中日期和时间的快速入门。由于创建文件格式时回想起很多原因,但现在看起来有些混乱,Excel没有日期或时间或日期时间类型。相反,它具有数字和特殊的格式规则。

怎么看?在Excel单元格中键入10.5,然后将其格式化为日期+时间。您将在1900年1月的某个日期中午。

因此,当您询问POI单元格是否为日期格式时,没有简单的标记/类型可以检查。取而代之的是,POI所能做的就是读取应用于单元格的格式字符串,并查看它是否看起来像日期一样可疑。

奖励标记-尝试存储1900年2月28日,然后添加一个-Excel忠实再现1900年leap年附近的Lotus 123错误…

通常,DateUtil.isCellDateFormatted(cell)对于“日期”单元格,“时间”单元格和“日期时间”单元格将返回true。但是,有时您会得到一种非常奇怪的格式,Excel知道该格式是日期或时间,但POI不能视为一个日期或时间。对于这些,您仍然可以要求输入单元格值作为日期,POI会对其进行转换。

因此,在您的情况下,如果POI表示日期已格式化,则将值作为日期获取。现在,查看格式字符串。如果要查找日期,请格式化为日期。寻找日期和时间?格式化为您的首选日期和时间。只有时间?格式化为时间?时区?你一定是在笑…

哦,只要您不使用1900年左右的真实日期,就可以说DateUtil.isCellDateFormatted(cell)+值<100->大概只是一个时间(如果是经过的时间,则为>
1)。如果您的数字是整数,则可能只是一个日期(但可能是午夜)。如果它是非整数(ish-请记住excel使用浮点数),则可能有时间成分。



 类似资料:
  • 我试图从电子表格中读取日期列和时间列。我可以从表中删除日期列,但不能删除时间列。 例如,我的工作表将有以下表格的行: 11/2/2012 12:15:01 我有以下代码来获取日期列: 如你所见,我使用 hssfdateutil . iscelldateformated(单元格) 检查单元格中是否有日期值。我想知道我是否可以使用任何函数检查单元格是否有时间值。 excel表来自外部来源。因此,我将无

  • 我有一段代码可以下载谷歌电子表格 连接超时默认为20秒。我试图将其设置为不同的值,但它不起作用。我不断得到 原因:java.net.SocketTimeoutException:java.net.SocketInputStream.socketRead0(本机方法)的读取超时~[na:1.7.060]在java.net.SocketInputStream.Read(SocketInputStrea

  • 我正在尝试从多个google电子表格中删除一个特定的表格。 我有一个主电子表格,从所有其他电子表格收集数据。从主电子表格中,我可以在其他电子表格中执行不同类型的操作,如添加工作表、重命名工作表、隐藏和锁定工作表。 但无法删除其他电子表格中的表格。查看了其他线程,但找不到任何解决方法。 这就是我到目前为止得到的。它停在这一排: "fname.delete表(本周);}" 我很感谢大家对我的帮助,因为

  • 人若自洁,脱离卑贱的事,就必作贵重的器皿,成为圣洁,合乎主用,预备行各样的善事。你要逃避少年的私欲,同那清心祷告主的人追求公义、信德、仁爱、和平。惟有那愚拙无学问的辩论,总要弃绝,因为知道这等事是起争竞的。(2 TIMOTHY 2:21-23) 电子表格 一提到电子表格,可能立刻想到的是excel。殊不知,电子表格“历史悠久”,比Word要长久多了。根据维基百科的记载整理一个简史: VisiCal

  • 我想阅读Java快速入门中描述的谷歌电子表格 https://developers.google.com/sheets/quickstart/java 快速入门解释如何从给定范围读取数据 但我有一个问题,我不知道电子表格的范围。列数可以更改。例如,我如何在不知道范围的情况下读取表中的所有数据? 问候 迈克尔

  • 我已经通过谷歌官方文档《开发者指南》API中提到的一个简单Java代码成功地在我的Google Drive帐户的现有电子表格中创建了一个新的工作表,但我想通过Java代码在我的Google Drive帐户中创建一个新的电子表格。在链接中,他们没有提到这方面的任何示例代码。我已经在Spreadservice类中看到了不同的可用方法。 如何使用Google电子表格API实现这一点?