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

ops/2025/1/24 10:43: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/ops/152717.html

相关文章

58.界面参数传递给Command C#例子 WPF例子

界面参数的传递&#xff0c;界面参数是如何从前台传送到后台的。 param 参数是从界面传递到命令的。这个过程通常涉及以下几个步骤&#xff1a; 数据绑定&#xff1a;界面元素&#xff08;如按钮&#xff09;的 Command 属性绑定到视图模型中的 RelayCommand 实例。同时&#x…

问题修复记录:Linux docker 部署 dify,无法调用宿主机本地服务

使用docker compose启动Dify后,在其中配置本地xinfrence中的模型,报错: get xinference model extra parameter failed, url: http://127.0.0.1:9997/v1/models/bge-m3, error: HTTPConnectionPool(host=‘127.0.0.1’, port=9997): Max retries exceeded with url: /v1/mo…

jeecg后端登录接口

jeecg后端登录接口 /sys/loginLoginController.java

八股学习 微服务篇

微服务篇 常见面试内容Spring Cloud 常见组件注册中心Ribbon负载均衡策略服务雪崩 常见面试内容 Spring Cloud 常见组件 Spring Cloud有5个常见组件&#xff1a; Eureka/Nacos:注册中心&#xff1b;Ribbon:负载均衡&#xff1b;Feign:远程调用&#xff1b;Hystrix/Sentinel:服…

Flutter 改完安卓 applicationId 后App 闪退问题。

一、问题 当我们项目创建完&#xff0c;想 build.gradle 改 applicationId 的时候&#xff0c;再次执行的时候可能会出现 app 闪退问题&#xff0c; 控制台不显示任何错误提示 也不出现 Exit 停止运行的情况。&#xff08;像下方这样&#xff0c; 而 app 只是在模拟器中一闪而…

kettle与Springboot的集成方法,完整支持大数据组件

目录 概要整体架构流程技术名词解释技术细节小结 概要 在现代数据处理和ETL&#xff08;提取、转换、加载&#xff09;流程中&#xff0c;Kettle&#xff08;Pentaho Data Integration, PDI&#xff09;作为一种强大的开源ETL工具&#xff0c;被广泛应用于各种数据处理场景。…

MyBatis-Plus之常用注解

一、TableName 经过一系列的测试&#xff0c;在使用MyBatis-Plus实现基本的CRUD时&#xff0c;我们并没有指定要操作的表&#xff0c;只是在 Mapper接口继承BaseMapper时&#xff0c;设置了泛型User&#xff0c;而操作的表为user表 由此得出结论&#xff0c; MyBatis-Plus在确…

【设计模式-行为型】状态模式

一、什么是状态模式 什么是状态模式呢&#xff0c;这里我举一个例子来说明&#xff0c;在自动挡汽车中&#xff0c;挡位的切换是根据驾驶条件&#xff08;如车速、油门踏板位置、刹车状态等&#xff09;自动完成的。这种自动切换挡位的过程可以很好地用状态模式来描述。状态模式…