超好用的Excel异步导出功能

2024-04-16 15:32

本文主要是介绍超好用的Excel异步导出功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前也做过关于Excel的导出案例,此次也是在其基础上进行改造升级:

https://www.bilibili.com/video/BV1kf4y1i761?p=5

但是之前的导出存在这么几个问题:

  • 如果是数据量很大容易导致页面卡死(我曾导出30w条数据,直接导致OOM)
  • 用户体验很糟糕,数据量一多就会等很久,而且用户没办法做别的事情。
  • 每次点击导出都需要走一遍完整的导出过程(这个其实还好)
  • 没办法对每次导出的数据进一个规整

今天使用异步导出来解决上述问题。


一、UML图

1-1、导出图

前台 Controller ServiceA ServiceB 点击导出 往数据库插入记录 插入一条下载记录 id name文件名 rows 下载行数 (null) takeUpTime 下载耗时 (null) downloadUrl 下载地址(null) 异步下载 (id、startTime) success 下载成功,稍等片刻去【下载中心】下载 根据需求去获取对应的数据 把数据生成一个文件保存起来 根据Id获取刚刚插入的记录 完善以下数据 rows 下载行数 takeUpTime 下载耗时 downloadUrl 下载地址(null) 前台 Controller ServiceA ServiceB

1-2、下载图

前台 Controller 获取下载列表 返回下载列表 downLoadUrl 返回文件流 前台 Controller

从上面的图中可以看出,整个下载是异步的,用户不需要在页面等待,每次导出我们都生成一个记录和一个文件,用户可以多次下载。


二、功能实现

2-1、记录实体

/*** Excel列表数据** @author 小道仙97* @date 2021/8/8*/
public class ExcelList {/*** id*/private String id;/*** 文件名*/private String name;/*** 下载行数*/private Integer rows;/*** 下载耗时*/private Long takeUpTime;/*** 下载地址*/private String downloadUrl;
}

2-2、Controller

import javax.servlet.http.HttpServletResponse;
import java.util.*;/*** Excel导出** @author 小道仙97* @date 2021-08-08*/
@RestController
public class ExportExcelController {@Autowiredprivate ExportExcel exportExcel;// 模仿下载列表public static List<ExcelList> list = new ArrayList<>(10);/*** Excel 导出* @throws Exception*/@GetMapping("/excel/export")public void export() {Long startTime = System.currentTimeMillis();String name = "Excel异步导出测试" + UUID.randomUUID().toString() + ".xlsx";String id = UUID.randomUUID().toString();ExcelList excelList = new ExcelList();excelList.setId(id);excelList.setName(name);list.add(excelList);// 异步导出exportExcel.asyncExportExcel(id,name,startTime);}/*** 获取导出列表 - 模拟*/@GetMapping("/excel/list")public List<ExcelList> list() {return list;}/*** 文件下载*/@GetMapping("/excel/downLoad")public void downLoad(HttpServletResponse response,@RequestParam  String url) {FileUtils.download(url, response);}
}

2-3、异步下载实现

ExportExcel

注:使用异步注解@Async 需要先在启动类上开启 @EnableAsync

import org.springframework.scheduling.annotation.Async;public interface ExportExcel {/*** 异步导出* @param id 唯一记录Id* @param name 文件名称* @param startTime 下载开始时间*/@Asyncvoid asyncExportExcel(String id,String name,Long startTime);
}

TestExportExcelImpl

@Service
public class TestExportExcelImpl implements ExportExcel {@Overridepublic void asyncExportExcel(String id,String name,Long startTime) {// 模拟查询数据过程String[] header = new String[]{"姓名","年纪"};String[] keys = new String[]{"name","age"};List<Map<String, Object>> content = new ArrayList<>();Map<String, Object> map1 = new HashMap<>();map1.put("name","小道仙");map1.put("age","23");content.add(map1);Map<String, Object> map2 = new HashMap<>();map2.put("name","小道仙97");map2.put("age","97");content.add(map2);try {// 获取Excel导出文件流ByteArrayOutputStream os = new ByteArrayOutputStream();ExcelUtils.exportExcel(header,keys,content,"first",os);byte[] content1 = os.toByteArray();InputStream inputStream = new ByteArrayInputStream(content1);// 上传文件 返回下载地址String url = FileUtils.uploadInputStream(inputStream, name);/*** 找到当前数据并封装结果集** 其实这里很简单并无这么复杂,实际情况我们只需要一个 update 语句就可以搞定*/for (ExcelList item : ExportExcelController.list) {if (item.getId().equals(id)) {item.setRows(content.size());item.setDownloadUrl(url);item.setTakeUpTime(System.currentTimeMillis() - startTime);break;}}}catch (Exception e){e.printStackTrace();}}
}

三、演示

下面的演示的前提都是在启动了项目的基础上

3-1、导出

因为没有做任何的返回值,所以是空返回,这里也可以自定义任何提示返回。

http://127.0.0.1:8888/excel/export


3-2、下载列表

http://127.0.0.1:8888/excel/list

返回结果如下:

[{"id": "d3cb3551-cb33-445e-8e60-9534197f6647","name": "Excel异步导出测试80d50264-3930-4667-8bc5-2d4a1cfe0d9d.xlsx","rows": 2,"takeUpTime": 5,"downloadUrl": "2021/8/8/Excel异步导出测试80d50264-3930-4667-8bc5-2d4a1cfe0d9d.xlsx"}
]

3-3、下载

http://127.0.0.1:8888/excel/downLoad?url=2021/8/8/Excel异步导出测试80d50264-3930-4667-8bc5-2d4a1cfe0d9d.xlsx



视频看讲解地址:https://www.bilibili.com/video/BV1kf4y1i761

关注微信公众号回复:xdxFrameSimple 获取源码。

在这里插入图片描述

这篇关于超好用的Excel异步导出功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/909180

相关文章

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置