alibaba / easyexcel

快速、简洁、解决大文件内存溢出的java处理Excel工具
https://easyexcel.opensource.alibaba.com
Apache License 2.0
32.08k stars 7.5k forks source link

模板填充数据:模板带公式的话,怎么自动刷新公式? #3046

Closed wangjxGitHub closed 1 year ago

wangjxGitHub commented 1 year ago

问题描述

如题,easyexcel 中有没有类似如下poi中的刷新公式的方法,不然导出excel后,必须点一下填充的单元格数据,否则其他公式关联的单元格的数据不会自动刷新。 其他问题:较复杂的excel导出,是建议直接使用模板填充方式,还是直接写出。如果是模板填充方式的话,计算公式是保留在模板里让他自己计算好,还是跟业务确定全部公式,在后台用代码计算出值,最后直接写入不带公式的模板中呢。

// poi刷新公式
workbook.setForceFormulaRecalculation(true);
gongxuanzhang commented 1 year ago

可以实现WorkbookWriteHandler 重写afterWorkbookDispose方法拿到workbook 调用poi api

自定义拦截器使用可以参考 官网 https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8B%A6%E6%88%AA%E5%99%A8%E4%B8%8A%E9%9D%A2%E5%87%A0%E7%82%B9%E9%83%BD%E4%B8%8D%E7%AC%A6%E5%90%88%E4%BD%86%E6%98%AF%E8%A6%81%E5%AF%B9%E5%8D%95%E5%85%83%E6%A0%BC%E8%BF%9B%E8%A1%8C%E6%93%8D%E4%BD%9C%E7%9A%84%E5%8F%82%E7%85%A7%E8%BF%99%E4%B8%AA

wangjxGitHub commented 1 year ago

感谢,该问题已经通过以下方式解决。

Workbook workbook = excelWriter.writeContext().writeWorkbookHolder().getCachedWorkbook();
// 设置强制计算公式:不然公式会以字符串的形式显示在excel中
workbook.setForceFormulaRecalculation(true);

但是,现在出现新的问题,可以帮忙看看么,非常感谢。 问题如下: 使用填充模板的形式生成的excel文件(模板文件自带公式),数据虽然计算并显示出来了,但是打开文件后,文件是未保存的。这时,去读该文件的内容时,公式生成的数据无法正常读取,读取到的是 #VALUE! ,不知道该如何解决。以上

gongxuanzhang commented 1 year ago

..什么叫打开文件是未保存的 你是之前的没关 wps缓存了吧

wangjxGitHub commented 1 year ago

使用 fill 填充方式新生成的excel,没有引用其他excel文件的数据,也没有缓存。文件生成后,打开文件会显示是未保存的状态,就是关闭的时候它会提示你保存,就像下面这种。 如果不手动保存的话,直接读这个文件,公式计算后的数据读到的就是 #VALUE! image image

gongxuanzhang commented 1 year ago

可能是生成公式的问题。 这边推荐的是在内存中把数据计算好写过去 尽量避免用公式。 如果一定要用公式可能需要一点点调试

wangjxGitHub commented 1 year ago

好的 谢谢

mytherf commented 1 year ago

同样的问题,请问是怎么解决的?@wangjxGithub

yuz2016 commented 1 year ago

使用内存模式,参考这篇是可以实现刷新公式的。https://blog.csdn.net/hantiannan/article/details/6733955

YangJingf commented 5 months ago

问题描述

如题,easyexcel 中有没有类似如下poi中的刷新公式的方法,不然导出excel后,必须点一下填充的单元格数据,否则其他公式关联的单元格的数据不会自动刷新。 其他问题:较复杂的excel导出,是建议直接使用模板填充方式,还是直接写出。如果是模板填充方式的话,计算公式是保留在模板里让他自己计算好,还是跟业务确定全部公式,在后台用代码计算出值,最后直接写入不带公式的模板中呢。

// poi刷新公式
workbook.setForceFormulaRecalculation(true);

请问你是采用什么方式写入的呢,我现在是用excelWriter.write(data, writeSheet);的方式,这样子会追加写,相当于公式设置了几列,就在这几列后面才写入