基于java线程池和EasyExcel实现异步导出

news/2025/1/24 14:02:27/

javaEasyExcel_0">基于java线程池和EasyExcel实现异步导出

1.controller层

java">@GetMapping("export")
public void exportExcel(HttpServletResponse response) throws IOException, InterruptedException {exportService.exportExcel(response);
}

2. service

java">    public void exportExcel(HttpServletResponse response) throws IOException, InterruptedException {//设置响应头setExportHeader(response);//查询总数Long count = salariesMapper.selectCount(null);//每页查询条数Long pageSize = 40000L;//计算总页数Long pageCount = count % pageSize == 0 ? count / pageSize : count / pageSize + 1;int pages = pageCount.intValue();//创建线程池ExecutorService executorService = Executors.newFixedThreadPool(pages);CountDownLatch countDownLatch = new CountDownLatch(pages);//根据分页数,使用线程池异步查询数据并封装到Map中,key为页码,value为分页数据Map<Integer, Page<Salaries>> pageMap = new HashMap<>();for (int i = 0; i < pages; i++) {int finalI = i;executorService.submit(() -> {Page<Salaries> page = new Page<>();page.setCurrent(finalI + 1);page.setSize(pageSize);Page<Salaries> selectPage = salariesMapper.selectPage(page, null);pageMap.put(finalI, selectPage);//计数器减一countDownLatch.countDown();});}//阻塞,等待所有线程执行完(计数器减到0为止)countDownLatch.await();executorService.shutdown();try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), Salaries.class).build()) {for (Map.Entry<Integer, Page<Salaries>> entry : pageMap.entrySet()) {Integer num = entry.getKey();Page<Salaries> salariesPage = entry.getValue();WriteSheet writeSheet = EasyExcel.writerSheet(num, "模板" + num).build();excelWriter.write(salariesPage.getRecords(), writeSheet);}}// https://github.com/alibaba/easyexcel/issues/1040}

http://www.ppmy.cn/news/1565799.html

相关文章

android12源码中用第三方APK替换原生launcher

一、前言 如何用第三方的apk替换原生launcher呢&#xff1f;我是参考着这位大神的博客https://blog.csdn.net/hyu001/article/details/131044358做的&#xff0c;完美实现。 这边博客中又加入了我个人的一些改变&#xff0c;整理的。 二、步骤 1.在/packages/apps/MyApp文件…

【Hadoop面试题2025】

文章目录 简单题故障及相应的处理方法中等难度高难度小文件小文件的产生小文件问题的影响小文件治理方案推荐方案 冷文件冷文件的产生冷文件问题的影响冷文件治理方案推荐方案 简单题 一、基础概念类 什么是Hadoop&#xff1f; 答案&#xff1a;Hadoop是一个开源的分布式计算框…

Spark SQL中的from_json函数详解

Spark SQL中的from_json函数详解 在Spark SQL中&#xff0c;from_json是一个用于解析JSON数据的函数&#xff0c;主要用于将JSON格式的字符串解析为结构化的数据&#xff08;即StructType或其他Spark SQL数据类型&#xff09;。这个函数在处理半结构化数据&#xff08;如JSON日…

SentencePiece和 WordPiece tokenization 的含义和区别

SentencePiece和 WordPiece tokenization 的含义和区别 SentencePiece 和 WordPiece 都是常用的分词(tokenization)技术,主要用于自然语言处理(NLP)中的文本预处理,尤其是在处理大规模文本数据时。它们都基于子词(subword)单元,能够将未登录词(out-of-vocabulary, O…

亿坊软件前端命名规范

在前端开发中&#xff0c;文件命名的重要性不言而喻。由于历史原因和个人习惯&#xff0c;不同的开发者在命名DOM结构、图片和CSS文件时&#xff0c;可能会产生不一致的情况。这不仅会导致维护成本增加&#xff0c;还会降低团队协作效率。因此&#xff0c;制定一套统一的命名规…

HTML `<head>` 元素详解

在 HTML 文档中&#xff0c;<head> 元素是一个非常重要的部分&#xff0c;它包含了文档的元数据&#xff08;metadata&#xff09;和其他与文档相关的信息。虽然 <head> 中的内容不会直接显示在网页上&#xff0c;但它对网页的行为、样式和搜索引擎优化&#xff08…

Vue 拦截监听原理

Vue 渐进式JavaScript 框架 学习笔记 - Vue 拦截监听原理 目录 拦截监听原理 如何跟踪变化 拦截监听示例 观察者 注意:vue3的变化 总结 拦截监听原理 如何跟踪变化 当你把一个普通的Javascript 对象传入 Vue 实例作为data选项&#xff0c;Vue 将遍历此对象所有的proper…

互联网产品品牌形象构建与开源AI智能名片S2B2C商城小程序的应用研究

摘要&#xff1a;随着互联网技术的飞速发展&#xff0c;互联网产品之间的竞争愈发激烈。为了在市场中占据一席之地&#xff0c;企业不仅需要提供高质量的产品和服务&#xff0c;还需要构建一个鲜明、有个性或统一的品牌形象&#xff0c;以增强用户的认知度和忠诚度。然而&#…