Java 如何通过ApachePOI从Excel中用公式检索日期
我有一张Excel工作表,其中日期单元格在ExcelJava 如何通过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) {
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 dodata.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);
...