org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: *.xlsx

问题现象

在工作过程中需要从excel中读取数据,在读取文件时发生以下错误:
错误提示
这个是个很常见的poi问题,正因如此,所以让我在错误的方向走了很久。接下来叙述我的问题解决过程

解决过程

  • 第一步 度
    网上的解决在以下几种:
    a.POI 读取Excel03和07的兼容性问题
    在代码中已经对03和07进行了判断,进行断点调试之后发现判断逻辑也无误。因此这不是错误理由。下图为相关代码。
    文件读取代码

    添加链接描述Java 解析excel2003和2007区别和兼容性问题(POI操作)

    b.文件损坏
    使用office程序尝试打开文件,文件并没有什么异常。

    c.poi版本过低
    使用目前poi(3.6)打开其他.xlsx并无问题

  • 第二步 试
    poi读取除了使用OPCPackage将文档转为xml对象,还可以直接使用XSSFWorkbook读取文件进行遍历。因此使用以下代码在此尝试读取,读取成功 。文件读取代码2
    然而此时我一脸懵,对比代码似乎毫无可比性。仔细查看错误,问题发生在zipPackage类,断点跟进源码之后错误发生在将File对象封装成ZipFile对象时,提示错误如下图,脑子突然想到了什么。
    错误提示
    我将文件名拷贝出来之后,放到了UE里,查看其对应的ASCII码,发现原文件明中的空格是源码3F,在UE中显示也变成了?。于是我将文件名调整,之后文件读取正常了。
    UE

    秒懂POI解析excel,SAXParser解析大xlsx

    超简单读取Excel使用Apache POI java api

总结

  • 由于poi在封装Zipfile时没有将明确的异常抛出,导致我一开始完全偏离了方向(一开始就应该注意到文件名不寻常的喂,一开始就打断点啊喂)。
    在这里插入图片描述
    在这里插入图片描述

  • 空格在不同的编码进行转化的时候,由于无法正确的识别因此变成半角问号“?”(ASCII码0x3F)
    空格变成?

  • 使用Workbook workbook = WorkbookFactory.create(new File(filename));可以自动匹配xls和xlsx也可以在Excel读取中减少内存的浪费

当遇到`org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: *.xlsx`错误,这通常表示Apache POI在试图打开一个Excel (.xlsx)文件时遇到了问题。具体到`InvalidOperationExceptio...NoClassDefFoundError: org/apache/xmlbeans/XmlException`,可能是缺少XMLBeans库导致的。 解决这个问题的方法通常是确认已正确添加Apache POI和相关的依赖,特别是针对Open XML的支持(如xmlbeans)。如果缺失,可能需要通过Maven或Gradle添加依赖: **Maven**: ```xml <dependency> <groupId>org.apache.xmlbeans</groupId> <artifactId>xmlbeans</artifactId> <version>3.0.2</version> <!-- 或者最新的版本 --> </dependency> ``` **Gradle**: ```groovy implementation 'org.apache.xmlbeans:xmlbeans:3.0.2' // 使用最新版本 ``` 对于`Could not open the specified zip entry source stream`错误,可能是由于文件路径中的特殊字符(如空格)导致的。你已经注意到文件名中的空格被转换成了问号(?),这是ASCII编码问题。正确的做法是: 1. **修复文件名中的特殊字符**:确保文件名只包含有效的ASCII字符,避免使用空格或其他非标准字符,尤其是在路径或URL中。 2. **使用正确的编码读取文件**:如果你知道文件实际使用的编码(如UTF-8),可以尝试指定正确的编码来读取文件,比如使用Java的`java.nio.file.Files.readAllBytes(Paths.get(fileName), StandardCharsets.UTF_8)`。 如果上述建议无法解决问题,你可以尝试在读取文件之前先验证文件是否存在以及权限是否允许访问。另外,确保你的应用程序有足够的权限去读取指定的文件。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值