当前位置: 首页 > news >正文

【问题解决】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()便弃用了,所以我们需要找到新版本的替代方法,为此查阅了不少资料。

这里有两个方案可以参考一下:

  1. 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 格式");}}
    }
    

    主要变更如下:

    1. 使用 POIUtils.hasOOXMLHeader(header) 方法替换 POIDataSamples.getSpreadSheetInstance().acceptsFile(header) 方法。这个方法可以检测 XSSF 格式(OOXML)。
    2. 使用 POIUtils.hasPOIFSHeader(header) 方法检测 HSSF 格式(97-2003 Excel)。
    3. 如果以上两种方式都无法识别,则抛出一个自定义的异常。

    这种方式可以有效地替换之前的代码,并适用于 Apache POI 5.2.3 版本。

    需要注意的是,需要引入 org.apache.poi.util.POIUtils 类,这个类是 Apache POI 5.2.3 中新增的一个工具类,提供了一些常用的工具方法。

  2. 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;
    }	
    

    这个替代方案中,自己实现了 isXSSFisHSSF 方法来检测 OOXML 和 POIFS 文件头标识,达到了同样的效果。

踩坑啊!

http://www.lryc.cn/news/426067.html

相关文章:

  • (亲测有效)SpringBoot项目集成腾讯云COS对象存储(2)
  • 界面优化 - QSS
  • 实现基于TCP协议的服务器与客户机间简单通信
  • 在uniapp中使用navigator.MediaDevices.getUserMedia()拍照并上传服务器
  • PULLUP
  • 【无标题】乐天HIQ壁挂炉使用
  • 使用Python编写AI程序,让机器变得更智能
  • VScode + PlatformIO 和 Keil 开发 STM32
  • PostgreSQL 练习 ---- psql 新增连接参数
  • pdf翻译软件哪个好用?多语言轻松转
  • 培训第三十天(ansible模块的使用)
  • 关于Log4net的使用记录——无法生成日志文件输出
  • golang Kratos 概念
  • 入门 MySQL 数据库:基础指南
  • 【Hexo系列】【3】使用GitHub自带的自定义域名解析
  • 智能监控,无忧仓储:EasyCVR视频汇聚+AI智能分享技术为药品仓库安全保驾护航
  • 本地创建PyPI镜像
  • 使用 Elasticsearch RestHighLevelClient 进行查询
  • 【jvm】符号引用
  • 征服云端:Java微服务与Docker容器化之旅
  • python 如何实现执行selenium自动化测试用例自动录屏?
  • 03 网络编程 TCP传输控制协议
  • 1. 数据结构——顺序表的主要操作
  • [openSSL]TLS 1.3握手分析
  • 无人机之螺旋桨的安装与维护
  • 手机设备IP地址切换:方法、应用与注意事项
  • 华为HCIP证书好考吗?详解HCIP证书考试难易程度及备考策略!
  • 《SPSS零基础入门教程》学习笔记——05.模型入门
  • 如何用不到一分钟的时间将Excel电子表格转换为应用程序
  • WordPress 中 cURL 请求出现 504 网关超时错误的解决方法