当前位置: 首页 > article >正文

Java使用EasyExcel实现异步导出

以下是使用 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 导出的数据模型:

@Data
public class ExportData {
    @ExcelProperty("ID")
    private String id;

    @ExcelProperty("名称")
    private String name;

    @ExcelProperty("时间")
    private String time;
}

3. 异步导出服务

实现异步导出逻辑:

@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. 控制器

提供导出接口:

@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 注解:

@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

@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 对你有帮助!如果有其他问题,欢迎随时提问。 😊


http://www.kler.cn/a/562188.html

相关文章:

  • html - 手工添加上次阅读的位置, 方便下次阅读
  • 大语言模型安全测试:WDTA 标准下的全面解读与实践展望
  • 深入理解Redis:数据类型、事务机制及其应用场景
  • 前端项目配置 Nginx 全攻略
  • redis和mysqle辨析
  • 大语言模型的不足与研究热点
  • 2.部署kafka:9092
  • DeepSeek为云厂商带来新机遇,东吴证券看好AI带动百度智能云增长
  • 异常——及处理方式
  • 取消票证会把指定的票证从数据库中删除,同时也会把票证和航班 等相关表中的关联关系一起删除。但在删除之前,它会先检查当前用户是否拥有这张票
  • 【vLLM】【基准测试】:vLLM部署大模型的基准测试
  • RTSP协议
  • Starlink卫星动力学系统仿真建模第十讲-基于SMC和四元数的卫星姿态控制示例及Python实现
  • Cesium@1.126.0,创建3D瓦片,修改样式
  • 「软件设计模式」责任链模式(Chain of Responsibility)
  • 【Python爬虫(48)】分布式爬虫:解锁多领域数据宝藏的密码
  • Apache SeaTunnel 构建实时数据同步管道(最新版)
  • 【每日前端面试题-01】
  • SurfaceFlinger代码笔记
  • C#初级教程(5)——解锁 C# 变量的更多奥秘:从基础到进阶的深度指南