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

embedded/2025/2/1 0:02:44/

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/embedded/158480.html

相关文章

机试题——最小矩阵宽度

题目描述 给定一个矩阵&#xff0c;包含 N * M 个整数&#xff0c;和一个包含 K 个整数的数组。 现在要求在这个矩阵中找一个宽度最小的子矩阵&#xff0c;要求子矩阵包含数组中所有的整数。 输入描述 第一行输入两个正整数 N&#xff0c;M&#xff0c;表示矩阵大小。 接下…

zookeeper-3.8.3-基于ACL的访问控制

ZooKeeper基于ACL的访问控制 ZooKeeper 用ACL控制对znode的访问&#xff0c;类似UNIX文件权限&#xff0c;但无znode所有者概念&#xff0c;ACL指定ID及对应权限&#xff0c;且仅作用于特定znode&#xff0c;不递归。 ZooKeeper支持可插拔认证方案&#xff0c;ID格式为scheme…

微信小程序获取位置服务

wx.getLocation({type: gcj02,success(res) {wx.log(定位成功);},fail(err) {wx.log(定位失败, err);wx.showModal({content: 请打开手机和小程序中的定位服务,success: (modRes) > {if (modRes.confirm) {wx.openSetting({success(setRes) {if (setRes.authSetting[scope.u…

CSS中的响应式布局初识

响应式布局是一种Web设计方法&#xff0c;使网站能够在各种设备&#xff08;如台式电脑、平板电脑、手机等&#xff09;上有良好的显示效果。响应式布局通常使用CSS媒体查询来调整页面布局以适应不同的屏幕尺寸和分辨率。下面我将通过一个简单的示例来讲解如何实现响应式布局。…

Fork/Join框架_任务分解与并行执行

1 概述 Fork/Join框架是Java 7引入的一个用于并行执行任务的框架。它特别适用于可以递归分解为多个子任务的工作,每个子任务可以独立执行,并且结果可以合并以获得最终结果。Fork/Join框架通过工作窃取(work-stealing)算法提高了多核处理器上的任务执行效率。 2 核心组件 …

学技术学英语:elasticsearch查询的两阶段queryingfetching

To understand Elasticsearch’s distributed search, let’s take a moment to understand how querying and fetching work. Unlike simple CRUD tasks, distributed search is like navigating through a maze of shards spread across the cluster. In Elasticsearch, CRU…

xss总结标签

前言&#xff1a; 在网上找标签费时间&#xff0c;而且有时候忘记怎么找了&#xff0c;所以现在写一篇 由以下大佬赞助发布 xss 常用标签及绕过姿势总结 - FreeBuf网络安全行业门户 内容&#xff1a; <a>标签 <a href"javascript:alert(1)">test&l…

小南每日 AI 资讯 | AI模型扩展的快速增长时代正在放缓 | 25/01/30

AI模型扩展的挑战&#xff1a;随着研究人员发现单纯通过增加规模和计算能力难以获得更大回报&#xff0c;AI模型扩展的快速增长时代正在放缓。 GPT-5开发延迟&#xff1a;OpenAI雄心勃勃的GPT-5项目&#xff08;代号&#xff1a;Orion&#xff09;面临着显著的障碍&#xff0c…