POI/Excel/HTML单元格公式问题

一、问题描述

使用MyBatis从数据库中获取数据,然后用POI把数据填充到Excel模板中,生成最终的xls文件。把最终的xls文件转换为html文件,并返回给前台显示在Panel中。

Excel模板中,除了数据点位符外,还有一些计算公式。由于这些计算公式引用的数据在模板中是点位符,所以计算单元显示为“#VALUE!”。见下图:

clip_image001

生成Excel文件,在添加了重算的相关代码(见下文)后,计算单元格的值能够正常显示。转换为html后,这些计算单元格不会重新计算,仍然显示为“#VALUE!”。

二、问题分析

这个问题一直存在了两周左右,期间断断续续地花了一些时间研究,但问题没有得到解决。

这种使用第三方组件导致的问题,排查起来比较困难。在网上搜索了一大圈,没有发现对类似问题的描述。有一些关于使用POI重新计算Excel单元格公式的内容可参考。

下载了POI 3.11相关的源代码,在本机架设了测试环境,进行跟踪调试。发现是ExcelToHtmlConverter类中,在获取含有公式的单元格的CachedFormulaResultType时,总是返回Cell.CELL_TYPE_ERROR,导致该方法只能通过cell.getErrorCellValue()获取单元格的值(就是#VALUE!)并返回。

clip_image002

看了一下相关的源代码,POI把_record等属性设置为private,调用时无法修改。又在网上搜索了一番,更加没有什么有参考价值的信息。

三、问题解决

在用Excel打开并关闭填充数据后生成的xls文件时,Excel总是会提示是否要保存,但实际上没有进行任何的修改。如果“保存”这个模板,再生成html,单元格公式会计算,显示正常。总是感觉POI生成的xls文件实际上还是有兼容性问题,但MS在Office2007以前并没有开发相关文件的格式及说明,所以也怪不到POI。

生成Excel后,重新对公式单元格进行计算:

clip_image003

【仅仅setForceFormulaRecalculation(Boolean.TRUE)在转换为html时是无效的】

正式工程和一开始的测试代码中,取数生成Excel、转换为html是写在一个function中的。在测试中感觉不是太方便。于是就把生个Excel、转为html拆分为两个function,以便于控制是否重新生成Excel。没想到拆分完一运行测试代码,html中的计算单元竟然有值了!简直是简直了!

然后把正式工程中的代码也拆分了一下,这个让人抓狂的问题,就以这种无厘头的方式解决了。

四、问题总结

在同一个方法里进行生成xls文件、转换为html有问题,拆分为两个方法后就没有问题。这种现象是比较怪异的,应该还是代码层面存在问题。暂时就不再深究了。

转载于:https://www.cnblogs.com/yujj-cn/p/4915525.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
加密软件漏洞评测系统是一个非常专业的文档透明加密系统测试软件。这款文档透明加密系统功能强大,除了漏洞评测之外, 还可以进行剪切板控制、虚拟打印机、截屏等实用功能,让你评测更加标准!   加密软件漏洞评测系统使用说明:   在安装了文档透明加密软件的电脑上,用该工具对需要解密测试的文件进行打包( 打包后的文件   名默认为Crack.crk)。将打包后的文件复制到未安装加密软件的电脑上,用文件提取程序(GetFile.exe)   来提取文件,则提取出来的文件为明文文件(目前对市场上的所有文档透明加密系统均有效)。   加密软件漏洞评测系统使用方法如下:   1、打开FileDecrypt.exe;   2、切换到【伪造程序】页,如果你要解密Word文件,在程序伪造成中选择microsoft Word,如果你要解密Excel,则程序伪造成选择Microsoft Excel.以此类推。   3、返回【解密】页,打包模式选择Mode2、Mode3、Mode4、Mode5或Mode7。   4、添加要解密的文件,并点击打包。   5、将打包后的文件(Crack.crk)copy到未安装加密软件的电脑上   6、用GetFile.exe程序打开打包文件(Crack.crk)   7、提取文件(需要注册后才能提取,如果你还未注册,需要测试是否能正常提取,则可将crack.crk文件发给我,我提取后再发给你) 如果你在加密系统环境下,发现无法启动FileDecrypt.exe,你有以下三个解决途径: 1、在FileDecrypt.exe目录下,建立一个FileDecrypt.ini文件,双击FileDecrypt.exe通常都可正常启动。 2、使用DOS使用命令来启动程序,命令格式如下: D:\FileDecrypt.exe -R 2 3、联系我来解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值