Java读取带公式的货币格式Excel单元格的方法
解决Apache POI读取带公式货币单元格的问题
嘿,我来帮你搞定这个Apache POI读取带公式货币单元格的问题~你遇到的这些坑其实都有对应的解决办法,咱们一步步来:
一、先修复FormulaEvaluator的使用错误
你碰到的这个报错:
The specified formula '=ROUND(G65*E65,2)' starts with an equals sign which is not allowed.
原因很简单:Apache POI的setCellFormula方法要求传入的公式字符串不能以等号开头,而你传入的是带=的公式。其实你根本不需要重新设置公式,直接对现有单元格求值就行,正确代码如下:
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); // 直接对现有单元格求值,拿到计算后的结果 CellValue cellValue = evaluator.evaluate(cell); // 根据结果类型获取数值(货币格式本质还是数值类型) if (cellValue.getCellType() == CellType.NUMERIC) { double numericValue = cellValue.getNumberValue(); // 按需格式化,比如保留两位小数 System.out.printf("%.2f", numericValue); }
如果确实需要手动设置公式(比如原单元格的公式被存成了带等号的字符串),记得先去掉开头的=:
String rawFormula = formaCellValue; // 去掉开头的等号(如果有的话) String cleanFormula = rawFormula.startsWith("=") ? rawFormula.substring(1) : rawFormula; cell.setCellFormula(cleanFormula); // 再求值并读取 evaluator.evaluateFormulaCell(cell); double value = cell.getNumericCellValue();
二、用DataFormatter结合FormulaEvaluator拿到格式化后的数值
之前你用DataFormatter()直接读拿到的是公式,是因为没让它结合求值器。正确的用法是让DataFormatter自动计算公式结果,再输出格式化后的数值(比如带货币符号的字符串):
DataFormatter formatter = new DataFormatter(); FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); // 传入evaluator,让formatter先计算公式再格式化 String formattedCurrency = formatter.formatCellValue(cell, evaluator); System.out.println(formattedCurrency); // 比如输出 "$123.45" // 如果需要纯数值,可以把字符串里的非数字/小数点字符去掉后转换 double numericValue = Double.parseDouble(formattedCurrency.replaceAll("[^0-9.]", ""));
三、将单元格转为常规格式再取值
当然可以把单元格改成常规格式后再读取,步骤很简单:
- 创建一个常规格式的单元格样式
- 给目标单元格应用这个样式
- 重新计算公式后读取数值
代码示例:
// 创建常规格式的单元格样式 CellStyle normalStyle = workbook.createCellStyle(); DataFormat dataFormat = workbook.createDataFormat(); normalStyle.setDataFormat(dataFormat.getFormat("General")); // 给目标单元格设置常规格式 cell.setCellStyle(normalStyle); // 重新计算公式 FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); evaluator.evaluateFormulaCell(cell); // 现在就能正常读取数值了 double value = cell.getNumericCellValue(); System.out.println(value);
补充一句:你之前用getNumericCellValue()返回0.00,大概率是因为单元格的公式还没被POI计算过——POI默认不会自动触发公式计算,必须手动用FormulaEvaluator求值才行。
内容的提问来源于stack exchange,提问作者Aby George
相关产品推荐
相关产品推荐

