Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过ApachePOI从Excel中用公式检索日期_Java_Excel_Apache Poi_Date Formatting - Fatal编程技术网

Java 如何通过ApachePOI从Excel中用公式检索日期

Java 如何通过ApachePOI从Excel中用公式检索日期,java,excel,apache-poi,date-formatting,Java,Excel,Apache Poi,Date Formatting,我有一张Excel工作表,其中日期单元格在ExcelTODAY()+1中指定了日期公式。因此,基本上今天它默认显示为2018年10月3日。我已经创建了一个从Excel中读取数据的代码,Excel中有公式,但是当我得到日期时,它会以不同的方式出现 代码: Cell c = CellUtil.getCell(r, columnIndex); CellType type = c.getCellType(); if (type == CellType.FORMULA) {

我有一张Excel工作表,其中日期单元格在Excel
TODAY()+1
中指定了日期公式。因此,基本上今天它默认显示为2018年10月3日。我已经创建了一个从Excel中读取数据的代码,Excel中有公式,但是当我得到日期时,它会以不同的方式出现

代码:

  Cell c = CellUtil.getCell(r, columnIndex);
  CellType type = c.getCellType();
      if (type == CellType.FORMULA) {
          switch (c.getCachedFormulaResultType()) {
                 case NUMERIC:
                      if (DateUtil.isCellDateFormatted(c)) {
                          value = (new SimpleDateFormat("dd-MM-yyyy").format(c.getDateCellValue()));
                          data.add(value); // Date should display 03-10-2018 but it's showing 23-01-2018
                      } else {
                          value = (c.getNumericCellValue()) + "";
                          data.add(value);
                      }
                  break;
                  case STRING:
                           value = c.getStringCellValue();
                           data = new LinkedList <String>(Arrays.asList(value.split(";")));
                   break;
              }
      }
Cell c=CellUtil.getCell(r,columnIndex);
CellType type=c.getCellType();
if(type==CellType.FORMULA){
开关(c.getCachedFormulaResultType()){
大小写数字:
if(DateUtil.isCellDateFormatted(c)){
value=(新的simpleDataFormat(“dd-MM-yyyy”).format(c.getDateCellValue());
data.add(value);//日期应显示为2018年10月3日,但显示为2018年1月23日
}否则{
value=(c.getNumericCellValue())+“”;
数据增值;
}
打破
大小写字符串:
value=c.getStringCellValue();
data=newlinkedList(Arrays.asList(value.split(“;”));
打破
}
}
我不知道为什么它会显示从一月开始的日期,并应用公式
TODAY()+1

与此类似,另一个函数
TODAY()+15
返回2018年4月22日的日期。

如中所述:

Excel文件格式(包括.xls和.xlsx)存储“缓存”结果 对于每个公式以及公式本身。这意味着 文件打开后,可以快速显示,而无需 花很长时间计算所有公式结果。它也 意味着当通过ApachePOI读取文件时,结果是 你也可以很快找到!”

因此,所有公式都将存储上次计算时的缓存结果。这是最后一次在Excel中打开、重新计算和保存工作簿,或者是最后一次在Excel之外进行评估

因此,如果公式为
=TODAY()
的单元格存储了
22-01-2018
的缓存结果,则工作簿的最后一次评估时间为2018年1月22日

在阅读之前,获取您需要的最新公式结果。最简单的方法:

...
workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();
...
或者您正在将与一起使用:


你的问题对我来说是不可复制的。代码按预期工作。但是什么是数据?它是一个
列表
?如果是这样的话,它是一个什么样的
列表?而
data.add(value)在哪里显示值?对于日期,它不是一个列表,但在字符串的列表中有一些数据,所以我使用了列表。在Excel中,单元格是日期格式的,并且还有公式TODAY()+1。同样:where do
data.add(value)显示值?您在哪里看到的
23-01-2018
?此图像可能会帮助您。。。如果该图像为真,则该工作表位于上次于2018年1月23日评估的工作簿中。因此,在阅读之前,您需要[先评估它()。或者您正在使用
DataFormatter
FormulaEvaluator
DataFormatter-formatter=new-DataFormatter();FormulaEvaluator=workbook.getCreationHelper().createFormulaEvaluator();
然后使用
value=formatter.formatCellValue(c,评估者);
...
DataFormatter formatter = new DataFormatter(); 
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); 
...
Cell cell = CellUtil.getCell(...);
...
String value = formatter.formatCellValue(cell, evaluator);
...