超好用的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数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient