easyexcel导出遇到的两个坑

本文详细阐述了在使用easyexcel进行大数据量导出时遇到的poi版本冲突问题,以及在SpringBoot项目中集成Zipkin进行链路跟踪时出现的IOException异常。通过调整依赖版本和排除特定组件,成功解决了这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题一:poi的jar版本过低问题

使用easyexcel大数据量导出时,需要依赖org.apache.poi的3.17版的jar包,而poi3.17与3.8/3.9版本之间方法变动比较大,会导致easyexcel不能正常使用。所以需要确保poi为3.17版本的

		<dependency>
			<groupId>com.xxx</groupId>
			<artifactId>xxx-framework</artifactId>
			<version>1.0.5</version>
			<exclusions>
		        <exclusion>
		            <groupId>javax.servlet</groupId>
		            <artifactId>servlet-api</artifactId>
		        </exclusion>
		        <exclusion>
		        	<groupId>org.apache.poi</groupId>
					<artifactId>poi</artifactId>
		        </exclusion>
		        <exclusion>
		        	<groupId>org.apache.poi</groupId>
					<artifactId>poi-ooxml</artifactId>
		        </exclusion>
    		</exclusions>
		</dependency>

排除掉3.9版本的poi之后正常:

问题二:导出结束后报:java.io.IOException: Stream closed

在使用springboot构建项目时,使用zipkin进行链路跟踪,springboot内部容器可能使用的是undertow,因此导致此错误。

将容器undertow排除:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
           <groupId>io.zipkin.java</groupId>
           <artifactId>zipkin-server</artifactId>
           <exclusions>
               <exclusion>
                   <groupId>org.springframework.boot</groupId>
                   <artifactId>spring-boot-starter-undertow</artifactId>
               </exclusion>                    
           </exclusions>
        </dependency> 

 

### 关于EasyExcel导出时出现空指针异常 (NullPointerException) 的解决方案 在Linux环境下使用EasyExcel进行数据导出操作时,可能会遇到`NullPointerException`问题。以下是针对该问题的具体分析与解决方法: #### 1. 开启内存处理模式 当大量数据需要通过EasyExcel进行写入时,默认情况下会采用磁盘缓存的方式以减少内存占用。然而,在某些场景下可能仍然会出现OutOfMemoryError或者空指针异常的情况。此时可以尝试开启内存处理模式来规避此类问题。 代码实现如下所示: ```java import com.alibaba.excel.EasyExcel; public class ExcelExportExample { public static void main(String[] args) { String fileName = "example.xlsx"; List<DemoData> data = getData(); // 获取要写入的数据列表 EasyExcel.write(fileName, DemoData.class) .inMemory(true) // 开启内存模式 .sheet("模板") .doWrite(data); } } ``` 需要注意的是,虽然开启了内存处理模式能够有效避免部分因资源不足引发的异常情况发生,但由于其完全依赖JVM堆空间存储临时对象,因此存在较高的风险导致程序崩溃或性能下降等问题[^1]。 #### 2. Linux服务器字体配置缺失引起的潜在原因 如果是在Linux环境中部署的应用遇到了上述提到的NPE,则还需要检查是否存在因为缺少必要的字体支持而间接造成此现象的可能性。具体表现为:当生成含有特殊字符(如中文)的工作表标题栏名称或者其他样式设置项时如果没有正确加载相应的字型文件就可能导致内部逻辑判断失误从而抛出未预期到的NullPointException。 可以通过安装dejavu系列开源免费字体包以及调整系统级别的fontconfig参数完成修复工作。执行命令如下: ```bash RUN yum install -y dejavu-sans-fonts fontconfig ``` 另外也可以手动指定路径给Spring Boot项目中的application.properties/yml加入下面这段配置让应用运行期间自动寻找合适的替代方案而不是直接报错退出。 ```properties easyexcel.font.default=DejaVu Sans ``` 以上两种方式均能一定程度上缓解由不同平台间差异所带来兼容性隐患引起的各种奇怪表现形式之一即所谓的“随机”发生的null pointer exception事件[^2]。 ### 总结 综上所述,对于EasyExcel导出过程中可能出现的`NullPointerException`问题,可以从以下几个方面入手排查并解决问题: - 启用内存模式以应对大数据量场景下的稳定性需求; - 针对特定操作系统环境补充完善基础支撑库比如这里讨论过的关于字体方面的准备措施; 希望这些信息对你有所帮助!
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值