通过POI获取公式列的值但不刷新仍是上一次值的解决方案

在做Excel导出是遇到一个问题,通过POI修改Excel的公式列后再次读取时数据不是最新修改值,奇怪的是在WPS保存后再次读取就可以读取到最新修改值了
使用的读取方法为

cell.getNumericCellValue()

这样读取到的数据为上一次的缓存值

经过改进使用重新计算公式的方法在读取时重新计算一下公式可以读到最新值,但我这里在循环执行时会报错,所以不可用

          FormulaEvaluator formulaEvaluator = new XSSFFormulaEvaluator((XSSFWorkbook) workbook);CellType cellType = cell.getCellType();if (cellType.equals(CellType.FORMULA)) {String cellFormula = cell.getCellFormula();System.out.println(cellFormula);CellValue evaluate = formulaEvaluator.evaluate(cell);System.out.println(evaluate.formatAsString());}

问题分析

当xlsx表格被生成并在Excel程序中打开并保存之后(这个过程Excel会把公式结果计算出来),该文件附带有两套值,一套是公式全都没有计算的,一套是公式计算了结果的。
(如果没有被Excel打开并保存,则保存的值不会被重新计算,仍然是上次读取后缓存的值。
如想重新获得两套值,则仍旧需要用Excel程序打开该文件并保存。

解决方法

在Java代码中通过调用命令行的形式调用Python脚本或Linux命令打开Excel软件模拟手动保存动作

Runtime.getRuntime().exec(arguments)

1.Windows下:

可以使用Python安装win32com的第三方库,模拟一下手动打开在关闭Excel软件的操作,这样可以取到最新的值.
注意必须使用Microsoft Excel软件不能使用WPS

from win32com.client import Dispatch
def just_open(filename):
xlApp = Dispatch(“Excel.Application”)
xlApp.Visible = False
xlBook = xlApp.Workbooks.Open(filename)
xlBook.Save()
xlBook.Close()

2.Linux或Mac下:

由于Linux或Mac不同于windows系统所以无法使用Python第三方库win32com的解决方案。
我这里的解决方案是在服务器上安装:LibreOffice
这是一款开源的Office软件
用它来把代码生成的xlsx表在转化成xls或者将xls转换成xlsx,经过测试相当完成了一次打开保存关闭的操作,这样底层就会生成两套值了
这样就可以获取到最新值.

LibreOffice For Linux安装步骤

安装Libreoffice
1、查看当前yum支持当前Linux安装的LibreOffice版本

yum search libreoffic

2、查看libreoffice安装包基本信息

yum info libreoffice

3、安装libreoffice

yum install -y libreoffice

4.查看是否安装成功

libreoffice --version

5.进行一下文件转换操作,将xls转换为xlsx

libreoffice --headless --convert-to xlsx  要转换的文件路径 --outdir 输出目录

转换后发现缺失字体的可以安装一下Windows的字体包(自行搜索教程)

然后重启LibreOffice服务

kill -9 pid

执行

libreoffice

LibreOffice For Mac安装步骤

去官网下载对应mac版本的安装包 mac分为intel芯片版和M芯片版
向安装其他软件一样安装,安装完后打开软件,设置一下允许访问的文件夹
1进入到应用程序找到Libreoffice,右键查看包路径

/Applications/LibreOffice.app/Contents/MacOS

2.进入当前目录

cd /Applications/LibreOffice.app/Contents/MacOS

3.执行转换命令

./soffice  --headless --convert-to xlsx 目标文件路径 --outdir 输出目录
或
/Applications/LibreOffice.app/Contents/MacOS/soffice  --headless --convert-to xlsx 目标文件路径 --outdir 输出目录### LibreOffice For Linux安装步骤
转换后再次通过cell.getNumericCellValue()读取到的值就是修改后的最新值了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/217094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LINQ简述

语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。 为什么需要LINQ? 查询是一种从数据源检索数据的表达式。 查询通常用专门的查询语言来表示。 随着时间的推移,人们已经为各种数据源开发了不同的语言;例如&#xff0…

flink-1.17.2的单节点部署

flink 简介 Apache Flink 是一个开源的流处理和批处理框架,用于大数据处理和分析。它旨在以实时和批处理模式高效处理大量数据。Flink 支持事件时间处理、精确一次语义、有状态计算等关键功能。 以下是与Apache Flink相关的一些主要特性和概念: 流处理…

养牛场北斗综合管理系统解决方案

1.系统架构 随着我国北斗卫星导航定位系统的快速发展和定位精度的持续不断提高,在牛身上穿戴定位终端后可以实现对牛的位置和温度的测量,在蜂窝网络正常的情况下,定位和温度数据通过蜂窝网络通信方式回传到监控云平台,在蜂窝网络缺…

uniapp实现拨打电话跳转手机拨号界面 (ios和安卓通用)

效果展示:左边为安卓系统展示,右边为ios系统展示 代码: toPhone(){uni.makePhoneCall({phoneNumber: "10086", //要拨打的手机号success: (res) > {// console.log("调用成功")},fail: (res) > {// console.log(调…

【嵌入式——C语言】关键字

【嵌入式——C语言】关键字 数字类型相关基本数据类型其他类型 存储相关registerstaticautoexternconst 控制语句相关其他 数字类型相关 基本数据类型 类型说明占用字节(32位)char声明字符型变量或函数返回值类型1字节short声明短整型变量或函数2字节int声明整型变量或函数4字…

784. 字母大小写全排列 dfs + 回溯算法 + 图解 + 笔记

784. 字母大小写全排列 - 力扣(LeetCode) 给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。 返回 所有可能得到的字符串集合 。以 任意顺序 返回输出 示例 1: 输入&#xf…

leetcode24. 两两交换链表中的节点

题目描述 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head [1,2,3,4] 输出&#…

小程序面试总结

简单描述下微信小程序的相关文件类型 微信小程序主要涉及以下几种文件类型: JSON 文件(.json): 用于描述小程序的配置信息,比如全局配置、页面路径、窗口样式等。WXML 文件(.wxml)&#xff1a…

MySQL的事务以及springboot中如何使用事务

事务的四大特性: 概念: 事务 是一组操作的集合,它是不可分割的工作单元。事务会把所有操作作为一个整体,一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 注意: 默认MySQ…

sylar高性能服务器-配置(P10-p11)代码解析+调试分析

文章目录 p9:配置模块搭建一、ConfigvarBase二、ConfigVar三、Config四、小结 p10:YAML的使用一、安装yaml-cpp二、使用yaml-cpp三、代码解析 P11:YAML与日志的整合一、方法函数二、代码调试三、test_config结果四、小结 p9:配置模…

18、责任链模式(Chain of Responsibility Pattern)

责任链模式,是用于避免请求发送者与多个请求处理者耦合在一起,让所有请求的处理者持有下一个对象的引用,从而将请求串联成一条链,在有请求发生时,可将请求沿着这条链传递,直到遇到该对象的处理器。用户只需…

华为或荣耀手机禁止强制升级鸿蒙系统的终极方法

需要有数据传输的usb线.打开usb调试模式. 进这个链接下载华为ADB一键卸载VS重装软件 按里面的视频说明,输入88 然后回车即可 https://download.csdn.net/download/viqecel/12161462

throw 用作异常规范

throw 用作异常规范 throw 关键字除了可以用在函数体中抛出异常,还可以用在函数头和函数体之间,指明当前函数能够抛出的异常类型,这称为异常规范(Exception specification),有些教程也称为异常指示符或异常…

SVN版本回退

文章目录 SVN版本回退 SVN版本回退 一、revert to this version和revert to this version的区别: 基于4674版本执行"revert to this version"操作效果: 基于4674版本执行"revert changes from this version"操作效果&#xff1…

梯形速度规划算法原理及代码

梯形速度规划的原理&#xff1a;梯形速度规划算法 对应的代码如下&#xff1a; #pragma once #include <cmath> #include <iostream> #include <vector> struct SpeedPoint {SpeedPoint() {s 0;speed 0;t 0;}double s; // mdouble speed; // m/sdo…

推荐开源项目-网络应用协议框架Socket.D

基于事件和语义消息流的网络应用协议 Socket.D 0 代码仓库地址1 该开源项目特点2 项目结构3 核心理念-协议帧Frame4 结束语 0 代码仓库地址 https://gitee.com/noear/socketd 1 该开源项目特点 代码风格优雅文档说明齐全测试用例非常人性化上手快&#xff0c;代码用例很多代…

JDBC链接MySQL,实现对Goods表的增删改查并封装JDBC

项目目录结构 数据库配置 1.创建goods表 2.创建goods实体 package homework.MyJDBC;public class Goods {private int id;private String gId;private String gName;private float gPrice;private int gNum;public int getId() {return id;}public void setId(int id) {this.i…

Qt之自定义QToolTip,去掉显示动画和隐藏延时

一.效果 先来看看Qt原生QToolTip的缺点: 1.当提示内容无变化时,弹窗无法移动。只能先传个空字符串强制弹窗隐藏,然后在新位置再传个字符串。 If the text is the same as the currently shown tooltip, the tip will not move. You can force moving by first hiding the t…

晶圆划片机助力LED陶瓷基板高效切割:科技提升产业新高度

博捷芯半导体划片机在LED陶瓷基板制造领域&#xff0c;晶圆划片机作为一种先进的切割工具&#xff0c;正在为提升产业效率和产品质量发挥重要作用。通过精确的切割工艺&#xff0c;晶圆划片机将LED陶瓷基板高效地切割成独立的芯片&#xff0c;为LED产业的快速发展提供了有力支持…

ViT:视觉 Transformer

ViT&#xff1a;视觉 Transformer 网络结构Transformer 编码器MLP 头CNN 和 Transformer 网络结构 Transformer 的优势&#xff1a;注意力机制相当于一个多标签检索系统&#xff0c;位置嵌入能知道每个单词的位置&#xff0c;而且适合并行。 尝试把 Transformer 迁移到视觉领…