Java读取损坏的xls表格

news2024/9/20 10:29:26

Java读取损坏的xls表格

    • 1. 损坏的文件
      • 1.1 正常的xls文件用360解压后是这样↓
      • 1.2 被损坏的xls文件用360解压后是这样↓
    • 2. Java代码读取Excel文件分析
      • 2.1 使用EasyExcel读取损坏的xls文件报错
      • 2.2 使用POI读取损坏的xls文件报错
    • 3. 损坏文件修复方案
    • 4. 代码

由于不可抗原因在网站上下载下来xls文件被损坏了

1. 损坏的文件

1.1 正常的xls文件用360解压后是这样↓

在这里插入图片描述

1.2 被损坏的xls文件用360解压后是这样↓

在这里插入图片描述

2. Java代码读取Excel文件分析

Java 代码无论是使用EasyExcel,还是POI底层原理都是先把文件转为流

2.1 使用EasyExcel读取损坏的xls文件报错

Exception in thread "main" com.alibaba.excel.exception.ExcelAnalysisException: org.apache.poi.poifs.filesystem.NotOLE2FileException: Invalid header signature; read 0x0010000000080809, expected 0xE11AB1A1E011CFD0 - Your file appears not to be a valid OLE2 document
	at com.alibaba.excel.analysis.ExcelAnalyserImpl.<init>(ExcelAnalyserImpl.java:61)
	at com.alibaba.excel.ExcelReader.<init>(ExcelReader.java:30)
	at com.alibaba.excel.read.builder.ExcelReaderBuilder.build(ExcelReaderBuilder.java:214)
	at com.alibaba.excel.read.builder.ExcelReaderBuilder.sheet(ExcelReaderBuilder.java:251)
	at com.alibaba.excel.read.builder.ExcelReaderBuilder.sheet(ExcelReaderBuilder.java:243)
	at com.atomcloud.extservice.service.controller.TestController.main(TestController.java:62)

在这里插入图片描述
代码解释

该函数是一个构造函数,用于初始化一个POIFSFileSystem对象。它通过FileChannelFile对象来创建一个POIFSFileSystem对象,并且支持只读和错误时关闭通道的选项。以下是该构造函数的主要功能:
1.调用父类的构造函数进行初始化。
2.检查源文件的长度,如果长度为0,则抛出EmptyFileException异常。
3.根据源文件和只读标志创建FileBackedDataSource对象,并获取其通道。
4.如果源文件为空,则直接使用给定的FileChannel和只读标志创建FileBackedDataSource对象。
5.分配一个512字节的ByteBuffer对象,用于读取文件系统的头部信息。
6.从通道中读取完整的头部信息到ByteBuffer对象中。
7.创建HeaderBlock对象来解析头部信息。
8.调用readCoreContents方法读取文件系统的核心内容。
9.如果在读取过程中发生RuntimeExceptionIOException,则捕获异常。
10.如果设置了在错误时关闭通道,并且通道不为空,则关闭通道。
11.抛出捕获的异常。
注意:该构造函数只能通过FileChannelFile对象来创建POIFSFileSystem对象,并且支持只读和错误时关闭通道的选项。

2.2 使用POI读取损坏的xls文件报错

org.apache.poi.poifs.filesystem.NotOLE2FileException: Invalid header signature; read 0x0010000000080809, expected 0xE11AB1A1E011CFD0 - Your file appears not to be a valid OLE2 document
	at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:151)
	at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:117)
	at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:285)
	at com.atomcloud.common.excel.handler.Excel2003Reader.process(Excel2003Reader.java:201)
	at com.atomcloud.common.utils.ExcelUtil.readLargeExcelFiles(ExcelUtil.java:92)
	at com.atomcloud.common.utils.ExcelUtil.readLargeExcelFile(ExcelUtil.java:66)
	at com.atomcloud.common.utils.ExcelUtil.readLargeExcelFile(ExcelUtil.java:58)
	at com.atomcloud.extservice.service.controller.TestController.main(TestController.java:65)

在这里插入图片描述
代码解释

该函数的作用是将输入流InputStream转换为POIFS文件系统对象。它主要执行以下操作:
1.初始化ReadableByteChannel通道和ByteBuffer缓冲区,用于读取输入流数据。
2.读取并解析文件头,创建HeaderBlock对象,并检查块计数的合理性。
3.计算最大文件大小,并抛出异常如果文件大小超过2GB4.分配足够的缓冲区读取整个文件内容。
5.从输入流读取数据到缓冲区,并使用ByteArrayBackedDataSource创建数据源。
6.关闭通道并在成功读取数据后关闭输入流。
7.最后,读取核心内容完成初始化。
这个函数处理了大量文件读取过程中的细节,确保能够安全有效地从输入流中读取文件数据。

3. 损坏文件修复方案

  • 方案一:调用API修复文件,找了半天没找到(暂时放弃)
  • 方案二:损坏的文件用wps打开能正常打开,wps既然能打开那他肯定有自己兼容功能,先用wps打开,保存,再看一下文件奇怪的恢复正常了,所以我们的解决方案就是搞个客户端,使用wps打开文件,保存文件,关闭wps,经典的大象放冰箱三步骤。

方案二进一步解读:三步骤看似简单想通过简单的命令实现并不简单,Java中提供了Runtime.getRuntime().exec(“命令”),执行外部命令或程序,打开,保存,关闭,3个命令放在一起执行没有达到想要的结果,分开三次执行exec命令也没达到效果。最终想了想还是分而治之各自采用不同的方案:

  1. 打开使用exec执行命令;
  2. 保存调用Robot 对象默认点击键盘快捷键Ctrl+S;
  3. 关闭使用taskkill是用来终止进程;

一些看似不太聪明的方案成功解决了问题!!!

4. 代码

   /**
     * 修复思想  使用windows自带工具 wps或者office
     * 1.使用命令让input.xls文件用wps打开
     * 2.操作保存
     * 3.退出wps
     *
     * @param args
     */
    public static void main(String[] args) {
        try {
            // 设置要修复的 XLS 文件路径
            String inputFilePath = "C:\\Users\\84869\\Desktop\\20240731092917.xls";
            Runtime runtime = Runtime.getRuntime();

            String openCommand = "\"D:\\Program Files (x86)\\WPS\\WPS Office\\ksolaunch.exe\" \"" + inputFilePath + "\"";
            Process openProcess = runtime.exec(openCommand);
            int openExitCode = openProcess.waitFor();
            Thread.sleep(3000);
            try {
                // 创建 Robot 对象
                Robot robot = new Robot();
                // 按下 Ctrl+S 键
                robot.keyPress(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_S);
                robot.keyRelease(KeyEvent.VK_S);
                robot.keyRelease(KeyEvent.VK_CONTROL);

                // 延迟 1 秒,模拟用户操作
                Thread.sleep(1000);
            } catch (AWTException | InterruptedException e) {
                log.info("erwaesr:", e);
            }

            String cmd = "taskkill /f /t /im wps.exe";
            Process close = runtime.exec(cmd);
            int closeExitCode = close.waitFor();

            System.out.println("Excel file saved successfully.");

            File file = new File("C:\\Users\\84869\\Desktop\\20240731092917.xls");
            FileInputStream fileInputStream = new FileInputStream(file);
            List<JSONObject> excelJsonArray = ExcelUtil.readLargeExcelFile(file.getName(), fileInputStream, null, -1, -1);
            System.out.println();
        } catch (Exception e) {
            log.info("exception :", e);
        }
    }

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

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

相关文章

C语言中数据类型

一、C 语言中数据类型 基本数据类型&#xff1a; 整型&#xff08;int&#xff09;&#xff1a;用于存储整数&#xff0c;如&#xff1a;1、2、3等。字符型&#xff08;char&#xff09;&#xff1a;用于存储单个字符&#xff0c;如&#xff1a;‘a’、‘b’、c’等。浮点型&a…

华为地图服务功能概览 -- HarmonyOS自学7

华为地图服务式Harmony OS生态下的一个地图服务&#xff0c;为开发者提供强大而便捷的地图能力&#xff0c;助力全球开发者实现个性化地图呈现&#xff0c;地图搜索和路线规划功能。 主要包括七大功能&#xff1a;静态图&#xff0c;场景化控件&#xff0c;地点搜索&#xff0c…

【AIGC】CFG:基于扩散模型分类器差异引导

摘要 分类器指导是最近引入的一种方法&#xff0c;在训练后在条件扩散模型中权衡模式覆盖率和样本保真度&#xff0c;在精神上与其他类型的生成模型中的低温采样或截断相同。分类器引导将扩散模型的分数估计与图像分类器的梯度相结合&#xff0c;因此需要训练与扩散模型分离的…

WLAN实验简述

一&#xff1a;配置生产AP1上级接入层交换机LSW3 sys [Huawei]sysname LSW3 [LSW3]undo info-center enable [LSW3]vlan batch 10 100 [LSW3]int g0/0/2 [LSW3-GigabitEthernet0/0/2]port link-type trunk [LSW3-GigabitEthernet0/0/2]port trunk allow-pass vlan 10 100 [LSW…

【爱给网-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

OpenGL笔记二十一之几何类设计

OpenGL笔记二十一之几何类设计 —— 2024-09-16 下午 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记二十一之几何类设计1.运行1.1.立方体运行1.2.球体运行 2.几何类搭建1.立方体分析2.球体分析3.图片资源文件4.关键实现4.1.geometry.h4.2.geometry.cpp…

您使用过哪些AI集成工具提升工作效率

您使用过哪些AI集成工具提升工作效率 随着AI技术的飞速发展&#xff0c;个人开始寻求高效的方法来构建和管理定制化模型&#xff0c;以简化复杂的开发过程&#xff0c;提高工作效率。说起用AI集成工具来提高工作效率&#xff0c;个人作为开发者&#xff0c;确实在使用AI代码辅助…

进口车电子信息单二维码解密

目录 效果 二维码信息 解密后信息 进口车电子信息单二维码解密 效果 二维码信息 QzcOcj0yNsb9cVZsGoZKBOrBbn4RJ6O0N4q9/R10ANBvPgWt1vO75YmnWHsImhQUluNYC/OUYwWiO2IljHAhPmSAm3BieWZpXwi1IGWzLKAkRGkTUpqhT2pwEhkbMKcFsfsBfxh9MT1KRy2YaDvLKwLvOVHp7ZJUh4DdDof6GBGfsvam…

Json和Http专栏

json 理论 什么是JSON? 规则 被大括号包括的是JSON对象,被中括号包括的是JSON数组. JSON数组JSON对象 实验 构建JSON 用代码实现如下json内容: //构建JSON void WirteJson() {QJsonObject rootObject;//1.插入name字段rootObject.insert("name","china&quo…

OpenAI o1:隐含在训练与推理间的动态泛化与流形分布

随着OpenAI o1发布&#xff0c;进一步激发了产业与学术各界对AGI的期待以及new scaling law下的探索热情&#xff0c;也看到来自社区和专业机构对o1的阐释&#xff0c;但总感觉还差点什么&#xff0c;因此决定以自己的角度分篇幅梳理下&#xff0c;并分享给大伙&#xff1a; O…

使用mlp算法对Digits数据集进行分类

程序功能 这个程序使用多层感知机&#xff08;MLP&#xff09;对 Digits 数据集进行分类。程序将数据集分为训练集和测试集&#xff0c;创建并训练一个具有两个隐藏层的 MLP 模型。训练完成后&#xff0c;模型对测试数据进行预测&#xff0c;并通过准确率、分类报告和混淆矩阵…

vmvare如何给centos7 设置静态IP地址

本章教程,主要介绍如何在vmvare中如何给虚拟机中设置静态IP地址。本章教程中使用的linux发行版是centos7。 目前没有静态IP地址,并且不能联网,此时我们需要给它配置一个静态IP,并且可以实现联网功能。 一、前置步骤 1、网络设置 2、添加网络 添加一个虚拟机网络,选择VMne…

C++笔记---stack和queue

1. stack的介绍及重要接口 stack---栈&#xff0c;是一种“先进后出&#xff0c;后进先出”的数据结构。 此处的stack是STL库中定义的一个类模板&#xff0c;用于实例化出存储各种类型数据的栈。 bool empty() const;判断栈是否为空(空true/非空false)size_t size() const;返…

Kafka日志索引详解与常见问题分析

目录 一、Kafka的Log日志梳理 1、Topic下的消息是如何存储的&#xff1f; 1. log文件追加记录所有消息 2. index和timeindex加速读取log消息日志 2、文件清理机制 1. 如何判断哪些日志文件过期了 2. 过期的日志文件如何处理 3、Kafka的文件高效读写机制 1. Kafka的文件…

刷题日记【160. 相交链表】

160. 相交链表 这虽然是道简单题&#xff0c;但是最简单的方法&#xff08;Set数组存一边然后另一边遍历判断当前结点是否存在于另一边&#xff09;性能很一般&#xff0c;可以思考用双指针来优化写法&#xff08;可以将空间复杂度降至 O(1)&#xff09; 捋思路时&#xff0c;…

Maya怎么把黑色的面反转为白色面

1、选中需要调整的面。 2、点击菜单栏中的“网格显示”&#xff0c;再点击点击“反转(Reverse)”。 3、反转后&#xff0c;原本黑色的面将会变成正常的面&#xff0c;法线方向也会相应改变。 按住ctrlshift鼠标中键 拖动快捷图标至工具栏

NullPointerException 是什么, 如何修复?

下面是chatGPT 01的回复&#xff1a; **NullPointerException**&#xff08;空指针异常&#xff09;是在 Java 等编程语言中出现的运行时错误&#xff0c;当你尝试使用一个尚未初始化的对象引用&#xff08;即&#xff0c;指向 null&#xff09;时就会发生。这个异常表示你的程…

金融教育进乡村:红土散户联盟教你如何分辨好坏资产

2024年8月&#xff0c;【红土散户联盟】再度将关注的目光投向了农村地区&#xff0c;特别是那些经济不发达的地区。作为一个致力于为社会带来积极改变的组织&#xff0c;红土散户联盟再次举办了农村理财讲座&#xff0c;旨在帮助这些地区的居民提高他们的财务管理能力和投资意识…

OJ题-反转链表

给你一个单链表的头节点&#xff0c;请反转链表&#xff0c;并返回新的链表 eg&#xff1a; 1,2,3,4,5--->5,4,3,2,1 //反转链表 struct ListNode* reverseList(struct ListNode* head) {//定义三个变量struct ListNode* n1, * n2, * n3;n1 NULL;n2 head;n3 head->n…

图解Self-Attention和代码实现,大语言模型基础思维导图

文章目录 1 Self-Attention的概念注意优缺点 2 Self-Attention的原理Q,K,V, and Self-Attention计算公式代码实现 Self-Attention的计算细节输入是如何Embedding的&#xff1f;Word EmbeddingsSentence EmbeddingsPre-trained Embeddings SelfAttention是如何计算的计算图 4 Se…