Java读取损坏的xls表格

embedded/2024/9/23 18:49:50/

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 documentat 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)

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

java">该函数是一个构造函数,用于初始化一个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 documentat 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)

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

java">该函数的作用是将输入流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. 代码

java">   /*** 修复思想  使用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.ppmy.cn/embedded/112823.html

相关文章

运维工程师面试整理-操作系统

在运维工程师的面试中,操作系统相关的知识通常是重中之重,尤其是Linux/Unix系统。以下是针对操作系统部分的一些详细内容,帮助你更好地准备面试。 1. Linux/Unix 基础 ● 常用命令 ○ 文件和目录管理:ls, cd, cp, mv, rm, mkdir, rmdir, find, grep, awk, sed

收购芯片设计公司Annapurna Labs后

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

2024/9/16 pytorch

一、pytorch两大法宝元素 假设有一个名为pytorch的包 dir()&#xff1a;用于打开包&#xff0c;看里面的内容 help():用于查看具体的内容的用处 二、python文件&#xff0c;python控制台和jupyter的使用对比 三、pytorch读取数据 pytorch读取数据主要涉及到两个类&#xff1…

面试题总结(三) -- 内存管理篇

面试题总结(三) – 内存管理篇 文章目录 面试题总结(三) -- 内存管理篇<1> C 中堆内存和栈内存的区别是什么&#xff1f;<2> 如何在 C 中手动管理内存&#xff08;new/delete 操作符&#xff09;&#xff1f;<3> C 中内存泄漏的原因和避免方法<4> 谈谈…

【Python 数据分析学习】Matplotlib 的基础和应用

题目 1 Matplotlib 主要特性2 Matplotlib 基础知识2.1 导入模块2.2 图形构成2.2.1 图形&#xff08;Figure&#xff09;2.2.2 轴 &#xff08;Axes&#xff09;2.2.3 轴线&#xff08;axis&#xff09; 2.5 中文设置2.5.1 借助rcParams修改字体实现设置2.5.2 增加一个fontprope…

JSON 数据的命令行工具jq

jq 是一个用于处理 JSON 数据的命令行工具。它允许你对 JSON 数据进行过滤、转换、查询等操作&#xff0c;通常用于从 JSON 输出中提取特定信息。这个工具非常适合处理命令行中的 JSON 数据。 安装 jq 在 Linux: 可以通过包管理器安装&#xff0c;比如&#xff1a;sudo apt-g…

asp.net core调用wps实现word转pdf的方法

1&#xff0c;首先安装wps&#xff0c;从官网下载安装包 2&#xff0c;创建.net core控制项目 添加com引用&#xff0c;搜索wps 准备一个word文档&#xff0c;名字叫001.docx&#xff0c;随便编写一些文字内容 3&#xff0c;word转pdf 编写代码 namespace WPSStu01 {inter…

谈谈OpenResty 简介及其容器化实践

引言 OpenResty 是一个基于 Nginx 与 Lua 的高性能 web 平台&#xff0c;它扩展了 Nginx 的功能&#xff0c;使之能够处理更加复杂的业务逻辑。通过集成 Lua 脚本&#xff0c;OpenResty 可以实现高效的请求处理、缓存、负载均衡等功能。本文将介绍 OpenResty 的基本概念、如何…