一、问题描述

使用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单元格公式问题的更多相关文章

  1. 如何隐藏Excel中单元格公式且其他单元格可修改

    需求:1.隐藏指定单元格公式.2.非公式单元格可修改,不影响公式计算. 操作步骤:1.全选工作表.右键.单元格格式.保护.锁定勾选取消. 2.编辑.定位(或按F5弹出该对话框).定位条件.公式(勾选) ...

  2. poi excel 合并单元格

    结论:final CellRangeAddress cra = new CellRangeAddress(rowId, rowId + rowSkip,        colId, colId + c ...

  3. POI按照源单元格设置目标单元格格式

    原文:http://jjw198874.blog.163.com/blog/static/1889845522011102401854234/ POI按照源单元格设置目标单元格格式 poi按照一个源单 ...

  4. POI设置excle单元格样式

    Java利用POI生成Excel强制换行 使用POI创建一个简单的   myXls.xls   文件       常用的包为   org.apache.poi.hssf.usermodel.*;    ...

  5. poi读取合并单元格

    poi读取合并单元格 学习了:http://blog.csdn.net/ycb1689/article/details/9764191 进行了列合并单元格的修正:原来是我自己找错了地方: import ...

  6. [从产品角度学EXCEL 03]-单元格的秘密

    这是<从产品角度学EXCEL>系列——单元格的秘密. 前言请看: 0 为什么要关注EXCEL的本质 1 EXCEL是怎样运作的 2 EXCEL里的树形结构 或者你可以去微信公众号@尾巴说数 ...

  7. EXCEL表格单元格中包含数字英文和汉字,如何自动去掉汉字,保留英文和数字

    EXCEL表格单元格中包含数字英文和汉字,如何自动去掉汉字,保留英文和数字 Function 求数字和字母(对象 As String) '在文本与数字混杂中提取数字和字母   Dim myReg    ...

  8. python读取excel中单元格的内容返回的5种类型

    (1) 读取单个sheetname的内容. 此部分转自:https://www.cnblogs.com/xxiong1031/p/7069006.html python读取excel中单元格的内容返回 ...

  9. asp.net C#取Excel 合并单元格内容

    asp教程.net c#取excel 合并单元格内容读取excel数据,填充dataset// 连接字符串 string xlspath = server.mappath("~/www.11 ...

随机推荐

  1. Beauty Contest 凸包+旋转卡壳法

    Beauty Contest Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 27507   Accepted: 8493 D ...

  2. 用python爬虫爬取去哪儿4500个热门景点,看看国庆不能去哪儿

    前言:本文建议有一定Python基础和前端(html,js)基础的盆友阅读. 金秋九月,丹桂飘香,在这秋高气爽,阳光灿烂的收获季节里,我们送走了一个个暑假余额耗尽哭着走向校园的孩籽们,又即将迎来一年一 ...

  3. ch4-注册 登陆 实现 cookie使用

    1 mysql 回调函数优化 1.1 mysql代码: config.query(handlerStr, value, function (err, data) { callback &&am ...

  4. 不错的JQuery屏幕居中提示信息封装,使用方便,可集成到项目

    function showLoad(tipInfo, type, autohide) { var pic = ""; switch (type) { case 0: // load ...

  5. [置顶] 一个demo学会c#

    学习了c#4.5高级编程这本书,自己喜欢边学边总结边写demo,所以写了这篇文章,包含了大部分的c#编程知识.让你一个demo掌握c#编程,如果有问题可以留言. 此demo主要包括五个文件:Stude ...

  6. Scrapy框架--使用cookie

    CookieMiddleware class scrapy.downloadermiddlewares.cookies.CookieMiddlewar 该中间件使得爬取需要cookie(例如使用ses ...

  7. Hadoop(七)HDFS容错机制详解

    前言 HDFS(Hadoop Distributed File System)是一个分布式文件系统.它具有高容错性并提供了高吞吐量的数据访问,非常适合大规模数据集上的应用,它提供了一个高度容错性和高吞 ...

  8. Pyhton编程(三)之Pycharm安装及运算符

    一:上节题目解答 1)使用while循环输出 1 2 3 4 5 6 8 9 10(注意:没有7) n=1while n<11: if n==7: pass //pass代码段指代空代码.. e ...

  9. leetcode 697. Degree of an Array

    题目: Given a non-empty array of non-negative integers nums, the degree of this array is defined as th ...

  10. 图论 Warshall 和Floyd 矩阵传递闭包

    首先我们先说下图论,一般图存储可以使用邻接矩阵,或邻接表,一般使用邻接矩阵在稠密图比较省空间. 我们来说下有向图,一般的有向图也是图,图可以分为稠密图,稀疏图,那么从意思上,稠密图就是点的边比较多,稀 ...