poi错误的日期公式值计算

我有以下代码

public boolean processCell(boolean hasData, StringBuffer rowData, Cell cell) { switch (cell.getCellType()) { case Cell.CELL_TYPE_FORMULA: { try { this.evaluator.clearAllCachedResultValues(); switch (this.evaluator.evaluateFormulaCell(cell)) { case XSSFCell.CELL_TYPE_NUMERIC: { if (DateUtil.isCellDateFormatted(cell)) { logger.warn(cell.getCellFormula()); rowData.append(dateFormat.format(cell.getDateCellValue())); hasData = true; } else { rowData.append(numberFormat.format(cell.getNumericCellValue())); hasData = true; } break; } case XSSFCell.CELL_TYPE_STRING: { String stringVal = cell.getStringCellValue().trim().replaceAll("\n", ""); if (stringVal.trim().equalsIgnoreCase("Total MoU/active customer")) { logger.warn("Last - KPI ::" + stringVal); this.finalRecord = true; } rowData.append(stringVal); hasData = true; break; } case XSSFCell.CELL_TYPE_BOOLEAN: { rowData.append(cell.getBooleanCellValue()); hasData = true; break; } case XSSFCell.CELL_TYPE_ERROR: { int eval = cell.getErrorCellValue(); if (eval == DIVIDE_BY_ZERO) rowData.append("0"); hasData = true; break; } case XSSFCell.CELL_TYPE_BLANK: { rowData.append(""); hasData = true; break; } } } catch (java.lang.IllegalArgumentException e) { logger.error(" Formula [ " + (cell.getRowIndex() + 1) + "," + (cell.getColumnIndex() + 1) + " ] " + e.getMessage()); rowData.append("CellError"); this.STATUS = FAILURE; hasData = true; break; } catch (java.lang.IllegalStateException e) { logger.error(" Formula [ " + (cell.getRowIndex() + 1) + "," + (cell.getColumnIndex() + 1) + " ] " + e.getMessage()); rowData.append("CellError"); this.STATUS = FAILURE; hasData = true; break; } catch (java.lang.RuntimeException e) { this.STATUS = FAILURE; logger.error(" Formula [ " + (cell.getRowIndex() + 1) + "," + (cell.getColumnIndex() + 1) + " ] " + e.getMessage()); rowData.append("MissingFileError"); hasData = true; break; } break; } case XSSFCell.CELL_TYPE_BLANK: { rowData.append(""); hasData = true; break; } case XSSFCell.CELL_TYPE_NUMERIC: { if (DateUtil.isCellDateFormatted(cell)) { rowData.append(dateFormat.format(cell.getDateCellValue())); hasData = true; } else { rowData.append(numberFormat.format(cell.getNumericCellValue())); hasData = true; } break; } // Formula evaluation ends here case XSSFCell.CELL_TYPE_STRING: { String stringVal = cell.getStringCellValue().trim().replaceAll("\n", ""); if (stringVal.trim().equalsIgnoreCase("Total MoU/active customer")) { logger.warn("Last - KPI ::" + stringVal); this.finalRecord = true; ; } rowData.append(stringVal); hasData = true; break; } case XSSFCell.CELL_TYPE_ERROR: { int eval = cell.getErrorCellValue(); if (eval == DIVIDE_BY_ZERO) rowData.append("0"); hasData = true; break; } case XSSFCell.CELL_TYPE_BOOLEAN: { rowData.append(cell.getBooleanCellValue()); hasData = true; break; } } rowData.append(FIELD_SEPARATOR); return hasData; } 

当我运行该程序。 在日期栏我有一系列的日期。 最后一个没有公式的日期是31/12/2009它的单元格参考oj在oj + 1 excel表格我有1/1/2010但是在excel表格我得到29/04/2009我在这个单元格上打印了公式并找到了poi 3.6对此有错误的单元格引用。 而不是oj + 1,它给出NE + 1

请帮我解决问题

由于您的示例不完整,我无法重现您的结果。 这是一个产生预期结果的sscce :

 import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellValue; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.FormulaEvaluator; import org.apache.poi.ss.usermodel.Row; public class POIExcelReader { public static void main(String[] args) throws IOException { InputStream myxls = new FileInputStream("test.xls"); HSSFWorkbook book = new HSSFWorkbook(myxls); FormulaEvaluator eval = book.getCreationHelper().createFormulaEvaluator(); HSSFSheet sheet = book.getSheetAt(0); for (Row row : sheet) { for (Cell cell : row) { printCell(cell, eval); System.out.print("; "); } System.out.println(); } myxls.close(); } private static void printCell(Cell cell, FormulaEvaluator eval) { switch (cell.getCellType()) { case Cell.CELL_TYPE_BLANK: System.out.print("EMPTY"); break; case Cell.CELL_TYPE_STRING: System.out.print(cell.getStringCellValue()); break; case Cell.CELL_TYPE_NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { System.out.print(cell.getDateCellValue()); } else { System.out.print(cell.getNumericCellValue()); } break; case Cell.CELL_TYPE_BOOLEAN: System.out.print(cell.getBooleanCellValue()); break; case Cell.CELL_TYPE_FORMULA: System.out.print(cell.getCellFormula()); CellValue cellValue = eval.evaluate(cell); switch (cellValue.getCellType()) { case Cell.CELL_TYPE_NUMERIC: double v = cellValue.getNumberValue(); if (DateUtil.isCellDateFormatted(cell)) { System.out.print(" = " + DateUtil.getJavaDate(v, true)); } else { System.out.print(" = " + v); } break; } break; default: System.out.print("DEFAULT"); } } } 
 2010年1月10日00:00:00  1 + 1 = 2.0;  123.1;  String1中; 真正; 
 A1 + 1 = 2010年1月11日00:00:00美国东部时间;  2 + 2 = 4.0;  123.2;  String2的; 假; 
 A2 + 1 = 2010年1月12日00:00:00美国东部时间;  3 + 3 = 6.0;  123.3;  STRING3; 真正; 

附录:使用Apache POI 3.8b3validation结果。

我有一个类似的问题,我正在阅读的工作簿从硬编码值切换到相互依赖的评估日期值,如E7 + 7和下一个单元格F7 + 7。 它突然间会突然上涨5年……

我在每个单元格上使用evalInCell修复它,然后读取这样的值:

 if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) { cell = eval.evaluateInCell(cell); } 

希望这可以帮助!