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

相关推荐
格林威1 小时前
Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机”
开发语言·c++·人工智能·数码相机·计算机视觉
小林学习编程1 小时前
SpringBoot校园失物招领信息平台
java·spring boot·后端
撸码到无法自拔1 小时前
docker常见命令
java·spring cloud·docker·容器·eureka
橙子199110161 小时前
在 Kotlin 中什么是委托属性,简要说说其使用场景和原理
android·开发语言·kotlin
androidwork1 小时前
Kotlin Android LeakCanary内存泄漏检测实战
android·开发语言·kotlin
heart000_11 小时前
IDEA 插件推荐:提升编程效率
java·ide·intellij-idea
学地理的小胖砸2 小时前
【Python 基础语法】
开发语言·python
ŧ榕树先生2 小时前
查看jdk是否安装并且配置成功?(Android studio安装前的准备)
java·jdk
未来的JAVA高级开发工程师2 小时前
适配器模式
java
LUCIAZZZ2 小时前
JVM之内存管理(一)
java·jvm·spring·操作系统·springboot