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

相关推荐
码上上班4 小时前
docker课程
java·docker·容器
腻害兔4 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:CRM 客户关系模块深度解析——从线索到回款,一套完整的 B2B 销售闭环是怎么搭的?
java·前端·javascript·vue.js·产品经理·ai编程
wdfk_prog4 小时前
嵌入式面试真题第 13 题:单硬件 Timer 下的高精度多路软件定时器架构设计
c语言·开发语言·面试·职场和发展·嵌入式
oort1234 小时前
吃上了自家的细糠,还挺丝滑,用起来手感还行,OortCloud发布新版AI编程平台,下载 OortCodex,Token多,免费薅
大数据·开发语言·人工智能·ai编程
达子6664 小时前
第9章_HarmonyOs图解 用Java开发UI
java·ui·harmonyos
slandarer4 小时前
MATLAB | 泰勒图绘制,支持各种角度范围
开发语言·数学建模·matlab·nature·顶刊·泰勒图
mct1235 小时前
c++ iconv 字符utf-8转换gb2312失败
开发语言·c++
龙虾PRO6 小时前
能源与股票量化核心差异,AI全链路落地实操手册
java·面试·职场和发展
Marst Code6 小时前
Python 3.9 已停止维护!从 3.9 到 3.14 全版本深度对比,生产环境该选哪个?
开发语言·python
llwszx6 小时前
【Java/Go后端手撸原生Agent(第九篇):Plan-and-Execute规划模式——从“走一步看一步“到“先谋后动“】
java·python·golang·agent开发·plan模式·规划执行模式