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读取中减少内存的浪费

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值