以下是使用 EasyExcel 工具类实现异步导出功能的 Demo,包括用户发起导出请求后,系统先返回响应,后台读取数据并上传至 COS,最后通知用户下载的完整流程。
实现步骤
-
用户发起导出请求
- 前端调用导出接口,后端立即返回响应,表示导出任务已开始。
-
后台异步处理
- 使用线程池异步执行数据读取、Excel 生成及上传至 COS 的操作。
-
上传至 COS
- 使用腾讯云 COS SDK 将生成的 Excel 文件上传至 COS。
-
通知用户下载
- 上传完成后,通过消息通知(如邮件、站内信)告知用户下载链接。
代码实现
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 {
@Autowired
private COSClient cosClient;
@Async
public 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. 上传至 COS
String 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 {
@Autowired
private 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;
@Bean
public COSClient cosClient() {
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
ClientConfig clientConfig = new ClientConfig(new Region(region));
return new COSClient(cred, clientConfig);
}
}
测试流程
- 启动 Spring Boot 应用。
- 调用导出接口:
POST /export/start
。 - 查看控制台日志,获取下载链接。
- 下载生成的 Excel 文件。
总结
通过以上代码,实现了以下功能:
- 用户发起导出请求后,系统立即返回响应。
- 后台异步读取数据并生成 Excel 文件。
- 将 Excel 文件上传至腾讯云 COS。
- 通知用户下载链接。
希望这个 Demo 对你有帮助!如果有其他问题,欢迎随时提问。 😊