问题现象

在工作过程中需要从excel中读取数据,在读取文件时发生以下错误:
org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: *.xlsx
这个是个很常见的poi问题,正因如此,所以让我在错误的方向走了很久。接下来叙述我的问题解决过程

解决过程

  • 第一步 度
    网上的解决在以下几种:
    a.POI 读取Excel03和07的兼容性问题
    在代码中已经对03和07进行了判断,进行断点调试之后发现判断逻辑也无误。因此这不是错误理由。下图为相关代码。
    org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: *.xlsx

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

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

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

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

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

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

总结

  • 由于poi在封装Zipfile时没有将明确的异常抛出,导致我一开始完全偏离了方向(一开始就应该注意到文件名不寻常的喂,一开始就打断点啊喂)。
    org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: *.xlsx
    org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: *.xlsx

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

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

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-13
  • 2021-12-07
  • 2021-09-25
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-03-27
  • 2022-12-23
  • 2021-05-17
  • 2022-12-23
  • 2022-12-23
  • 2021-07-07
相关资源
相似解决方案