【问题解决】apache.poi 3.1.4版本升级到 5.2.3,导出文件报错版本无法解析
【问题解决】apache.poi 3.1.4版本升级到 5.2.3,导出文件报错无法解析
3.1.4版本代码:
/*** 创建workbook* @param inp* @return* @throws Exception*/public Workbook createworkbook(InputStream inp) throws Exception {if (!inp.markSupported()) {inp = new PushbackInputStream(inp, 8);}if (POIFSFileSystem.hasPOIFSHeader(inp)) {return new HSSFWorkbook(inp);}if (POIXMLDocument.hasOOXMLHeader(inp)) {return new XSSFWorkbook(OPCPackage.open(inp));}throw new IllegalArgumentException("你的excel版本目前poi解析不了");}
在POI 4.0.x版本过后,POIFSFileSystem.hasPOIFSHeader()与POIXMLDocument.hasOOXMLHeader()便弃用了,所以我们需要找到新版本的替代方法,为此查阅了不少资料。
这里有两个方案可以参考一下:
-
public Workbook createworkbook(InputStream inp) throws Exception {try (PushbackInputStream pushbackInputStream = new PushbackInputStream(inp, 8)) {byte[] header = new byte[8];int read = pushbackInputStream.read(header);pushbackInputStream.unread(header, 0, read);if (POIUtils.hasOOXMLHeader(header)) {return new XSSFWorkbook(OPCPackage.open(pushbackInputStream));} else if (POIUtils.hasPOIFSHeader(header)) {return new HSSFWorkbook(pushbackInputStream);} else {throw new IllegalArgumentException("不支持的 Excel 格式");}} }主要变更如下:
- 使用
POIUtils.hasOOXMLHeader(header)方法替换POIDataSamples.getSpreadSheetInstance().acceptsFile(header)方法。这个方法可以检测 XSSF 格式(OOXML)。 - 使用
POIUtils.hasPOIFSHeader(header)方法检测 HSSF 格式(97-2003 Excel)。 - 如果以上两种方式都无法识别,则抛出一个自定义的异常。
这种方式可以有效地替换之前的代码,并适用于 Apache POI 5.2.3 版本。
需要注意的是,需要引入
org.apache.poi.util.POIUtils类,这个类是 Apache POI 5.2.3 中新增的一个工具类,提供了一些常用的工具方法。 - 使用
-
public Workbook createworkbook(InputStream inp) throws Exception {try (PushbackInputStream pushbackInputStream = new PushbackInputStream(inp, 8)) {byte[] header = new byte[8];int read = pushbackInputStream.read(header);pushbackInputStream.unread(header, 0, read);if (isXSSF(header)) {return new XSSFWorkbook(OPCPackage.open(pushbackInputStream));} else if (isHSSF(header)) {return new HSSFWorkbook(pushbackInputStream);} else {throw new IllegalArgumentException("不支持的 Excel 格式");}} }private boolean isXSSF(byte[] header) {// 检查 OOXML 文件头标识return header[0] == (byte) 0x50 && header[1] == (byte) 0x4B && header[2] == (byte) 0x03 && header[3] == (byte) 0x04; }private boolean isHSSF(byte[] header) {// 检查 POIFS 文件头标识return header[0] == (byte) 0xD0 && header[1] == (byte) 0xCF && header[2] == (byte) 0x11 && header[3] == (byte) 0xE0; }这个替代方案中,自己实现了
isXSSF和isHSSF方法来检测 OOXML 和 POIFS 文件头标识,达到了同样的效果。
踩坑啊!
相关文章:
【问题解决】apache.poi 3.1.4版本升级到 5.2.3,导出文件报错版本无法解析
【问题解决】apache.poi 3.1.4版本升级到 5.2.3,导出文件报错无法解析 3.1.4版本代码: /*** 创建workbook* param inp* return* throws Exception*/public Workbook createworkbook(InputStream inp) throws Exception {if (!inp.markSupported()) {inp…...
(亲测有效)SpringBoot项目集成腾讯云COS对象存储(2)
接上文(亲测有效)SpringBoot项目集成腾讯云COS对象存储(1)-CSDN博客 目录 3、通用能力类 文件下载 测试 3、通用能力类 文件下载 官方文档介绍了2种文件下载方式。一种是直接下载 COS 的文件到后端服务器(适合服务…...
界面优化 - QSS
目录 1、背景介绍 2、基本语法 3、QSS 设置方式 3.1 指定控件样式设置 代码示例: 子元素受到影响 3.2 全局样式设置 代码示例: 使用全局样式 代码示例: 样式的层叠特性 代码示例: 样式的优先级 3.3 从文件加载样式表 代码示例: 从文件加载全局样式 3.4 使用 Qt Desi…...
实现基于TCP协议的服务器与客户机间简单通信
服务器端程序 #include <myhead.h> #define SER_PORT 6666 //服务器端口号 #define SER_IP "192.168.2.53" //服务器ip地址 int main(int argc, char const *argv[]) { /*创建套接字 int socket(int domain, int type, int protocol);*/ …...
在uniapp中使用navigator.MediaDevices.getUserMedia()拍照并上传服务器
产品提了这样一个需求: 移动端拍照上传后图片不保存在用户设备上,试了好几种方法,uni-file-picker、uni.chooseImage、input type‘file’,安卓手机都会默认把图片保存在手机,于是各种查资料,找到了以下方法…...
PULLUP
重要提示:PULLUP属性已被弃用,应替换为PULLTYPE 财产。 PULLUP在三态输出或双向端口上应用弱逻辑高,以防止 它从漂浮。PULLUP属性保证逻辑高电平,以允许三态网络 以避免在不被驱动时漂浮。 输入缓冲器(如IBUFÿ…...
【无标题】乐天HIQ壁挂炉使用
这里写自定义目录标题 1.按键①: 按一下,小液晶显示的温度是所设定的供暖温度; 按二下,小液晶显示的温度是所设定的生活热水温度; 按三下,小液晶显示的温度是所设定的室内温度; 如果忘记按几下的…...
使用Python编写AI程序,让机器变得更智能
人工智能(AI)是当今科技领域最热门的话题之一。随着Python编程语言的逐渐流行,它已经成为许多人工智能编程的首选语言。本文将介绍如何使用Python编写AI程序,让机器变得更智能。 首先,Python提供了大量的AI库和工具&a…...
VScode + PlatformIO 和 Keil 开发 STM32
以前经常使用 KEIL 写 STM32 的代码,自从使用 VScode 写 ESP32 后感觉 KEIL 的开发环境不美观不智能了,后面学习了 VScode 开发 STM32 。 使用过程中发现 串口重定向在 KEIL 中可以用,搬到 VScode 后不能用,不用勾选 Use Micro LI…...
PostgreSQL 练习 ---- psql 新增连接参数
目标 添加一个连接参数,默认为 false 。当 psql 连接时,若该连接参数非 “true” 时,用户 “u1“ 对表对象无操作权限,包括自己拥有的表。 连接机制简介 连接过程如下所述: 客户端初始化一个空连接,设置…...
pdf翻译软件哪个好用?多语言轻松转
想知道怎么用pdf翻译器在线翻译吗?无需复杂操作,一键即可解锁语言障碍。 在这个全球化日益加深的时代,掌握pdf文件的快速翻译技巧尤为重要。 无论是学习、工作还是国际交流,以下4个免费pdf翻译技巧都将是你不可或缺的得力助手。…...
培训第三十天(ansible模块的使用)
上午 ansible是⼀种由Python开发的⾃动化运维⼯具,集合了众多运维⼯ 具(puppet、cfengine、chef、func、fabric)的优点,实现了批量 系统配置、批量程序部署、批量运⾏命令等功能。 1、学习ansible的使用 ansible 主机ip|域名|组…...
关于Log4net的使用记录——无法生成日志文件输出
关于Log4net的使用记录 前言遇到的问题具体使用总结前言 最近在使用log4net进行日志记录,保存一些需要的数据,以便后期使用需要。在使用的时候出现没有生成日志文件,针对这些问题,发现解决的办法! 遇到的问题 报错,提示没有找到对应的文件。 log4net:ERROR Failed to f…...
golang Kratos 概念
"Kratos"指的是一个开源的微服务框架,它用于构建高性能和可扩展的云原生应用。Kratos框架提供了一套丰富的工具和库,旨在简化微服务的开发和维护。下面是Kratos框架的一些基本概念: 服务构建与注册: gRPC与HTTP服务&…...
入门 MySQL 数据库:基础指南
简介 MySQL 是一个非常流行的开源关系型数据库管理系统(RDBMS),广泛用于 Web 应用、企业应用和数据仓库。本博客将引导你从零开始,学习 MySQL 数据库的基础知识。 什么是 MySQL? MySQL 是一个基于 SQL(Str…...
【Hexo系列】【3】使用GitHub自带的自定义域名解析
上一期我们通过学习【Hexo系列】【2】使用Vercel加速Hexo博客访问使用Vercel进行GitHub同步与加速,有时候Vercel也不太稳定访问不了。本身GitHub也是支持自定义域名的,本次教程将讲解如何使用GitHub自带的自定义域名解析。 1. GitHub设置 1.1 登录GitH…...
智能监控,无忧仓储:EasyCVR视频汇聚+AI智能分享技术为药品仓库安全保驾护航
随着科技的飞速发展,药品仓库的安全管理正迎来前所未有的变革。药品作为直接关系到公众健康的重要物资,其安全存储和监管显得尤为重要。在这个背景下,视频汇聚平台EasyCVR视频智能管理系统的应用,为药品仓库的安全监管提供了强有力…...
本地创建PyPI镜像
背景: 在安装一些库时,经常需要反复下载包(有的体积比较大,所以会比较慢),所以考虑在本地创建一个pypi镜像,把常用的库缓存下来,这样安装就会很省事.比较从本地安装库和从服务器下载会快很多. 安装使用 安装:pip install devpi 初始化: devpi-init --serverdirF:\pypioutput…...
使用 Elasticsearch RestHighLevelClient 进行查询
Elasticsearch 提供了多种客户端库,以方便不同编程语言的用户进行操作。其中,Java 的 RestHighLevelClient 是 Elasticsearch 官方推荐的客户端之一,用于 Java 应用程序中。本文将介绍如何使用 Java 的 RestHighLevelClient 进行 Elasticsear…...
【jvm】符号引用
目录 1. 说明2. 特点3. 组成与格式4. 作用5. 过程 1. 说明 1.在Java虚拟机中,符号引用(Symbolic Reference)是一种重要的引用机制。2.它主要用于在编译阶段和类加载阶段之间建立对类、方法、字段等元素的引用关系。3.符号引用是指用一个符号…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
