[alibaba/easyexcel]easyexcel模板填充后,有公式的单元格不会自动计算,而需要我手动算,如何处理

2024-03-07 238 views
0

easyexcel模板填充后,有公式的单元格不会自动计算,而需要我手动算,如何处理? image

    public static void main(String[] args) {
        String templateFileName = "D:\\123.xlsx";
        String fileName = "D:\\1234.xlsx";
        // 这里 会填充到第一个sheet, 然后文件流会自动关闭
        Map<String, Object> map = MapUtils.newHashMap();
        map.put("name", "张三");
        map.put("number", 5.2);
        map.put("name1", "张三1");
        map.put("number2", 5.21);
        EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(map);
    }

回答

9

不建议使用公式,建议自己在内存中计算之后填充

3

我也遇到了同样的问题,简单研究了一下,希望有所帮助。 看代码:

Map<String, Object> map = new HashMap<>();
// 往map里面塞数据...
String filePath = "D:/test.xlsx";
String templateFilePath = "D:/template.xlsx";
ExcelWriter excelWriter = EasyExcelFactory
        .write(filePath)
        .withTemplate(templateFilePath)
        // 使用内存模式
        // 官方文档:https://easyexcel.opensource.alibaba.com/docs/current/api/write#writeworkbook
        // 请确保你的Excel文件不至于过大,否则容易内存溢出
        .inMemory(true)
        .build();
WriteSheet writeSheet = EasyExcelFactory.writerSheet().build();
// 写数据
excelWriter.fill(map, writeSheet);
// 拿到原始的Workbook对象
Workbook workbook = excelWriter.writeContext().writeWorkbookHolder().getWorkbook();

// setForceFormulaRecalculation用于设置在打开Excel时自动做一次计算
// 如果是Excel生成后,用户下载到电脑打开查看,则有效
// 如果是在线预览方案,setForceFormulaRecalculation并没有作用
// workbook.setForceFormulaRecalculation(true);

// 调用evaluateAll对Excel的所有公式做一次计算
// 参考:https://github.com/alibaba/easyexcel/issues/1464
// 注意,实测,在inMemory为false时,evaluateAll无效
workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();
// 关闭
excelWriter.finish();

没研究源码,但我猜测可能是EasyExcel对超大Excel做了优化,导致公式的计算不好处理了。 如果Excel确实很大,官方的建议是不要使用公式,在Java层把该做的计算都做好,然后直接塞计算后的数据进去。