JAVA大量数据导出excel

背景:因项目需要导出3万+行,90列+的数据到excel,使用传统的apache poi 直接导出,导致504连接超时无法导出。然后改造方法,异步导出。

一、准备一个导出类,属性有id,outputstrream,finleName,err,exception

public class Export {private String id;private OutputStream outputStream;private String fileName;private boolean err;private Exception exception;}

二、后端controller准备两个方法

(1)pullInfoStream方法用来生成导出流,将workbook对象写入ByteArrayOutputStream中,放入全局map中。请求进来,每个用户生成一个uuid,开启一个线程去处理excel,同时返回uuid。处理完毕后将输出流放入到map中,key是uuid。

 private static final Map<String, Export> hashMap = new ConcurrentHashMap<>();
@PostMapping("/export/id")public String pullInfoStream(String[] fields, QueryExamineeParam queryExamineeParam, String currentFlag,HttpServletResponse response) {String id = UUID.randomUUID().toString();Runnable runnable = () -> {Export export = new Export();export.setId(id);SXSSFWorkbook workbook = null;try {//处理excelworkbook = examineeService.exportExamineeAll(fields, queryExamineeParam, currentFlag);//处理完毕if (workbook != null) {String fileName = java.net.URLEncoder.encode("考生信息详细表.xlsx", "UTF-8");ByteArrayOutputStream outputStream = new ByteArrayOutputStream();workbook.write(outputStream);export.setFileName(fileName);export.setOutputStream(outputStream);}else {export.setErr(true);export.setException(new RuntimeException("workbook is null"));return;}export.setErr(false);} catch (Exception e) {export.setErr(true);export.setException(e);e.printStackTrace();}hashMap.put(id, export);};runnable.run();return id;}

(2)down方法前端轮询调用,如果pullInfoStream方法将生成的输出流放到map中,说明可以下execl了。前端带上uuid就开始轮询调用这个方法,判断map中key是否包含uuid,如果包含说明,excel处理完毕可以下载。

@GetMapping("/export/excel")public void down(@RequestParam String id, HttpServletResponse response) throws Exception {//System.out.println(id);if (!hashMap.containsKey(id))return;Export export = hashMap.get(id);if (export.isErr()) {hashMap.remove(id);throw export.getException();}response.setContentType("APPLICATION/OCTET-STREAM"); // 设置文件类型为excelresponse.setHeader("Content-Disposition", "attachment; filename=\"" + export.getFileName()); // 设置下载文件的名称try (OutputStream out = response.getOutputStream();ByteArrayOutputStream byteArrayOutputStream = (ByteArrayOutputStream) export.getOutputStream()) {out.write(byteArrayOutputStream.toByteArray());out.flush();} finally {hashMap.remove(id);}}

三、前端调用导出方法pullInfoStream后在调用,down方法

down去轮询调用后端的down方法
function down(id) {console.log(id, "id")let runCount = 0;const intervalId = setInterval(function () {runCount++;console.log("调用次数:" + runCount);// 大于120秒还没下载下来放弃下载if (runCount >= 120) {clearInterval(intervalId); // 清除定时器console.log("超过120次调用,放弃下载");} else {exportExcel(id).then(function (successMessage) {console.log(successMessage); // 下载成功的消息eAlert("考生信息导出成功");if (successMessage) {clearInterval(intervalId);}}).catch(function (errorMessage) {console.error(errorMessage); // 下载失败的错误消息clearInterval(intervalId);error("导出失败");});}}, 1000); // 每秒执行一次}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/9721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[debian12] wps for linux打开PDF卡死

原因 wps使用wpspdf处理PDF文件&#xff0c;而wpspdf依赖于libtiff5.so.5。而系统更新后&#xff0c;linux发行版提供的是libtiff.so.6或更新版本&#xff0c;导致其无法正常工作。 解决方案 理论上&#xff0c;安装libtiff5即可&#xff1a; apt install libtiff5.so.5 但实…

VM虚假机联网(无代码,超简单)NAT模式

1、左边顶上编辑里面最下面找到虚拟网络编辑器2.启用管理员特权3.重新创建一个NAT模式的网络&#xff08;名称随便一个&#xff09; 4.打开这两个设置里面的东西进行拍照并记住IP区间和网关&#xff0c;等下要用&#xff1b; 5.打开虚拟机&#xff0c;右上角&#xff0c;下标点…

腾讯云服务器部署前后端服务

服务器&#xff1a;OpenCloudOS &#xff08;兼容centos8&#xff09; 后端&#xff1a;javaSpringboot 前端&#xff1a;Vue 下载jdk 1&#xff09;下载jdk11 wget https://download.java.net/openjdk/jdk11/ri/openjdk-1128_linux-x64_bin.tar.gz 2&#xff09;解压jdk …

论文研读 Disentangled Information Bottleneck

解耦信息瓶颈 摘要&#xff1a; 信息瓶颈方法是一种从源随机变量中提取与预测目标随机变量相关的信息的技术&#xff0c;通常通过优化平衡压缩和预测项的IB拉格朗日乘子f来实现&#xff0c;然而拉格朗日乘子很难优化&#xff0c;需要多次实验来调整拉格朗日乘子的值&#xff0c…

使用leafletjs实现地图洋流、风场气象6要素地图标注、等值面图

前期实现的功能由于数据失效无法显示效果&#xff0c;今天重新对接一个数据源进行展示&#xff0c;实现效果如下图&#xff1a; 访问地址&#xff1a;可视化三维 GIS 特效 - 沉浸式视觉体验呈现令人惊叹的三维 GIS 特效&#xff0c;提供沉浸式视觉体验。https://www.wheart.cn/…

QAnything 在mac M2 上纯python环境安装使用体验(避坑指南)

这是一篇mac m2本地纯python环境安装 qanything的文章。安装并不顺利&#xff0c;官方提供的模型无法在本地跑。 这篇文章记录了&#xff0c;使用xinference来部署本地模型&#xff0c;并利用openAi的通用接口的方式&#xff0c;可以正常使用。 记录了遇到的所有的问题&#xf…

*****水上飞机:继承,虚函数,虚继承

一题目 请设计以下航行器、飞机、船、水上飞机等 4 个类。 CRAFT 为航行器类&#xff0c;是公共基类&#xff0c;提供航行器的基本特性。包括&#xff1a; 一个保护数据成员&#xff1a;speed(速度)。 三个公有成员函数&#xff1a;构造函数(初始化速度)、析构函数和 Show 函数…

AOSP开发

Android 开发者 | Android Developers (google.cn) android开源代码&#xff1a; Android 开源项目 | Android Open Source Project (google.cn)

FreeRTOS任务调度器

目录 1、什么是任务调度器 2、FreeRTOS中的任务调度器 2.1 抢占式调度 2.2 时间片调度 2.3 协作式调度 3、任务调度案例分析 3.1 实验需求 3.2 CubeMX配置 3.3 代码实现 3.3.1 uart.c 重定向printf 3.3.2 打开freertos.c并添加代码 3.3.4 代码现象 1、什么是任务调度…

Spring:spring-boot-starter-parent与spring-boot-dependencies的区别

参考&#xff1a;spring-boot-starter-parent与spring-boot-dependencies的区别

[uniapp] 配置ts类型声明

我想引进图片,但是报错 声明一下就行 TypeScript 支持 | uni-app官网 创建tsconfig.json文件,复制官网的配置 然后在随便一个目录下写一个随便名字的.d.ts文件 例如这样 保存就行 因为ts是默认扫描全部的,所以要按照官网的写法 把不必要的排除掉就行,免得浪费性能

JS-导入导出

export和export default是ES6中导出模块中变量的语法 导入导出变量 //导出方法&#xff08;js文件中&#xff09; export const 变量名值//导入方法 对应导入的变量&#xff0c;一定要加花括号 import {变量名} from js文件路径 导入导出函数 //导出方法&#xff08;js文件中…

RST文档技巧汇总

RST文件技巧汇总 前言转换工具简洁语法注释空行标题与章节样式链接图片列表表格代码块文档内引用引用rst 前言 RST全称ReStructuredText&#xff0c;是一种使用简单标记语法编写文档的文本文件格式。RST文档是轻量级标记语言的一种&#xff0c;被设计为容易阅读和编写的纯文本…

TikTok自动评论、回复的脚本怎么制作?

在当今数字化的时代&#xff0c;社交媒体平台如TikTok已经成为人们日常生活的一部分&#xff0c;为了更有效地在TikTok上进行营销或互动&#xff0c;许多用户和企业开始寻找自动化工具&#xff0c;如自动评论和回复的脚本&#xff0c;以节省时间并提高效率。 本文将科普如何制…

[数据结构]——非递归排序总结——笔试爱考

具体代码实现在gitee&#xff1a;登录 - Gitee.com 目录 具体代码实现在gitee&#xff1a;登录 - Gitee.com 1.非递归实现的快速排序算法。 第一步 首先要创建一个栈 第二步紧接着进行入栈&#xff0c;出栈&#xff0c;弹出栈顶元素&#xff0c;获取栈顶元素&#xff0c;判…

Windows下安装Node.js、npm和electronic,并运行一个Hello, World!脚本程序

20240510 By wdhuag 目录 简介&#xff1a; 参考&#xff1a; 安装Node.js 安装npm 配置npm&#xff1a; 修改包存放目录和缓存目录 切换镜像源 使用 nrm 切换镜像源 安装Electron 运行一个Hello, World!脚本程序 安装Yarn JavaScript 指南 简介&#xff1a; Nod…

英文论文审稿

英文论文审稿1 英文论文审稿4英文论文审稿5审稿意见: Identification and early warning method of key disaster-causing factors of AE signals for rockburst based on principal component analysis method 作者从城市地质环境的量化评价出发,创造性地提出城市地质环境健…

MT8370_联发科MTK8370(Genio 510)芯片性能规格参数

MT8370芯片是一款利用超高效的6nm制程工艺打造的边缘AI平台&#xff0c;具有强大的性能和功能。这款芯片集成了六核CPU(2x2.2 GHz Arm Cortex-A78 & 4x2.0 GHz Arm Cortex-A55)、Arm Mali-G57 MC2 GPU、集成的APU(AI处理器)和DSP&#xff0c;以及一个HEVC编码加速引擎&…

数据库查询--条件查询

目录 1.关系运算条件的查询 2.逻辑运算符条件的查询 3.带关键字IN的查询 4.带BETWEEN AND关键字的查询 5.空值查询 6.带LIKE关键字的模糊查询 1.关系运算条件的查询 在SELECT语句中&#xff0c;最常见的是使用WHERE字句指定关系运算条件对数据进行过滤。 语法格式&#x…

【二叉树算法题记录】二叉树的所有路径,路径总和——回溯

目录 257. 二叉树的所有路径题目描述题目分析cpp代码 112. 路径总和题目描述题目分析cpp代码 257. 二叉树的所有路径 题目描述 给你一个二叉树的根节点root &#xff0c;按任意顺序&#xff0c;返回所有从根节点到叶子节点的路径。 题目分析 其实从根节点往下走&#xff0c…