找了好久没有看到有人解决,大多都是xls版本的HSSF。下面是解决xlsx版本XSSF公式失效问题。
需求:从系统中生成EXCEL,在最后一行合计。
实现:代码中写出excel的合计公式。拼凑出例如:=SUM(J3:J7)放进代码。
问题:实际导出来的excel文件,合计栏出现了空白。鼠标放上去看,公式完全没有问题,就是没有生效,并且提示是非受保护视图。点击启用编辑关掉受保护视图,公式又生效了。
解决:
// 合计2 数值格式
XSSFCellStyle contextStyle2 = workbook.createCellStyle();
contextStyle2.setBorderBottom(XSSFCellStyle.BORDER_THIN);
contextStyle2.setBorderLeft(XSSFCellStyle.BORDER_THIN);
contextStyle2.setBorderTop(XSSFCellStyle.BORDER_THIN);
contextStyle2.setBorderRight(XSSFCellStyle.BORDER_THIN);
contextStyle2.setAlignment(XSSFCellStyle.ALIGN_CENTER);
contextStyle2.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
contextStyle2.setFont(font);
// 最关键的是'_ ',最后有个空格别忘了,空格是必须的
contextStyle2.setDataFormat(workbook.createDataFormat().getFormat("0.00_ "));
cell.setCellStyle(contextStyle2);
//一定要判断导出数据非空,否则刷新公式部分会报错,最开始没有意识到这个问题,走偏了好久。
if (!CollectionUtils.isEmpty(data)) {
//colString=CellReference.convertNumToColString(9); //长度转成ABC列 数字代表第几列 从0开始
String sumString = "SUM(" + colString + (startRow + 1) + ":" + colString + endRow + ")";//公式
cell.setCellFormula(sumString);
//解决公式失效核心代码 刷新
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
//计算公式并保存结果。单元格保留公式。不包含公式,不会进行任何更改。
evaluator.evaluateAll();
} else {
cell.setCellValue("-");
}