一、问题描述

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

如何隐藏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]-单元格的秘密

这是系列——单元格的秘密. 前言请看: 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 ...

随机推荐

自动生成.py文件头部的C语言小程序

每次都 vi xxx.py 然后再打 #!/usr/bin/env python 等等的程序头信息感觉有点麻烦,于是便想着写一个小程序自动生成这些头信息了,顺便在 ~/.bashrc 里写入 alia ...

超级MINI STLINK V2 官方固件自动升级 ST-Link 【worldsing 笔记】

简介: 支持所有带SWIM接口的STM8系列单片机 支持所有带SWD接口的STM32系列单片机 完全兼容Keil,STVP,STVD,IAR,COSMIC,STM32 ST-LINK Utility! ...

js经验1

1. input 获得焦点  focus(); 2.获得文档的的title _title = document.title; 3.定时检查删除dom定时器 var deleteDomInterval ...

C# 开机自启动和最小化托盘显示

C# 开机自启动和最小化托盘显示 一.      C# 开机自启动 C# 开机自启动,这个功能是大多数服务型软件很常用一个功能,但是这个功能确是不 太好做,花了两天想对策.不过最终呢,结果还是很满意的 ...

ThinkJS框架入门详细教程(二)新手入门项目

一.准备工作 参考前一篇:ThinkJS框架入门详细教程(一)开发环境 安装thinkJS命令 npm install -g think-cli 监测是否安装成功 thinkjs -v 二.创建项目 ...

Mark标记功能的实现(像手工标记的一样)

今天看到一个网站的标记功能,觉得很不错,先记录一下,emm

&l ...

Icons - Material Design各种ICON图标大全

Icons - Material Design https://material.io/tools/icons/?icon=account_balance&style=baseline

unity中键盘WASD控制。(WS控制物体前后移动,AD控制左右旋转。)

private float rotateSpeed = 30f; private float movespeed = 5; void FixedUpdate() { //第一种控制移动 float h ...

Win7 VS2017简单编译FFMPEG播放器FFPlay

Win平台简单编译FFPlay播放器,顺便纪念下雷霄骅,一年前刚学FFMPEG时还看过他的博客,昨晚再次搜FFMPEG文章时才知道人已经走了... 做成了视频放到B站 https://www.bili ...

关于windows下基于php7.0.2下编写的第一个扩展

网上的教程是比较多的,但是基于php7+windows的教程非常之少,通过几天的摸索及参考很多资料,终于发现如下可以运行. php7要求使用vc2015,同时安装sdk,我使用的是8.1的window ...

excel公式识别html,POI/Excel/HTML单元格公式问题相关推荐

  1. java excel 设置列为日期,POI - 如何将单元格值设置为日期并应用默认Excel日期格式?...

    此代码示例可用于更改日期格式 . 在这里,我想从yyyy-MM-dd改为dd-MM-yyyy . 这里 pos 是列的位置 . import org.apache.poi.ss.usermodel.C ...

  2. POI:java导出excel,java设置单元格公式,求和

    POI:java设置单元格公式,求和 java导出excel,之前写过全量导出,但是有时候报表中需要汇总,或者其他公式的数据. 这里就需要对单元格的格式调整,设置公式 主要代码 //给单元格设置公式 ...

  3. java poi 设置时间空间_java - POI - 如何将单元格值设置为Date并应用默认的Excel日期格式?...

    java - POI - 如何将单元格值设置为Date并应用默认的Excel日期格式? 我已经使用Apache POI一段时间以编程方式读取现有的Excel 2003文件. 现在我有了一个新的要求,即 ...

  4. Excel引用函数(1):FORMULATEXT,取得单元格公式内容

    当需要读取单元格公式并修改公式内容时,通常要用到FORMULATEXT函数,以字符串的形式返回公式内容. 下述示例是将C列年终奖的计算公式读出来,每人再加100元,因为希望保留C列的公式内容,所以用如 ...

  5. java excel 边框_【web开发】☆★之利用POI操作Excel表格系列教程【9】单元格边框处理...

    [web开发]☆★之利用POI操作Excel表格系列教程[9]单元格边框处理 package csg.xiaoye.poidemo; import java.io.FileOutputStream; ...

  6. EXCEL 单元格公式(更新中)

    EXCEL 单元格公式(更新中) 字符串按指定位置分为两列 (2022年1月4日) 示例 简要说明 特殊情况 情况一:同一单元格中包含多个序号+内容(2022年1月6日) 用条件格式高亮表单未填充/勾 ...

  7. 【excel】根据单元格公式随机生成人名、及按概率生成不同值的测试数据

    目录 excel根据行号轮流选取不同的填充值 按概率选取填充值 随机生成18位数字(伪身份证号) 生成2到3字的随机人名 注意,在excel中应用公式时,单元格格式应设为常规. excel根据行号轮流 ...

  8. Excel技巧【标记多行数据连续一样的行】【第一个单元格公式适用于所有本列所有行】【按照逗号分列】【快速统计出各个项出现的次数】【冻结窗口】[表格分段选择数据][根据单元格内容引索其他单元格数据指针]

    标记多行数据一样的行 我这里有一列数据,现在想识别出多行数据连续一样的目的行,数据如下左图所示: 这里可以对F1单元格使用这样的公式:=IF(AND(E1=E2,E2=E3,E3=E4,E4=E5,E ...

  9. c# 获取excel单元格公式结果_每日一Excel技巧(熟能生巧):带公式的单元格,快速批量复制、填充...

    带公式的单元格,快速批量复制.填充技巧,提高工作效率. 方法一.拖拽填充柄 选中单元格,鼠标放在单元格右下角,当鼠标指针为黑色实心"十字"填充柄时,按住鼠标左键横向或纵向拖动,可将 ...

  10. excel表格内文字怎么换行_Excel单元格内如何换行,这几招快拿小本本记下来

    Excel单元格如何换行?我们在日常的数据统计中经常会遇到的问题.我们会遇到单元格太小导致输入的内容无法显示的情况.是不是苦恼?其实我们可以通过自动换行的方式将数据在单元格中以多行的方式显示,也就是e ...

最新文章

  1. Javascript代码段记录: utils
  2. 我泡在GitHub上的177天 by Ryan Seys
  3. php中调行高代码_单元格行高怎么设置
  4. 操作系统(十三)处理机调度的概念、层次
  5. 不要在viewWillDisappear:方法中移除通知
  6. WPF学习笔记 - 不一样的皇帝的新衣
  7. oracle离线文档查dbms_Oracle的健康检查–dbms_hm的使用 | 学步园
  8. html分块时边距的设置,html – 文本节点后第一个块的边距(垂直空间)?
  9. 学习spring必须java基础知识-动态代理
  10. #!/bin/sh与#!/bin/bash有区别
  11. 使用SCRT操作CentOS,实现上传下载文件
  12. hackmyvm之warez
  13. java模仿滴滴的程序_小程序模仿滴滴打车
  14. ubuntu安装fcitx五笔拼音输入法_Simplelife_新浪博客
  15. 如何快速撰写文章—伪原创
  16. UG/NX二次开发 选择坐标系控件 uc1630
  17. Serverless 可观测性的过去、现在与未来
  18. 苹果、天猫同步关停是因为发新品?这些猜想你看靠谱吗....
  19. 腾讯云主体信息相关问题解答教程
  20. centos6安装GitLab全程详解和常见问题解决

热门文章

  1. ZigBee单播通信
  2. 继承者来了!CentOS 创始人开辟新项目 Rocky Linux
  3. linux 编译libvlc,libvlc源码编译
  4. ftp传输工具 3款免费的ftp传输工具(ftp客户端定时上传下载新体验)
  5. 这就是我不建议去外包公司开发的原因?
  6. 一些常见的Common类
  7. 中国裁判文书网爬虫思路详细分析 (2018年11月上旬可用)
  8. oracle中字符串长度计算,根据 oracle 标准计算超长字符串的长度
  9. win7计算机共享用户名和密码,Win7共享提示用户名密码错误怎么办
  10. c语言如何过滤掉电话号码前缀86,从iPhone拨打国际电话号码使用加前缀的简单方法 | MOS86...