POI/Excel/HTML单元格公式问题
一、问题描述
使用MyBatis从数据库中获取数据,然后用POI把数据填充到Excel模板中,生成最终的xls文件。把最终的xls文件转换为html文件,并返回给前台显示在Panel中。
Excel模板中,除了数据点位符外,还有一些计算公式。由于这些计算公式引用的数据在模板中是点位符,所以计算单元显示为“#VALUE!”。见下图:

生成Excel文件,在添加了重算的相关代码(见下文)后,计算单元格的值能够正常显示。转换为html后,这些计算单元格不会重新计算,仍然显示为“#VALUE!”。
二、问题分析
这个问题一直存在了两周左右,期间断断续续地花了一些时间研究,但问题没有得到解决。
这种使用第三方组件导致的问题,排查起来比较困难。在网上搜索了一大圈,没有发现对类似问题的描述。有一些关于使用POI重新计算Excel单元格公式的内容可参考。
下载了POI 3.11相关的源代码,在本机架设了测试环境,进行跟踪调试。发现是ExcelToHtmlConverter类中,在获取含有公式的单元格的CachedFormulaResultType时,总是返回Cell.CELL_TYPE_ERROR,导致该方法只能通过cell.getErrorCellValue()获取单元格的值(就是#VALUE!)并返回。

看了一下相关的源代码,POI把_record等属性设置为private,调用时无法修改。又在网上搜索了一番,更加没有什么有参考价值的信息。
三、问题解决
在用Excel打开并关闭填充数据后生成的xls文件时,Excel总是会提示是否要保存,但实际上没有进行任何的修改。如果“保存”这个模板,再生成html,单元格公式会计算,显示正常。总是感觉POI生成的xls文件实际上还是有兼容性问题,但MS在Office2007以前并没有开发相关文件的格式及说明,所以也怪不到POI。
生成Excel后,重新对公式单元格进行计算:

【仅仅setForceFormulaRecalculation(Boolean.TRUE)在转换为html时是无效的】
正式工程和一开始的测试代码中,取数生成Excel、转换为html是写在一个function中的。在测试中感觉不是太方便。于是就把生个Excel、转为html拆分为两个function,以便于控制是否重新生成Excel。没想到拆分完一运行测试代码,html中的计算单元竟然有值了!简直是简直了!
然后把正式工程中的代码也拆分了一下,这个让人抓狂的问题,就以这种无厘头的方式解决了。
四、问题总结
在同一个方法里进行生成xls文件、转换为html有问题,拆分为两个方法后就没有问题。这种现象是比较怪异的,应该还是代码层面存在问题。暂时就不再深究了。
POI/Excel/HTML单元格公式问题的更多相关文章
- 如何隐藏Excel中单元格公式且其他单元格可修改
需求:1.隐藏指定单元格公式.2.非公式单元格可修改,不影响公式计算. 操作步骤:1.全选工作表.右键.单元格格式.保护.锁定勾选取消. 2.编辑.定位(或按F5弹出该对话框).定位条件.公式(勾选) ...
- poi excel 合并单元格
结论:final CellRangeAddress cra = new CellRangeAddress(rowId, rowId + rowSkip, colId, colId + c ...
- POI按照源单元格设置目标单元格格式
原文:http://jjw198874.blog.163.com/blog/static/1889845522011102401854234/ POI按照源单元格设置目标单元格格式 poi按照一个源单 ...
- POI设置excle单元格样式
Java利用POI生成Excel强制换行 使用POI创建一个简单的 myXls.xls 文件 常用的包为 org.apache.poi.hssf.usermodel.*; ...
- poi读取合并单元格
poi读取合并单元格 学习了:http://blog.csdn.net/ycb1689/article/details/9764191 进行了列合并单元格的修正:原来是我自己找错了地方: import ...
- [从产品角度学EXCEL 03]-单元格的秘密
这是<从产品角度学EXCEL>系列——单元格的秘密. 前言请看: 0 为什么要关注EXCEL的本质 1 EXCEL是怎样运作的 2 EXCEL里的树形结构 或者你可以去微信公众号@尾巴说数 ...
- EXCEL表格单元格中包含数字英文和汉字,如何自动去掉汉字,保留英文和数字
EXCEL表格单元格中包含数字英文和汉字,如何自动去掉汉字,保留英文和数字 Function 求数字和字母(对象 As String) '在文本与数字混杂中提取数字和字母 Dim myReg ...
- python读取excel中单元格的内容返回的5种类型
(1) 读取单个sheetname的内容. 此部分转自:https://www.cnblogs.com/xxiong1031/p/7069006.html python读取excel中单元格的内容返回 ...
- asp.net C#取Excel 合并单元格内容
asp教程.net c#取excel 合并单元格内容读取excel数据,填充dataset// 连接字符串 string xlspath = server.mappath("~/www.11 ...
随机推荐
- 关于String的对象创建
1)String String是Java中的字符串类,属于引用数据类型.所以String的对象存放的是引用的地址.在底层是一个字符型数组. String是不可变的.所谓的不可变是指一个对象有了一个引用 ...
- Ubuntu升级出现/boot空间不足解决
经常升级Linux内核,导致更新时警告/boot分区空间不足.这是以为多次升级内核后,导致内核版本太多,清理一下没用的内核文件就行了.命令如下: zht@zht-Ubuntu:~$ dpkg -l ' ...
- hdu1512 Monkey King(左偏树 + 并查集)
Once in a forest, there lived N aggressive monkeys. At the beginning, they each does things in its o ...
- Linux视频主要概述
Linux当中称之为视频的主要为俩个方面(主要以kernel为主): 1.源代码video目录指的是主显示输出,也就是帧缓冲(Frame Buffer)驱动部分,表示对基本图形层的显示支持; 2.源代 ...
- FTP基本操作类大全,外加c#基础公共帮助类
总结平时用到的一些FTP操作类,方便需要的用到.github地址:https://github.com/Jimmey-Jiang/Common.Utility 1.连接FTP服务器 /// <s ...
- 【转】HTTP Header 详解
HTTP(HyperTextTransferProtocol)即超文本传输协议,目前网页传输的的通用协议.HTTP协议采用了请求/响应模型,浏览器或其他客户端发出请求,服务器给与响应.就整个网络资源传 ...
- HDU1223 Order Count 动态规划 组合数
动态规划+组合数+大数 #include<cstdio> #include<cstdlib> #include<iostream> #include<algo ...
- javascript集合的交,并,补,子集,长度,新增,删除,清空等操作
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...
- IDEA Maven 三层架构 1、基本的Archetype 搭建
JDK:1.8 Maven:3.3.9 三层架构:基于 SpringMVC 的 UI 层.业务逻辑层以及数据访问层 从对 Maven 的了解可以看出,三层架构的创建在于对文件夹的合理安排,他们通常是主 ...
- 【学习】文本框输入监听事件oninput
真实项目中遇到的,需求是:一个文本框,一个按钮,当文本框输入内容时,按钮可用,当删除内容时,按钮不可用. 刚开始用的focus和blur, $(".pay-text").focus ...