`

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

    博客分类:
  • JAVA
 
阅读更多

一、问题描述

使用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有问题,拆分为两个方法后就没有问题。这种现象是比较怪异的,应该还是代码层面存在问题。暂时就不再深究了。

分享到:
评论

相关推荐

    excel poi工具类 导入 导出 合并单元格 计算公式

    excel poi工具类 导入 导出 合并单元格 计算公式

    Java 新版POI 读取excel文件信息返回List<List<String>>对象,包含文件内公式处理

    基于新版本的POI编写的读取Excel文件数据的工具类,可根据绝对路径、File对象、InputSteam对象读取解析Excel文件内容,并返回List&lt;List&lt;String&gt;&gt;格式结果,其中包含对单元格公式的处理。

    POI实战总结

    一、 POI简介。 二、 HSSF概况 。 三、 POI EXCEL文档结构类 。 四、 EXCEL常用操作方法 。 【1、得到Excel常用对象 2、建立Excel常用对象 3、设置sheet名称和单元格内容 ... 25、强行刷新单元格公式】

    java_poi操作excel

    java通过poi操作excel的基本例子. 单元格基本操作 poi画线 矩形 圆形 excel表的操作 行列操作

    POI实战-java开发excel详解

    1.3 POI简单读取Excel数据 5 1.4 POI简单写出Excel 9 2.复杂读取 16 2.1 单元格各类型数据读取 16 2.1.1 基本类型 16 2.1.2 日期类型 18 2.2 自定义类型 21 3.复杂写入 22 3.1 复杂写入 22 3.2 多层公式 27 4.常用...

    Java POI读取excel中数值精度损失问题解决

    主要介绍了Java POI读取excel中数值精度损失问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    POI实战 .pdf

    1.3 POI简单读取Excel数据 5 1.4 POI简单写出Excel 9 2.复杂读取 16 2.1 单元格各类型数据读取 16 2.1.1 基本类型 16 2.1.2 日期类型 18 2.2 自定义类型 21 3.复杂写入 22 3.1 复杂写入 22 3.2 多层公式 27 4.常用...

    基于poi对excel操作的简单封装和必要的poi3.17包

    基于poi对excel操作的简单封装及必要的poi3.17...针对excel文件或输入流,按行或者单元格解析处理,提供简单的通用单元格数据获取方法(数字类单元格返回Double, 日期返回Date, 公式返回计算后的结果,其它返回String)

    poi以及jxl相关的jar包下载

    Jxl对中文支持非常好,操作简单,方法看名知意。 Jxl是纯javaAPI,在跨平台上表现的非常完美,代码可以再windows或者Linux上...支持公式,宏,一些企业应用上会非常实用 能够修饰单元格属性 支持字体、数字、日期操作

    POI操作示例

    POI操作包括,上下合并单元格,左右合并单元格,设置单元格基本格式,写入公式简单操作,做个备份记录学习用.

    POI的开发和使用文档.docx

    除开最基本的介绍和使用介绍外,另有使用详解,包含POI结构与常用类、Excel的基本操作、Excel的单元格操作、使用Excel的公式、使用图形、Excel表操作、Excel行列操作、Excel的其他功能、POI对字的基本操作等……

    jxls2.6兼容2.X版本 demo集合 包含 循环 判断 合并单元格等共33个单独的例子,可以单独执行

    jxls作为比较好的excel模版方案,比poi和easyExcel相对扩展性更高。 demo包含全部官方例子和模版, 2.6官方新增合并单元格标签,jx:mergecells 以及其他相关一切demo,很好的资源,分享给大家,供大家学习交流。 ...

    luckysheet_import_export

    公式 计划 目标是支持Luckysheet支持的所有功能 条件格式 数据透视表 图表 种类 筛选 注解 Excel导出 要求 版本&gt; = 6 安装 npm install -g gulp-cli npm install 发展 发展 npm run dev 包裹 npm run build 项目...

    npoi:一个.NET库,可以在不安装Microsoft Office的情况下读写Office格式。 没有COM +,没有互操作

    涵盖Excel的大多数功能(单元格样式,数据格式,公式等) C。 支持的格式:xls,xlsx,docx。 d。 设计为面向接口的(请看一下NPOI.SS命名空间) e。 不仅支持出口,还支持进口 F。 全世界真正成功的案例 G。 H...

    jxls-新APi系列教程

    关于Jxls2的版本,涉及到的知识点分别是: Each数据循环、公式使用、if-else逻辑判断、加载图片、动态表格、数据分组、单元格超链接、SQL模板实现、自定义表达式解析引擎、自定义函数、单元格合并

Global site tag (gtag.js) - Google Analytics