后台项目中,将数据导出成Excel的解决(从原本的POI升级成EasyExcel解决方案)

问题出现

项目中有一个功能是管理消费券的领取记录,原本的导出方案是使用的POI实现,但是如果数据量过大,POI会存在内存溢出和请求超时问题。比如我这里数据大约5万条,请求下载时会报504,为了解决大数据量导出Excel问题,我这里使用EasyExcel来解决。

解决步骤

1. 导入依赖

由于项目中已经引用了POI的依赖,而新的EasyExcel依赖里面是包含POI依赖的,所以会造成版本冲突,因此我们这里需要将EasyExcel的POI依赖排除掉

		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>easyexcel</artifactId>
			<version>2.1.1</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>
				<exclusion>
					<groupId>org.apache.poi</groupId>
					<artifactId>poi-ooxml-schemas</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

2. EasyExcel导出

首先设置下载信息

			// 设置下载信息
			response.setContentType("application/vnd.ms-excel");
			response.setCharacterEncoding("utf-8");
			String fileName = "cardRecord";
			response.setHeader("Content-Disposition", "attachment;filename="+ fileName +".xlsx");

再调用write方法导出

		try {
				EasyExcel.write(response.getOutputStream(), CardRecordExcel.class).sheet("cardRecord").doWrite(list);
			} catch (IOException e) {
				e.printStackTrace();
			}

最后!也是最关键的一步!由于我们使用axios的请求方式,只能接受json格式的返回数据,没办法接受二进制流,所以这里的返回数据是一堆乱码,并且是没办法在浏览器下载的,所以我们这里在前端需要将数据转换成Blob对象,然后再后续设置下载

			.then(function (res) {
                const link = document.createElement('a');
                const blob = new Blob([res], { type: 'application/vnd.ms-excel' });
                link.style.display = 'none';
                link.href = URL.createObjectURL(blob);
                link.setAttribute('download','cardRecord.xlsx');
                document.body.appendChild(link);
                link.click();
                document.body.removeChild(link);
			});

至此,搞定!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值