Java使用EasyExcel实现异步导出

embedded/2025/2/27 1:06:16/

以下是使用 EasyExcel 工具类实现异步导出功能的 Demo,包括用户发起导出请求后,系统先返回响应,后台读取数据并上传至 COS,最后通知用户下载的完整流程。


实现步骤

  1. 用户发起导出请求

    • 前端调用导出接口,后端立即返回响应,表示导出任务已开始。
  2. 后台异步处理

    • 使用线程池异步执行数据读取、Excel 生成及上传至 COS 的操作。
  3. 上传至 COS

    • 使用腾讯云 COS SDK 将生成的 Excel 文件上传至 COS。
  4. 通知用户下载

    • 上传完成后,通过消息通知(如邮件、站内信)告知用户下载链接。

代码实现

1. 依赖引入

pom.xml 中添加以下依赖:

<!-- EasyExcel -->
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version>
</dependency><!-- 腾讯云 COS SDK -->
<dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId><version>5.6.54</version>
</dependency><!-- Spring Boot Web -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- Spring Boot Async -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-async</artifactId>
</dependency>

2. 实体类

定义 Excel 导出的数据模型:

java">@Data
public class ExportData {@ExcelProperty("ID")private String id;@ExcelProperty("名称")private String name;@ExcelProperty("时间")private String time;
}

3. 异步导出服务

实现异步导出逻辑:

java">@Service
public class ExportService {@Autowiredprivate COSClient cosClient;@Asyncpublic void exportDataAsync(String fileName, List<ExportData> dataList) {try {// 1. 生成 Excel 文件File file = new File(fileName);EasyExcel.write(file, ExportData.class).sheet("Sheet1").doWrite(dataList);// 2. 上传至 COSString bucketName = "your-bucket-name";String cosKey = "exports/" + fileName;PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, cosKey, file);cosClient.putObject(putObjectRequest);// 3. 通知用户下载String downloadUrl = "https://" + bucketName + ".cos.ap-guangzhou.myqcloud.com/" + cosKey;notifyUser(downloadUrl);// 4. 删除本地临时文件file.delete();} catch (Exception e) {e.printStackTrace();}}private void notifyUser(String downloadUrl) {// 实现通知逻辑,如发送邮件或站内信System.out.println("导出完成,下载链接:" + downloadUrl);}
}

4. 控制器

提供导出接口:

java">@RestController
@RequestMapping("/export")
public class ExportController {@Autowiredprivate ExportService exportService;@PostMapping("/start")public ResponseEntity<String> startExport() {// 模拟数据List<ExportData> dataList = new ArrayList<>();dataList.add(new ExportData("1", "测试1", "2023-10-01"));dataList.add(new ExportData("2", "测试2", "2023-10-02"));// 异步导出String fileName = "export_data_" + System.currentTimeMillis() + ".xlsx";exportService.exportDataAsync(fileName, dataList);// 立即返回响应return ResponseEntity.ok("导出任务已开始,请稍后查看下载链接。");}
}

5. 配置异步支持

在 Spring Boot 启动类上添加 @EnableAsync 注解:

java">@SpringBootApplication
@EnableAsync
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

6. 腾讯云 COS 配置

application.properties 中配置 COS 信息:

cos.secretId=your-secret-id
cos.secretKey=your-secret-key
cos.region=ap-guangzhou
cos.bucketName=your-bucket-name

初始化 COSClient

java">@Configuration
public class COSConfig {@Value("${cos.secretId}")private String secretId;@Value("${cos.secretKey}")private String secretKey;@Value("${cos.region}")private String region;@Beanpublic COSClient cosClient() {COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);ClientConfig clientConfig = new ClientConfig(new Region(region));return new COSClient(cred, clientConfig);}
}

测试流程

  1. 启动 Spring Boot 应用。
  2. 调用导出接口:POST /export/start
  3. 查看控制台日志,获取下载链接。
  4. 下载生成的 Excel 文件。

总结

通过以上代码,实现了以下功能:

  1. 用户发起导出请求后,系统立即返回响应。
  2. 后台异步读取数据并生成 Excel 文件。
  3. 将 Excel 文件上传至腾讯云 COS。
  4. 通知用户下载链接。

希望这个 Demo 对你有帮助!如果有其他问题,欢迎随时提问。 😊


http://www.ppmy.cn/embedded/167408.html

相关文章

机器学习数学基础:32.斯皮尔曼等级相关

斯皮尔曼等级相关教程 一、定义与原理 斯皮尔曼等级相关系数&#xff08;Spearman’s rank - correlation coefficient&#xff09;&#xff0c;常用 ρ \rho ρ表示&#xff0c;是一种非参数统计量&#xff0c;用于衡量两个变量的等级之间的关联程度。它基于变量的秩次&…

力扣-动态规划-63 不同路径Ⅱ

思路 dp数组定义&#xff1a;到下标为i&#xff0c; j 的地方共有dp[i][j]条路径递推公式&#xff1a;在当前节点不是障碍物时&#xff0c;dp[i][j] dp[i][j-1] dp[i-1][j]&#xff0c;否则就是为0dp数组初始化&#xff1a;dp[0][0]初始化也需要做判断遍历顺序&#xff1a;自…

python制图之小提琴图

提琴图&#xff08;Violin Plot&#xff09;是一种结合了箱线图&#xff08;Box Plot&#xff09;和核密度估计&#xff08;Kernel Density Estimation, KDE&#xff09;的可视化工具&#xff0c;用于展示数据的分布情况和概率密度。它在数据可视化中具有独特的作用.本节我们学…

网络安全服务实施流程管理 网络安全服务体系

一、安全服务 由系统提供的&#xff0c;并能确保系统或数据传输足够安全的服务 安全服务实现了安全策略&#xff0c;而安全机制实现了安全服务 &#xff08;1&#xff09;认证 确保通信实体就是它所声称的那个实体。认证服务与确保通信是密切相关的。 对等实体认证&#xf…

分布式之分布式锁

目录 分布式锁 分布式锁 分布式锁是一种用于在分布式系统中控制多个进程或线程对共享资源进行访问的机制,以下是对它的详细介绍: 作用:在分布式系统中,通常会有多个进程或线程可能同时访问共享资源,如数据库、文件系统等。分布式锁可以确保在同一时间只有一个进程或线程…

flowable-ui 的会签功能实现

场景&#xff1a;在进行智慧保时通开发时&#xff0c;有个协作合同入围功能&#xff0c;这个功能的流程图里有个评审小组&#xff0c;这个评审小组就需要进行会签操作&#xff0c;会签完成后&#xff0c;需要依据是否有不通过的情况选择下一步走的流程 思考步骤&#xff1a; 首…

pdf加自定义水印

获取图片水印 ApiOperation(value "获取图片水印")PostMapping("/postImageMark")ApiImplicitParams({ApiImplicitParam(paramType "header", dataType "string", name "Authorization", value "访问凭证",…

【架构】事件驱动架构(Event - Driven Architecture,EDA)

一、事件驱动架构理论基础 事件驱动架构(Event - Driven Architecture,EDA)是一种软件设计范式,事件驱动的体系结构由生成事件流、侦听这些事件的事件使用者以及将事件从生成者传输到使用者的事件通道组成。 在事件驱动架构中,系统的行为由事件触发。事件可几乎实时发送,…