当前位置:   article > 正文

easyexcel 3.9版本和poi3.17版本冲突解决办法_easyexcel版本

easyexcel版本

背景:

1、如果你使用了poi
2、如果你报错信息是NoSuchMethodErrorClassNotFoundException
3、以前没问题的功能现在复调突然有问题了?
如果上面的问题你都出现了,那差不多就是easyexcel 3.9版本和poi3.17版本冲突了,如下逐步解决!!

依赖冲突的原因总结一句话就是,依赖的版本和实际使用的版本不一致。

1、poi相关的几个依赖

开发maven项目时我们常常遇到excel等文件的上传下载,这时候避免不了使用poi相关的几个依赖

  <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>版本</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>版本</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>版本</version>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

注意:poi 、poi-ooxml 、 poi-ooxml-schemas这三个版本号要一致!!!(排查三个版本号)

2、定位依赖冲突

依赖冲突常见的表现NoSuchMethodErrorClassNotFoundException 等。

在出现报错信息之后,我们可以通过出错信息快速定位到有问题的jar包,如下一看猜测是poi相关的包有问题:
在这里插入图片描述

注意:【由于maven依赖的传递性,所以可能你原本好使的代码,不小心你或别人引入了一个新的看似无关的依赖,就可能把重复的依赖带进来】(排查最近新增加的依赖)

跟踪发现,我的项目里用的本部门公用的依赖,引用这里面的工具类ExcelExportUtil操作的excel(依赖传递过来,里面的POI jar包是3.9),当我引入新的依赖easyExcel时,原本的导出不可用了!因为easyExcel支持最低的POI版本是3.17,maven会自动使用最高级的版本,所以原本使用的工具类ExcelExportUtil找不到了,poi.jar包版本冲突导致的!
如下两个包冲突:

 <!-- 部门统一common包 -->
        <dependency>
            <groupId>com.test.b2c.base</groupId>
            <artifactId>test-b2c-base-common</artifactId>
            <version>${test-b2c-base-common}</version>
  </dependency>
  
   <!-- 新引入 -->
  <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.7</version>
  </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3、解决冲突

1)由于原本功能使用低版本jar的工具类ExcelExportUtil操作的相关代码已上线,
所以把低版本相关代码替换成easyexcel的方案pass掉,风险高,尽量少变动;
如果没上线,条件允许,建议改掉原来代码,统一升级为poi高版本;
eg:

  <dependency>
            <groupId>com.test.b2c.base</groupId>
            <artifactId>test-b2c-base-common</artifactId>
            <version>${test-b2c-base-common}</version>
 			<exclusions>
 			     <exclusion>
                    <artifactId>poi-ooxml</artifactId>
                    <groupId>org.apache.poi</groupId>
                </exclusion>
 				 <exclusion>
                    <artifactId>poi-ooxml-schemas</artifactId>
                    <groupId>org.apache.poi</groupId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi</artifactId>
                </exclusion>
            </exclusions>
  </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

2)都用传递进来的低版本的jar操作,避免使用新引入的easyexcel,那样最近写的相关代码都要整改掉,如果少可以,偏偏我时间很紧张,没时间整改,而且使用easyexcel更方便,可以保证大数据量导出不会OOM。

3)不想改旧的代码,又没时间调整新的,怎么办?只能做升级兼容处理了,两者并存!

第一步:去除低版本调用路径

首先我不用传递依赖过来的工具类了,直接找到该工具类源码,在我本项目中创建一模一样的类,然后把原来调用的地方包路径从依赖包改为本项目包路径:

原来的:com.test.b2c.base.common.util.excel.ExcelExportUtil;
新的:com.test.newproject.common.util.excel.ExcelExportUtil;
  • 1
  • 2

注意:转换过程中CellStyle.ALIGN_CENTER提示找不到,替换成HorizontalAlignment.CENTER;
cell.setCellType(XSSFCell.CELL_TYPE_STRING); 过期替换cell.setCellType(CellType.STRING);
由于版本差异问题,需转换。

第二步:排除低版本依赖

 <!-- 部门统一common包 -->
        <dependency>
            <groupId>com.test.b2c.base</groupId>
            <artifactId>test-b2c-base-common</artifactId>
            <version>${test-b2c-base-common}</version>
  </dependency>
 <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.7</version>
            <exclusions>
                <exclusion>
                    <artifactId>poi-ooxml-schemas</artifactId>
                    <groupId>com.test.b2c.base</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>poi-ooxml</artifactId>
                    <groupId>com.test.b2c.base</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>poi</artifactId>
                    <groupId>com.test.b2c.base</groupId>
                </exclusion>
            </exclusions>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

这样3.9版本的包和调用都不存在了

第三步:升级版本做兼容

在上一步骤的基础上增加内容:

<poi.version>4.1.2</poi.version>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>${poi.version}</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>${poi.version}</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml-schemas</artifactId>
   <version>${poi.version}</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

注:(4.0以上版本都可以),现在项目中就是4.0以上的高版本了。

4、总结

easyexcel 3.9版本和poi3.17版本冲突怎么办?

  • 排查poi几个依赖版本一致问题;
  • 排查最新添加的依赖;
  • 旧的代码全部更换为easyexcel(改吧);
  • 去掉easyexcel写的新代码全部改为旧的方式(重新开发吧);
  • 兼容两者,改动量较少(就是项目中出现两套,不是很规范,但是能临时解决问题);

根据自己项目情况选择处理

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/170207
推荐阅读
相关标签
  

闽ICP备14008679号