问题现象
在工作过程中需要从excel中读取数据,在读取文件时发生以下错误:
这个是个很常见的poi问题,正因如此,所以让我在错误的方向走了很久。接下来叙述我的问题解决过程
解决过程
-
第一步 度
网上的解决在以下几种:
a.POI 读取Excel03和07的兼容性问题
在代码中已经对03和07进行了判断,进行断点调试之后发现判断逻辑也无误。因此这不是错误理由。下图为相关代码。
添加链接描述Java 解析excel2003和2007区别和兼容性问题(POI操作)
b.文件损坏
使用office程序尝试打开文件,文件并没有什么异常。c.poi版本过低
使用目前poi(3.6)打开其他.xlsx并无问题 -
第二步 试
poi读取除了使用OPCPackage将文档转为xml对象,还可以直接使用XSSFWorkbook读取文件进行遍历。因此使用以下代码在此尝试读取,读取成功 。
然而此时我一脸懵,对比代码似乎毫无可比性。仔细查看错误,问题发生在zipPackage类,断点跟进源码之后错误发生在将File对象封装成ZipFile对象时,提示错误如下图,脑子突然想到了什么。
我将文件名拷贝出来之后,放到了UE里,查看其对应的ASCII码,发现原文件明中的空格是源码3F,在UE中显示也变成了?。于是我将文件名调整,之后文件读取正常了。
总结
-
由于poi在封装Zipfile时没有将明确的异常抛出,导致我一开始完全偏离了方向(一开始就应该注意到文件名不寻常的喂,一开始就打断点啊喂)。
-
空格在不同的编码进行转化的时候,由于无法正确的识别因此变成半角问号“?”(ASCII码0x3F)
空格变成? -
使用Workbook workbook = WorkbookFactory.create(new File(filename));可以自动匹配xls和xlsx也可以在Excel读取中减少内存的浪费