apache.poi读取.xls文件时The content of an excel record cannot exceed 8224 bytes

news2024/11/25 2:47:47

目录

  • 问题描述
  • 版本
  • 定位:打印size最大的Record
  • 定位:RefSubRecord
  • 解决
  • 代码

问题描述

使用apache.poi读取.xls文件时有The content of an excel record cannot exceed 8224 bytes的报错。待读取的文件的内容也是通过apache.poi写入的,我的文件修改步骤是先删除页签然后写入页签(页签名是保持不变的),这样一次修改的结果也是符合我的预期的,但是某次程序读取文件时就出现了下面的报错,而且手动也打不开文件了。

Exception in thread "main" org.apache.poi.util.RecordFormatException: The content of an excel record cannot exceed 8224 bytes
	at org.apache.poi.hssf.record.RecordInputStream.nextRecord(RecordInputStream.java:222)
	at org.apache.poi.hssf.record.RecordFactoryInputStream.nextRecord(RecordFactoryInputStream.java:253)
	at org.apache.poi.hssf.record.RecordFactory.createRecords(RecordFactory.java:494)
	at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:356)
	at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:413)
	at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:394)
	at com.mark.learning.bug.excel.ExcelXls.addSheet(ExcelXls.java:28)
	at com.mark.learning.bug.excel.ExcelXls.main(ExcelXls.java:84)

在这里插入图片描述

版本

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>

定位:打印size最大的Record

既然提示某一个Record超过了上限了,那我就把这个内容打印出来看看。最新定位到ExternSheetRecord 类的_list属性。

267record的size:6066
[EXTERNSHEET]
   numOfRefs     = 1010
refrec         #0: extBook=0 firstSheet=-1 lastSheet=-1
refrec         #1: extBook=0 firstSheet=-1 lastSheet=-1
refrec         #2: extBook=0 firstSheet=-1 lastSheet=-1
refrec         #3: extBook=0 firstSheet=-1 lastSheet=-1
refrec         #4: extBook=0 firstSheet=-1 lastSheet=-1
refrec         #5: extBook=0 firstSheet=-1 lastSheet=-1
public class ExternSheetRecord extends StandardRecord {

    public final static short sid = 0x0017;
	private final List<RefSubRecord> _list;//这里有很多的记录信息

定位:RefSubRecord

RefSubRecord记录是什么信息?什么时候进行初始化?我在构造函数打了一个断点,发现每当删除一个页签或者新增一个页签就会创建RefSubRecord页签
在这里插入图片描述
在这里插入图片描述
这里有意思的是删除页签的时候会把对应索引的记录的firstSheetIndexlastSheetIndex修改为-1。但是后面新增的从时候又尝试根据这两个变量找到对应的索引

在这里插入图片描述
在这里插入图片描述
这样就导致到了ExternSheetRecord 类的_list属性会随着程序的运行不断的增长!

解决

1.直接替换文件类型将.xls换位新版的.xlsx
2.升级版本apache.poi版本,我尝试升级为3.8版本的时候发现就没有这个问题了,原因是再3.8中删除的删除的页签的时候不会修改RefSubRecord的信息
3.17的删除逻辑
在这里插入图片描述
3.8的删除逻辑 (少了上面红框的内容)
在这里插入图片描述

代码

复现...exceed 8224 bytes报错的代码

public class ExcelTest {

    private static int createSheetCnt = 0;
    private static final String path = "C:\\Users\\Desktop\\test2.xls";

    public void addSheet() {
        try {
            File file = new File(path);
            FileInputStream in = new FileInputStream(file);
            HSSFWorkbook workbook = new HSSFWorkbook(in);
            in.close();

            String sheetName = "test";
            int sheetIndex = workbook.getSheetIndex(sheetName);
            if (sheetIndex >= 0) {
                //页签存在删除页签
                workbook.removeSheetAt(sheetIndex);
            }
            //新建一个页签写入文件
            workbook.createSheet(sheetName);
            FileOutputStream fileOut = new FileOutputStream(path);
            workbook.write(fileOut);
            fileOut.close();

            System.out.println("创建页签次数:" + ++createSheetCnt);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Test
    public void test() {
        for (int i = 0; i < 10000; i++) {
            addSheet();
        }
    }
}

打印record信息的方法

    public void printlnRecords() {
        try {
            File file = new File(path);
            FileInputStream in = new FileInputStream(file);
            HSSFWorkbook workbook = new HSSFWorkbook(in);
            in.close();

            InternalWorkbook internalWorkbook = workbook.getInternalWorkbook();
            List<Record> records = internalWorkbook.getRecords();
            System.out.println("records size:" + records.size());
            int maxIndex = 0;
            int maxRecordSize = 0;
            for (int i = 0; i < records.size(); i++) {
                Record record = records.get(i);
                int recordSize = record.getRecordSize();

                System.out.println("第" + i + "个record的size:" + recordSize);
                System.out.println(record);
                System.out.println();

                if (recordSize > maxRecordSize) {
                    maxRecordSize = recordSize;
                    maxIndex = i;
                }
            }
            System.out.println("第" + maxIndex + "个record的有最大size:" + maxRecordSize);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

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

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

相关文章

【sqlmap】sqli-labs速通攻略

sqli-labs工具速通 Less-1 sqlmap -u http://127.0.0.1:8081/Less-1/?id1 --batch --dbs sqlmap -u http://127.0.0.1:8081/Less-1/?id1 --batch -D security --tables sqlmap -u http://127.0.0.1:8081/Less-1/?id1 --batch -D security -T users --columns sqlmap -u ht…

购物清单 | 双十一加购率最高好物合集,数码购物车必备!

​双十一来临&#xff0c;小伙伴们肯定已经被种草了很多很多清单&#xff0c;开始买买买了&#xff01;但是&#xff0c;作为一个数码博主&#xff0c;怎么能少了数码产品&#xff01;今天我给大家准备了一份数码人专属的购物清单&#xff0c;快来看看吧&#xff01; 运动耳机…

[水墨:创作周年纪念] 特别篇!

本篇是特别篇&#xff01;&#xff01; 个人主页水墨不写bug // _ooOoo_ // // o8888888o // // 88" . "88 …

如何方便地打出「」和『』

比起英文中的引号 ‘’和 “”&#xff0c;我更喜欢使用中文直角引号&#xff1a;「」和 『』。 此外&#xff0c;在港澳台、日本这几个地区中&#xff0c;就经常使用『』和「」&#xff1a; ​ ‍ 注意&#xff1a;不同地区的习惯可能有所不同。在汉语中『』、「」分别为双…

数学公式编辑器免费版下载,mathtype和latex哪个好用

选择适合自己的公式编辑器需要考虑多个因素。首先&#xff0c;您需要确定编辑器支持的功能和格式是否符合您的需求&#xff0c;例如是否可以插入图片、导出各种文件格式等。其次&#xff0c;您可以考虑编辑器的易用性和界面设计是否符合您的个人喜好。另外&#xff0c;您还可以…

面向对象特性中 继承详解

目录 概念&#xff1a; 定义&#xff1a; 定义格式 继承关系和访问限定符 基类和派生类对象赋值转换&#xff1a; 继承中的作用域&#xff1a; 派生类的默认成员函数 继承与友元&#xff1a; 继承与静态成员&#xff1a; 复杂的菱形继承及菱形虚拟继承&#xff1a; 虚…

手机号归属地查询-手机号归属地-手机号归属地-运营商归属地查询-手机号码归属地查询手机号归属地-运营商归属地

手机号归属地查询API接口是一种网络服务接口&#xff0c;允许开发者通过编程方式查询手机号码的注册地信息。关于快证签API接口提供的手机号归属地查询服务&#xff0c;以下是一些关键信息&#xff1a; 一、快证签API接口简介 快证签API接口可能是一个提供多种验证和查询服务…

「自动化测试」Selenium 的使用

使用 Selenium 需要先导入相关依赖 <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.0.0</version> </dependency><dependency><groupId>io.gith…

免费录屏神器!这四款软件让你快捷录屏~

随着技术的进步&#xff0c;免费的录屏软件如雨后春笋般涌现&#xff0c;为我们的工作、学习和娱乐提供了极大的便利。今天&#xff0c;就让我来为大家推荐几款备受好评的免费录屏软件&#xff0c;并分享一下使用感受吧&#xff01; 一、福昕录屏 直通车&#xff08;粘贴到浏览…

OJ在线评测系统 微服务高级 Gateway网关接口路由和聚合文档 引入knife4j库集中查看管理并且调试网关项目

Gateway微服务网关接口路由 各个服务之间已经能相互调用了 为什么需要网关 因为我们的不同服务是放在不同的端口上面的 如果前端调用服务 需要不同的端口 8101 8102 8103 8104 我们最好提供一个唯一的 给前端去调用的路径 我们学习技术的时候必须要去思考 1.为什么要用&am…

回溯算法:一个模板解决排列组合问题

回溯算法 在初遇排列组合题目时&#xff0c;总让人摸不着头脑&#xff0c;但是当我做了很多题目后&#xff0c;发现几乎能用同一个模板做完所有这种类型的题目&#xff0c;大大提高了解题效率。回溯是递归的副产品&#xff0c;只要有递归就会有回溯。 回溯法很难&#xff0c;…

77寸OLED透明触摸屏有哪些应用场景

说到77寸OLED透明触摸屏&#xff0c;那可真是市场营销中的一大亮点&#xff0c;应用场景多到数不清&#xff01;我这就给你细数几个热门的&#xff1a; 商业展示&#xff1a;这可是77寸OLED透明触摸屏的拿手好戏&#xff01;在高端零售店铺里&#xff0c;它可以作为陈列窗口&am…

yolov测试各项指标的流程

# yolov测试各项指标的流程: 载入模型, 其中包括类别数等; 按照 batch_size 逐张图片进行预测 得到预测标签: predn 和 实际标签 labelsn, 其中 末尾的 n 表示经过了原图适配的 bbox坐标. predn: {tensor: (3,6)},表示预测到了3个标签, 表示[x1, y1, x2, y2, confidence, clas…

IO重定向

文章目录 IO重定向概念3个标准文件描述符“最低可用文件描述符”原则 默认的连接&#xff1a;tty使用close then open将stdin定向到文件使用open..close..dup..close将stdin定向到文件使用open..dup2..close将stdin重定向到文件课上实验 IO重定向 大多数的程序不接收输出文件名…

Deformable Transformer论文笔记

原文链接 [2010.04159] Deformable DETR: Deformable Transformers for End-to-End Object Detection (arxiv.org)https://arxiv.org/abs/2010.04159 原文笔记 What 作者结合了可变形卷积的稀疏空间采样和 Transformer 的关系建模能力的优点。提出了Deformable Detr Defor…

算法笔记(十三)——BFS 解决最短路问题

文章目录 迷宫中离入口最近的出口最小基因变化单词接龙为高尔夫比赛砍树 BFS 解决最短路问题 BFS(广度优先搜索) 是解决最短路径问题的一种常见算法。在这种情况下&#xff0c;我们通常使用BFS来查找从一个起始点到目标点的最短路径。 迷宫中离入口最近的出口 题目&#xff1a;…

can 总线入门———can简介硬件电路

文章目录 0. 前言1. CAN简介2. 主流通讯协议对比3. CAN 硬件电路4. CAN 电平标准5. CAN 收发器 0. 前言 博客内容来自B站上CAN总线入门教程视频讲解&#xff0c;博客中的插图和内容均为视频中的内容。视频链接 CAN总线入门教程 1. CAN简介 先来看看一它名字的意思&#xff0c…

Redis 缓存策略详解:提升性能的四种常见模式

在现代分布式系统中&#xff0c;缓存是提升性能和减轻数据库负载的关键组件。Redis 作为一种高性能的内存数据库&#xff0c;被广泛应用于缓存层。本文将深入探讨几种常用的 Redis 缓存策略&#xff0c;包括旁路缓存模式&#xff08;Cache-Aside Pattern&#xff09;、读穿透模…

强化学习入门到不想放弃-4

上回的地址&#xff1a;强化学习入门到不想放弃-3 (qq.com) 上上回地址&#xff1a;强化学习入门到不想放弃-2 (qq.com) 上上上回地址&#xff1a;强化学习入门到不想放弃-1 (qq.com) 好久没更新了&#xff0c;也是不知道写啥啊&#xff0c;&#xff08;有些文章刚写了就被有些…

鸽笼原理与递归 - 离散数学系列(四)

目录 1. 鸽笼原理 鸽笼原理的定义 鸽笼原理的示例 鸽笼原理的应用 2. 递归的定义与应用 什么是递归&#xff1f; 递归的示例 递归与迭代的对比 3. 实际应用 鸽笼原理的实际应用 递归的实际应用 4. 例题与练习 例题1&#xff1a;鸽笼原理应用 例题2&#xff1a;递归…