Java使用EasyExcel实现异步导出

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


实现步骤

  1. 用户发起导出请求

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

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

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

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

代码实现

1. 依赖引入

pom.xml 中添加以下依赖:

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 信息:

properties 复制代码
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);
    }
}

测试流程

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

总结

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

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

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

相关推荐
摇滚侠10 小时前
Spring Boot3零基础教程,生命周期监听,自定义监听器,笔记59
java·开发语言·spring boot·笔记
凯子坚持 c10 小时前
Llama-2-7b在昇腾NPU上的六大核心场景性能基准报告
java·开发语言·llama
ai安歌10 小时前
【Rust编程:从新手到大师】Rust概述
开发语言·后端·rust
百锦再10 小时前
国产数据库替代MongoDB的技术实践:金仓数据库赋能浙江省人民医院信息化建设新展望
java·开发语言·数据库·mongodb·架构·eclipse·maven
武子康10 小时前
Java-160 MongoDB副本集部署实战 单机三实例/多机同法 10 分钟起集群 + 选举/读写/回滚全流程
java·数据库·sql·mongodb·性能优化·系统架构·nosql
风霜不见闲沉月10 小时前
rust更新后编译的exe文件执行报错
开发语言·后端·rust
luckyPian10 小时前
ES6+新特性:ES7(二)
开发语言·javascript·ecmascript
稚辉君.MCA_P8_Java10 小时前
Bash 括号:()、{}、[]、$()、$(() )、${}、[[]] 到底有什么区别?
开发语言·jvm·后端·容器·bash
Code-X010 小时前
Bash 与 Source:命令执行的核心差异解析
开发语言·bash·1024程序员节
sinat_2869451910 小时前
Java事故排查
java·开发语言