当前位置: 首页 > news >正文

EasyExcel 使用多线程按顺序导出数据

通过多线程读取数据,使用EasyExcel按顺序导出数据

导出时如果要保证顺序需要使用单线程,但是查询时可以用多线程,因为多线程查询后返回数据不是按照顺序排列的,所以我的思路是再循环时给每个线程打标识,通过标识来排序多线程返回的结果

创建一个Future对象,用于排序多线程查询结果

	static class Result {final Integer threadId;final List<UserInfo> data;Result(Integer threadId, List<UserInfo> data) {this.threadId = threadId;this.data = data;}}
	@PostMapping("export3")public void export3(HttpServletResponse response) throws IOException, InterruptedException, ExecutionException {// 查询总数Long dataCount = userInfoMapper.selectCount();// 每页条数Long searchCount = 100000L;// 获取页数并向上取整 5.2 -> 6int ceil = (int) Math.ceil((double) dataCount / searchCount);// 使用线程池ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());List<Future<Result>> futures = new ArrayList<>();Map<Integer, Result> resultsMap = new ConcurrentHashMap<>();// 通过多线程查询,并设置线程IDfor (int i = 1; i <= ceil; i++) {Integer pageNum = Math.toIntExact((i - 1) * searchCount);int finalI = i;futures.add(executorService.submit(() -> new Result(finalI, userInfoMapper.getList(pageNum, searchCount))));}// 收集所有线程的结果for (Future<Result> future : futures) {resultsMap.put(future.get().threadId, future.get());}// 通过线程ID排序List<Result> sortedResults = resultsMap.values().stream().sorted(Comparator.comparingInt(result -> result.threadId)).collect(Collectors.toList());// 构建表头WriteCellStyle headWriteCellStyle = new WriteCellStyle();headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);WriteCellStyle contentWriteCellStyle = new WriteCellStyle();contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);// 设置返回格式response.setHeader("Content-Disposition", "attachment; filename=test" + DateUtil.format(new Date(), "yyyyMMddHHmmss") + ".xlsx");response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("UTF-8");ExcelWriter excelWriter = EasyExcelFactory.write(response.getOutputStream(), UserInfo.class).registerWriteHandler(horizontalCellStyleStrategy).needHead(true).excelType(ExcelTypeEnum.XLSX).build();// 如果是单sheet,则放在循环外面,多sheet放在循环里面WriteSheet writeSheet = EasyExcelFactory.writerSheet("Sheet1").head(UserInfo.class).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).registerWriteHandler(horizontalCellStyleStrategy).build();try {// 使用单线程写入ExcelsortedResults.forEach(r -> excelWriter.write(r.data, writeSheet));} finally {executorService.shutdown();excelWriter.finish();}}

相关文章:

EasyExcel 使用多线程按顺序导出数据

通过多线程读取数据&#xff0c;使用EasyExcel按顺序导出数据 导出时如果要保证顺序需要使用单线程&#xff0c;但是查询时可以用多线程&#xff0c;因为多线程查询后返回数据不是按照顺序排列的&#xff0c;所以我的思路是再循环时给每个线程打标识&#xff0c;通过标识来排序…...

数据驱动的投资分析:民锋科技的量化模型探索

在全球金融市场中&#xff0c;数据驱动的投资分析正在变革传统投资方式。民锋科技通过精密的量化模型和智能算法&#xff0c;为投资者提供更加科学的市场预测和投资分析工具&#xff0c;以帮助他们更好地理解市场波动、优化投资组合&#xff0c;实现风险管理。 #### 一、数据驱…...

cesium 设置相机视角 flyTo 参数destination,orientation

效果 // 监听相机的改变 用来设置相机飞行到哪里window.viewer.camera.changed.addEventListener(function () {// 当相机改变时&#xff0c;获取相机的参数let camera window.viewer.camera;// 获取当前摄像机的位置&#xff08;经纬度&#xff09;let cameraPosition wind…...

vue+Leaflet.PM插件实现创建和编辑几何图形(点、线、面、圆等)

场景 VueLeaflet实现加载OSM显示地图&#xff1a;https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/122317394在上面加载显示OSM的基础上&#xff0c;使用Leaflet.pm插件实现在页面上绘制、编辑、剪切、移动几何元素。Leaflet.pm插件 用于创建和编辑几何图层的插件可…...

Rust语言在系统编程中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 引言 Rust 概述 定义与原理 发展历程 Ru…...

test 是 JavaScript 中正则表达式对象 (RegExp) 的一种方法,用于测试一个字符串是否匹配某个正则表达式

在你的代码中&#xff0c;test 方法用于验证扫描结果是否符合特定的格式要求。具体来说&#xff0c;/^[A-Za-z\d]{16}$/.test(res.result) 这一行代码用于检查扫描结果 res.result 是否是一个由16个字母或数字组成的字符串。 test 方法的作用 正则表达式匹配&#xff1a; ^ 表…...

大厂社招3年-力扣热点高频刷题记录(已更新100+道热点题)

前言&#xff1a; 最近从大厂出来看机会&#xff0c;大厂面试基本都考察算法&#xff0c;于是维护此文档&#xff0c;一是查缺补漏&#xff0c;确保整体热点算法题目的应知应会&#xff0c;与思路的灵活理解&#xff1b;二是分享出来给其他同学朋友做一个参考借鉴&#xff0c;共…...

6.2 对角化矩阵(2)

五、不能对角化的矩阵 假设 λ \lambda λ 是 A A A 的一个特征值&#xff0c;我们从两个方面发现这个事实&#xff1a; 特征向量&#xff08;几何的&#xff09;&#xff1a; A x λ x A\boldsymbol x\lambda\boldsymbol x Axλx 有非零解。特征值&#xff08;代数的&…...

ubuntu24.04播放语音视频

直接打开ubuntu自带的video播放.mp4文件&#xff0c;弹窗报错如下&#xff1a; 播放此影片需要插件 MPEG-4 AAC 编码器安装方式&#xff1a; sudo apt install gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly sudo apt install ffmpeg验证AA…...

GPT4的下一代Orion已经降速了?

嘿&#xff0c;大家好&#xff0c;我是小索奇&#xff01;说起AI&#xff0c;相信不少人都和我一样&#xff0c;总感觉这玩意儿发展得就像装了火箭&#xff0c;快得让人眼花缭乱。咱们从GPT-3到GPT-4&#xff0c;一路哇哦着过来&#xff0c;天天惊叹它越来越聪明&#xff0c;越…...

SpringCloud框架学习(第二部分:Consul、LoadBalancer和openFeign)

目录 六、Consul服务注册和发现 1.基本介绍 2.下载运行 3.服务注册与发现 &#xff08;1&#xff09;支付服务provider8001注册进consul &#xff08;2&#xff09;修改订单服务cloud-consumer-order80 4.CAP &#xff08;1&#xff09;CAP理论 &#xff08;2&#x…...

Linux 批量配置互信

批量配置SSH互信脚本 #!/bin/bash# 定义目标机器列表 machines( "192.168.122.87" "192.168.122.89" "192.168.122.90" ) set -o errexit # 设置默认的用户名和密码 default_username"root" default_password"111111"# 读取…...

设计定长的内存池

目录 定长内存池设计设计思路具体实现定长内存池初始化T*New()申请内存代码 void Delete(T* obj)回收内存代码 设计的总代码测试代码 Objectpool.h文件代码test.cpp文件代码拓展windows和Linux下如何直接向堆申请页为单位的大块内存&#xff1a; 感谢各位大佬对我的支持,如果我…...

【动手学电机驱动】 STM32-FOC(7)基于 MCSDK6.0 控制与调试速度环

STM32-FOC&#xff08;1&#xff09;STM32 电机控制的软件开发环境 STM32-FOC&#xff08;2&#xff09;STM32 导入和创建项目 STM32-FOC&#xff08;3&#xff09;STM32 三路互补 PWM 输出 STM32-FOC&#xff08;4&#xff09;IHM03 电机控制套件介绍 STM32-FOC&#xff08;5&…...

无人机飞手考证,地面站培训技术详解

无人机飞手考证及地面站培训技术涉及多个关键方面&#xff0c;以下是对这些方面的详细解析&#xff1a; 一、无人机飞手考证流程与要求 1. 证书类型 民用无人机驾驶员证书&#xff1a;这是国家民航局颁发的无人机操作人员资质证书&#xff0c;分为视距内驾驶员、超视距驾驶员…...

音视频入门基础:MPEG2-TS专题(3)——TS Header简介

注&#xff1a;本文有部分内容引用了维基百科&#xff1a;https://zh.wikipedia.org/wiki/MPEG2-TS 一、引言 本文对MPEG2-TS格式的TS Header进行简介。 进行简介之前&#xff0c;请各位先下载MPEG2-TS的官方文档。ITU-T和ISO/IEC都分别提供MPEG2-TS的官方文档。但是ITU提供的…...

Sam Altman:年底将有重磅更新,但不是GPT-5!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…...

基于物联网的智能超市快速结算系统

摘 要 当今社会的商品层出不穷&#xff0c;人们因为越来越多大型仓储超市的出现使得生活更加便利&#xff0c;但许多随之而来的新问题也给人们带来了许多的不便&#xff0c;例如商家一直被更换标签不及时、货物丢失、超市内物品更换处理不及时、超市内人流高峰期人流控制不得…...

241111.学习日志——[CSDIY] Cpp零基础速成 [00]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…...

湘潭大学软件工程算法设计与分析实验-模拟退火算法

文章目录 写在前面代码分析 写在前面 总共是要四份代码&#xff0c;好像都是实现背包问题&#xff0c;前面三个都比较简单直观&#xff0c;朋友上周在机房给我讲解了一下之后&#xff0c;我大概弄清楚了&#xff0c;这周好像是最后一次算法课了&#xff0c;所以明天我得把剩下…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

前端调试HTTP状态码

1xx&#xff08;信息类状态码&#xff09; 这类状态码表示临时响应&#xff0c;需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分&#xff0c;客户端应继续发送剩余部分。 2xx&#xff08;成功类状态码&#xff09; 表示请求已成功被服务器接收、理解并处…...

在Spring Boot中集成RabbitMQ的完整指南

前言 在现代微服务架构中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件&#xff0c;支持多种消息协议&#xff0c;具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...