记录一个在公司开发excel导出功能的bug
问题描述:
使用poi创建工作簿,XSSFWorkBook workBook = new XSSFWorkBook(inputStream);
报错:
java.lang.NoSuchMethodError: 'byte[] org.apache.poi.util.IOUtils.toByteArray(java.io.InputStream, int, int)'
问题排查:
1、使用idea提供的 show diagram功能检查依赖;
2、ctrl + F 搜索 ooxml关键字,可以看到有两个;
3、一个 4.1.2,一个 5.2.2;
# 我这边已经改掉了,所以5.2.2看不到了
4、进入日志提到的at org.apache.poi.openxml4j.util.ZipArchiveFakeEntry.<init>(ZipArchiveFakeEntry.java:82)
ZipArchiveFakeEntry 82行中;
可以很明显地看到:
注意参数列表:(InputStream,int,int)
注意所在的包:poi-ooxml 5.2.2
!!!但是 ctrl + 鼠标左键 点击 IOUtils.toByteArray,可以看到:
注意参数列表(InputStream,long,int);第二个参数是long!!!
注意IOUtils所在的包:poi 4.1.2
得出结论:poi-ooxml5.2.2的ZipArchiveFakeEntry类调用到了poi4.1.2的IOUtils的方法;
解决办法:我用的是第二种
1、删除一个pio-ooxml5.2.2的引用;
2、添加一个poi 5.2.2的引用;
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
<scope>compile</scope>
</dependency>
总结:poi版本冲突的问题很多,我在网上没找到与我的问题一致的介绍,所以分享一下我的分析过程,希望对初学者有帮助,并且欢迎大神指点;