基于EasyExcel和线程池解决
- 导出excel的任务用线程池异步去执行,先给前端返回导出开始,文件生成后会通知您下载链接
@RestController
@RequestMapping("/export")
public class DataExportController {
@Autowired
private ExcelExportService exportService;
@GetMapping("/data")
public ResponseEntity<String> exportData() {
List<DataModel> data = fetchData();
String fileUrl = exportService.exportDataAsync(data);
return ResponseEntity.ok("导出任务开始,文件生成后会通知您下载链接");
}
private List<DataModel> fetchData() {
// 获取需要导出的数据
// ...
}
}
- 线程池创建
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean(name = "exportExecutor")
public Executor exportExecutor() {
ThreadFactory namedThreadFactory = new ThreadFactory(new Runnable() {
@Override
public void run() {
System.out.println("Thread name: " + Thread.currentThread().getName());
}
}, "ExportExecutor-%d");
return new ThreadPoolExecutor(10, 20, 1L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), namedThreadFactory);
}
}
- 生成excel文件,上传到云存储,邮件通知用户
@Service
public class ExcelExportService {
@Async("exportExecutor")
public String exportDataAsync(List<DataModel> data) {
// 生成 Excel 文件并获取 InputStream
InputStream fileContent = generateExcelFile(data);
String fileName = "data\_" + System.currentTimeMillis() + ".xlsx";
// 上传到 OSS
String fileUrl = ossService.uploadFile(fileName, fileContent);
// 发送邮件
emailService.sendEmail(data.getUserEmail(), "文件导出通知", "您的文件已导出,下载链接:" + fileUrl);
return fileUrl;
}
private InputStream generateExcelFile(List<DataModel> data) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
ExcelWriterBuilder writerBuilder = EasyExcel.write(outputStream, DataModel.class);
writerBuilder.sheet("Data");
} catch (Exception e) {
// 处理异常
}
return new ByteArrayInputStream(outputStream.toByteArray());
}
// DataModel 类定义
public static class DataModel {


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**