Apache POI FormulaEvaluator单元格取值异常问题求助
解决方案
问题根源
- 数字格式异常:Excel中K列虽设为String类型,但公式计算出的数字被自动应用了千分位格式化(区域设置里千分位分隔符为
.),导致读取时得到12.34.5(对应原数字12345的分隔形式)。 - 日期显示为数值:Excel以自1900年1月1日起的天数存储日期,直接读取数值会得到
44813.0(对应08/09/2022的内部存储值),未按日期格式解析。
修正思路
不直接依赖单元格原始值,通过FormulaEvaluator获取计算后的CellValue,结合单元格格式规则格式化输出:
- 数值类型先判断是否为日期,再转成目标格式日期字符串;
- 字符串类型处理多余的格式分隔符;
- 优先使用求值后的
CellValue,避免格式干扰。
修正代码示例
FileInputStream fis = new FileInputStream("/somepath/test.xls"); Workbook wb = new HSSFWorkbook(fis); // 或 new XSSFWorkbook(fis) Sheet sheet = wb.getSheetAt(0); FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator(); // 示例目标单元格为K3,可根据实际行号调整 CellReference cellReference = new CellReference("K3"); Row row = sheet.getRow(cellReference.getRow()); Cell cell = row.getCell(cellReference.getCol()); if (cell != null) { CellValue cellValue = evaluator.evaluate(cell); if (cellValue != null) { switch (cellValue.getCellType()) { case BOOLEAN: System.out.println(cellValue.getBooleanValue()); break; case NUMERIC: // 判断是否为日期格式 if (DateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); // 按需求定义日期格式,比如"dd/MM/yyyy" SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); System.out.println(sdf.format(date)); } else { // 按Excel显示格式读取数字 DataFormatter formatter = new DataFormatter(); String formattedValue = formatter.formatCellValue(cell, evaluator); // 去除千分位分隔符,还原原始数字 formattedValue = formattedValue.replace(".", ""); System.out.println(formattedValue); } break; case STRING: String strValue = cellValue.getStringValue(); // 处理字符串中的分隔符 strValue = strValue.replace(".", ""); System.out.println(strValue); break; case BLANK: break; case ERROR: System.out.println(cellValue.getErrorValue()); break; case FORMULA: break; } } } wb.close(); fis.close();
关键说明
CellValue获取求值结果:evaluator.evaluate(cell)返回公式计算后的实际值,避免直接读取单元格原始值的格式干扰。DataFormatter适配格式:该类会根据单元格的格式设置,将数值转换为Excel界面显示的字符串形式,适合处理带格式的数字。- 日期判断与格式化:通过
DateUtil.isCellDateFormatted(cell)识别日期类型,再用SimpleDateFormat转换为目标格式。 - 分隔符处理:针对数字显示的
.分隔符,直接替换为空即可还原原始数字。
内容的提问来源于stack exchange,提问作者Altin Uku
相关产品推荐
相关产品推荐

