dromara / hutool

🍬A set of tools that keep Java sweet.
https://hutool.cn
Other
28.94k stars 7.48k forks source link

解析空白的xls 或者 xlsx 文件出现异常 #1552

Closed obiscr closed 3 years ago

obiscr commented 3 years ago

版本情况

JDK版本: oracke jdk-11.0.10 hutool版本: 5.6.4(最新版本依然有问题)

问题描述(包括截图)

新建一个空白的xls文件或者xlsx文件。然后构建成ExcelReader对象, 之后直接调用readAll方法(),即可复现。 点击查看错误截图

  1. 复现代码
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;

import java.util.Objects;

public class ExcelReaderTest {
    public static void main(String[] args) {
        String xls = Objects.requireNonNull(Thread.currentThread().getContextClassLoader().
                getResource("issue.xls")).getPath();
        String xlsx = Objects.requireNonNull(Thread.currentThread().getContextClassLoader().
                getResource("issue.xlsx")).getPath();

        ExcelReader readerXls = ExcelUtil.getReader(xls);
        readerXls.readAll();

        ExcelReader readerXlsx = ExcelUtil.getReader(xlsx);
        readerXlsx.readAll();
    }
}
  1. 堆栈信息

    Exception in thread "main" java.lang.IndexOutOfBoundsException: Header row index 0 is greater than last row index -1.
    at cn.hutool.poi.excel.reader.MapSheetReader.read(MapSheetReader.java:42)
    at cn.hutool.poi.excel.reader.MapSheetReader.read(MapSheetReader.java:18)
    at cn.hutool.poi.excel.ExcelReader.read(ExcelReader.java:399)
    at cn.hutool.poi.excel.ExcelReader.read(ExcelReader.java:343)
    at cn.hutool.poi.excel.ExcelReader.readAll(ExcelReader.java:326)
    at ExcelReaderTest.main(ExcelReaderTest.java:18)
  2. 测试涉及到的文件(注意脱密) 新建空白的 xls 或者 xlsx 文件即可。

CherryRum commented 3 years ago

image **我的提示是对的,文件为空,还有** Objects.requireNonNull(Thread.currentThread().getContextClassLoader(). getResource("issue.xls")).getPath(); 这个是jdk7的吧,建议使用jdk8+

ExcelReader reader = ExcelUtil.getReader(ResourceUtil.getStream("aaa.xlsx")); 读取为流

obiscr commented 3 years ago

我的JDK用的是11,按照你给出的方法测试了,依然是同样的错误。 问题并不在文件的读取方式。

CherryRum commented 3 years ago

把您的文档传一下 我新建的 报错都是说的空白文件

obiscr commented 3 years ago

我把项目传到github: https://github.com/obiscr/common-test.git

obiscr commented 3 years ago

其实空白的或者非空白的文件我都有遇到这个问题,只是为了测试,我就新建了空白文件。 然后我之前用的是 5.3.7 的版本,后面升级到了最新版 5.6.4 依然存在此问题。同时 poi-ooxml 也升级到了最新版测试了一下,但是依旧如此。

CherryRum commented 3 years ago

我试了您的文档 的确显示报错,但是为啥您的文档大小这么大

CherryRum commented 3 years ago

issue.xlsx test.xlsx 您试下 我的test,不知道您用什么建立的文档,我使用Ms Office

空的报错很正常,但是添加就不会报错,而您提供的,貌似还是没读到数据

obiscr commented 3 years ago

我用的也是 MS Office 2019,然后您刚才发我的这两个文档,打开就没有问题。 这种情况,感觉跟Office的版本有关系。有的Office创建的文件,有问题。有的 没问题。

obiscr commented 3 years ago

根据我测试的结果,ExcelReader.readAll() 方法 打开空文档会有问题。 正常来说,空文档的话返回的数据结构式完整的,只是里面没有数值。 然而现在是解析的时候出了异常。

CherryRum commented 3 years ago

然后 我测试下 另存为您的文档 就没事了 所以就很奇怪 您的版本是kms激活的吗 还是秘钥

obiscr commented 3 years ago

密钥激活的

looly commented 3 years ago

某些空Excel的结束行是-1,导致的报错,我这里加个判断吧。

感谢issue。

5.6.5修复此问题。