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

easyExcel导出大数据量EXCEL文件,前端实现进度条或者遮罩层

需求:页面点击导出,先按照页面条件去数据库查询,然后将查询到的数据导出。

问题:由于查询特别耗时,所以点击之后页面会看上去没有反应

方案1:就在点击之后在页面增加了一个进度条,等待后端查询结束之后,导出时,进度条会显示导出进度,导出结束之后进度条会消失。效果如下:

方案2:点击导出时前端增加一个遮罩层,遮罩层中间显示正在下载,导出完成后遮罩层消失,好处是可以既给用户提示,还可以阻止用户再次点击导出按钮。效果如下:

注意点:后端需要在响应头中设置ContentLength,前端需要用这个更新进度

response.setContentLength(excelBytes.length); // 设置Content-Length

方案1:进度条

html代码:

导 出

下载进度: 0%

css:

#progressContainer {
width: 100%;
background-color: #f3f3f3;
border: 1px solid #ccc;
border-radius: 5px;
}
#progressBar {
width: 0%;
height: 20px;
background-color: #4caf50;
border-radius: 5px;
}

js代码:

//进度条
$(‘#export_btn’).on(‘click’, function () {
// 获取表单数据并构建FormData对象
var formData = $(‘#searchForm’).serializeArray();
var form = new FormData();

$.each(formData, function () {
form.append(this.name, this.value);
});

// 添加额外的参数
form.append(‘publishFrom’, ‘${RequestParameters.type}’);

// 创建XHR对象
var xhr = new XMLHttpRequest();
xhr.open('POST', '路径/exportData', true);
xhr.responseType = 'blob'; // 设置响应类型为blob// 显示进度条
$('#progressContainer').show();
$('#progressText').show();
$('#progressBar').css('width', '0%');
$('#progressText').text('下载进度: 0%');// 设置请求头以模拟表单提交
// xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');// 监听下载进度
xhr.onprogress = function (event) {if (event.lengthComputable) {var percentComplete = Math.round((event.loaded / event.total) \* 100);console.log('Loaded:', event.loaded, 'Total:', event.total);$('#progressBar').css('width', percentComplete + '%');$('#progressText').text('下载进度: ' + percentComplete + '%');} else {console.log('无法计算进度');}
};// 下载完成后处理
xhr.onload = function () {if (xhr.status === 200) {// 隐藏进度条$('#progressContainer').hide();$('#progressText').hide();// 创建下载链接并触发下载var blob = xhr.response;var downloadUrl = URL.createObjectURL(blob);var a = document.createElement('a');a.href = downloadUrl;// 从响应头中获取文件名var disposition = xhr.getResponseHeader('Content-Disposition');var fileName = '下载文件.xlsx';if (disposition && disposition.indexOf('filename\*=utf-8''') !== -1) {var filenameRegex = /filename\*=utf-8''(.+)/;var matches = filenameRegex.exec(disposition);if (matches != null && matches\[1\]) {fileName = decodeURIComponent(matches\[1\]);}}a.download = fileName;document.body.appendChild(a);a.click();document.body.removeChild(a);URL.revokeObjectURL(downloadUrl);} else {alert('下载失败,请重试。');$('#progressContainer').hide();$('#progressText').hide();}
};// 发送请求
xhr.send(form);

});

后端代码,使用easyExcel导出

//数据查询
List sellList = this.search();

// 将Excel写入ByteArrayOutputStream
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
// 使用EasyExcel将数据写入ByteArrayOutputStream
EasyExcel.write(baos, Sell.class)
.sheet(“列表”)
.doWrite(sellList);

// 获取Excel字节数组
byte\[\] excelBytes = baos.toByteArray();// 设置响应头
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("列表导出\_Sell", "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-Disposition", "attachment;filename\*=utf-8''" + fileName + ".xlsx");
response.setHeader("Cache-Control", "max-age=0");
response.setContentLength(excelBytes.length); // 设置Content-Length// 将Excel字节数组写入响应
try (OutputStream out = response.getOutputStream()) {out.write(excelBytes);out.flush();
}

} catch (IOException e) {
e.printStackTrace();
}

方案2:遮罩层

html代码:

正在导出中...

css:

.loading-mask {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
z-index: 9999;
display: flex;
justify-content: center;
align-items: center;
}

.loading-content {
text-align: center;
color: #fff;
}

.spinner {
border: 8px solid rgba(255, 255, 255, 0.3);
border-top: 8px solid #fff;
border-radius: 50%;
width: 60px;
height: 60px;
animation: spin 1s linear infinite;
margin: 0 auto 20px;
}

@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}

button:disabled {
opacity: 0.6;
cursor: not-allowed;
}

js代码(阻止了有遮罩层时用户仍然可以通过键盘或其他方式触发多次点击):

$(document).ready(function () { // 确保DOM加载完成后执行
$(‘#export_btn’).on(‘click’, function (e) {
e.preventDefault(); // 阻止默认表单提交行为

    var $exportBtn = $(this);// 禁用导出按钮,防止重复点击$exportBtn.prop('disabled', true);// 显示遮罩层$('#loadingMask').show();// 获取表单数据并构建FormData对象var formData = $('#searchForm').serializeArray();var form = new FormData();$.each(formData, function () {form.append(this.name, this.value);});// 添加额外的参数form.append('publishFrom', '${RequestParameters.type}');// 创建XHR对象var xhr = new XMLHttpRequest();xhr.open('POST', '路径/exportData', true);xhr.responseType = 'blob'; // 设置响应类型为blob// 监听下载完成后处理xhr.onload = function () {$('#loadingMask').hide(); // 隐藏遮罩层$exportBtn.prop('disabled', false); // 启用导出按钮if (xhr.status === 200) {// 创建下载链接并触发下载var blob = xhr.response;var downloadUrl = URL.createObjectURL(blob);var a = document.createElement('a');a.href = downloadUrl;// 从响应头中获取文件名var disposition = xhr.getResponseHeader('Content-Disposition');var fileName = '下载文件.xlsx';if (disposition && disposition.indexOf("filename\*=utf-8''") !== -1) { // 修改:修正单引号字符var filenameRegex = /filename\*=utf-8''(.+)/;var matches = filenameRegex.exec(disposition);if (matches != null && matches\[1\]) {fileName = decodeURIComponent(matches\[1\]);}}a.download = fileName;document.body.appendChild(a);a.click();document.body.removeChild(a);URL.revokeObjectURL(downloadUrl);} else {alert('下载失败,请重试。');}};// 监听网络错误xhr.onerror = function () {$('#loadingMask').hide(); // 隐藏遮罩层$exportBtn.prop('disabled', false); // 启用导出按钮alert('网络错误,请检查您的连接。');};xhr.send(form); 
});

});

后端代码和方案1一致

相关文章:

easyExcel导出大数据量EXCEL文件,前端实现进度条或者遮罩层

需求:页面点击导出,先按照页面条件去数据库查询,然后将查询到的数据导出。 问题:由于查询特别耗时,所以点击之后页面会看上去没有反应 方案1:就在点击之后在页面增加了一个进度条,等待后端查询…...

Java模拟Mqtt客户端连接Mqtt Broker

Java模拟Mqtt客户端基本流程 引入Paho MQTT客户端库 <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.mqttv5.client</artifactId><version>1.2.5</version> </dependency>设置mqtt配置数据 …...

【电商搜索】文档的信息论生成聚类

【电商搜索】文档的信息论生成聚类 目录 文章目录 【电商搜索】文档的信息论生成聚类目录文章信息概览研究背景技术挑战如何破局技术应用主要相关工作与参考文献后续优化方向 后记 文章信息 https://arxiv.org/pdf/2412.13534 概览 本文提出了一种基于信息论的生成聚类&#…...

在福昕(pdf)阅读器中导航到上次阅读页面的方法

文章目录 在福昕(pdf)阅读器中导航到上次阅读页面的方法概述笔记用书签的方法来导航用导航按钮的方法来导航 备注END 在福昕(pdf)阅读器中导航到上次阅读页面的方法 概述 喜欢用福昕(pdf)阅读器来看pdf文件。 但是有个小问题困扰了我好久。 e.g. 300页的pdf看了一半&#xff…...

基于Springboot的数字科技风险报告管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…...

【最后203篇系列】001 - 2024回顾

说明 最早在CSDN上写文章有两个目的&#xff1a; 1 自己梳理知识&#xff0c;以备日后查用2 曾经从别人的文章中得到过帮助&#xff0c;所以也希望能给人帮助 所以在这个过程中&#xff0c;我的文章基本上完全是原创&#xff0c;也非常强调落地与工程化。在不断写作的过程中…...

量子退火与机器学习(1):少量数据求解未知QUBO矩阵,以少见多

文章目录 前言ー、复习QUBO&#xff1a;中药配伍的复杂性1.QUBO 的介入&#xff1a;寻找最佳药材组合 二、难题&#xff1a;QUBO矩阵未知的问题1.为什么这么难&#xff1f; 三、稀疏建模(Sparse Modeling)1. 欠定系统中的稀疏解2. L1和L2的选择&#xff1a; 三、压缩感知算法(C…...

矩阵:Input-Output Interpretation of Matrices (中英双语)

矩阵的输入-输出解释&#xff1a;深入理解与应用 在线性代数中&#xff0c;矩阵与向量的乘积 ( y A x y Ax yAx ) 是一个极为重要的关系。通过这一公式&#xff0c;我们可以将矩阵 ( A A A ) 看作一个将输入向量 ( x x x ) 映射到输出向量 ( y y y ) 的线性变换。在这种…...

excel 使用vlook up找出两列中不同的内容

当使用 VLOOKUP 函数时&#xff0c;您可以将其用于比较两列的内容。假设您要比较 A 列和 B 列的内容&#xff0c;并将结果显示在 C 列&#xff0c;您可以在 C1 单元格中输入以下公式&#xff1a; 这个公式将在 B 列中的每个单元格中查找是否存在于 A 列中。如果在 A 列中找不到…...

YoloV8改进策略:Head改进|DynamicHead,利用注意力机制统一目标检测头部|即插即用

摘要 论文介绍 本文介绍了一种名为DynamicHead的模块,该模块旨在通过注意力机制统一目标检测头部,以提升目标检测的性能。论文详细阐述了DynamicHead的工作原理,并通过实验证明了其在COCO基准测试上的有效性和效率。 创新点 DynamicHead模块的创新之处在于它首次尝试在一…...

两地的日出日落时间差为啥不相等

悟空去延吉玩耍&#xff0c;在下午4点多的时候发来一张照片&#xff0c;说&#xff0c;天已经黑了&#xff01;我赶紧地图上看了看&#xff0c;延吉居然和北京差了大约15度的经度差&#xff0c;那就是大约一小时的时差哦。次日我随便查了一下两地的日出日落时间&#xff0c;结果…...

Android Https和WebView

系统会提示说不安全&#xff0c;因为网站通过js就能调用你的android代码&#xff0c;如果你确认你的网站没用到JS的话就不要打开这个开关&#xff0c;如果用到了&#xff0c;就添加一个注解忽略它就行了。 后来就使用我们公司的网站了&#xff0c;发现也出不来&#xff0c;后来…...

2.5.1 文件管理基本概念

文章目录 文件文件系统文件分类 文件 文件&#xff1a;具有符号名&#xff0c;逻辑上有完整意义的一组相关信息的集合。 文件包含文件体、文件说明两部分。文件体存储文件的真实内容&#xff0c;文件说明存放操作系统管理文件所用的信息。 文件说明包含文件名、内部标识、类型、…...

在 PowerShell 中优雅地显示 Python 虚拟环境

在使用 Python 进行开发时&#xff0c;虚拟环境管理是一个非常重要的部分。无论是使用 venv 还是 conda&#xff0c;我们都希望能够清晰地看到当前所处的虚拟环境。本文将介绍如何在 PowerShell 中配置提示符&#xff0c;使其能够优雅地显示不同类型的 Python 虚拟环境。 问题…...

K8S Ingress 服务配置步骤说明

部署Pod服务 分别使用kubectl run和kubectl apply 部署nginx和tomcat服务 # 快速启动一个nginx服务 kubectl run my-nginx --imagenginx --port80# 使用yaml创建tomcat服务 kubectl apply -f my-tomcat.yamlmy-tomcat.yaml apiVersion: apps/v1 kind: Deployment metadata:n…...

观察者模式(sigslot in C++)

大家&#xff0c;我是东风&#xff0c;今天抽点时间整理一下我很久前关注的一个不错的库&#xff0c;可以支持我们在使用标准C的时候使用信号槽机制进行观察者模式设计&#xff0c;sigslot 官网&#xff1a; http://sigslot.sourceforge.net/ 本文较为详尽探讨了一种观察者模…...

python使用pip进行库的下载

前言 现如今有太多的python编译软件&#xff0c;其库的下载也是五花八门&#xff0c;但在作者看来&#xff0c;无论是哪种方法都是万变不离其宗&#xff0c;即pip下载。 pip是python的包管理工具&#xff0c;无论你是用的什么python软件&#xff0c;都可以用pip进行库的下载。 …...

C#(委托)

一、基本定义 在C#中&#xff0c;委托&#xff08;Delegate&#xff09;是一种引用类型&#xff0c;它用于封装一个方法&#xff08;具有特定的参数列表和返回类型&#xff09;。可以把委托想象成一个能存储方法的变量&#xff0c;这个变量能够像调用普通方法一样来调用它所存…...

《点点之歌》“意外”诞生记

世界是“点点”的&#xff0c;“点点”是世界的。 (笔记模板由python脚本于2024年12月23日 19:28:25创建&#xff0c;本篇笔记适合喜欢诗文的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 …...

ue5 pcg(程序内容生成)真的简单方便,就5个节点

总结&#xff1a; 前情提示 鼠标单击右键平移节点 1.编辑-》插件-》procedural->勾选两个插件 2.右键-》pcg图表-》拖拽进入场景 3.先看点point 右键-》调试(快捷键d)->右侧设置粒子数 3.1调整粒子数 可以在右侧输入框&#xff0c;使用加减乘除 4.1 表面采样器 …...

车机固件升级全攻略:工具选择与操作技巧

1. 车机固件升级入门指南 刚买车那会儿&#xff0c;我对车机系统升级完全没概念&#xff0c;直到有次导航把我导到一条正在施工的断头路上&#xff0c;才发现自己的车机地图已经两年没更新了。车机固件升级就像给手机系统更新一样重要&#xff0c;不仅能修复bug&#xff0c;还能…...

FineReport实战:条件属性与参数控件的动态交互设计

1. 条件属性的核心玩法与实战案例 条件属性是FineReport中最实用的功能之一&#xff0c;它能让静态报表"活"起来。简单来说&#xff0c;就是根据数据值或业务规则&#xff0c;动态改变单元格的显示样式或内容。我在给某零售企业做数据分析系统时&#xff0c;就用这个…...

三极管有源滤波电路真的可以工作吗?

超简单的三极管有源滤波电路 01 【三极管有源滤波】 一、滤波电路 今天看到一个B站视频&#xff0c; 介绍使用三极管进行有源滤波的电路。 这个三极管有源滤波电路&#xff0c; 串联在整流电路的后边&#xff0c; 对输出波纹进行滤波。 那么问题来了&#xff0c; 究竟这个电路…...

5分钟掌握艾尔登法环存档迁移工具:终极免费解决方案

5分钟掌握艾尔登法环存档迁移工具&#xff1a;终极免费解决方案 【免费下载链接】EldenRingSaveCopier 项目地址: https://gitcode.com/gh_mirrors/el/EldenRingSaveCopier 艾尔登法环存档迁移工具是一款专为《艾尔登法环》玩家设计的专业存档管理软件&#xff0c;能够…...

如何打造专属AI开发工作流:Forge高级配置的终极指南

如何打造专属AI开发工作流&#xff1a;Forge高级配置的终极指南 【免费下载链接】forgecode AI enabled pair programmer for Claude, GPT, O Series, Grok, Deepseek, Gemini and 300 models 项目地址: https://gitcode.com/gh_mirrors/forge39/forgecode Forge作为一款…...

一物一码系统怎么搭建?从0到1的完整实施路径与避坑指南

在数字化转型浪潮中&#xff0c;一物一码已从"锦上添花"变为企业基础设施。但市面上方案繁杂&#xff0c;企业自建常陷入"技术选型迷茫"和"业务落地困难"。本文基于顶讯科技一物一码平台的底层架构逻辑&#xff0c;拆解系统搭建的完整路径&#…...

Jmeter实战:如何用正则表达式提取登录cookie并跨线程组共享(附完整配置截图)

Jmeter实战&#xff1a;正则表达式提取登录Cookie与跨线程组共享的深度解析 在接口自动化测试中&#xff0c;Cookie管理一直是工程师们需要面对的典型挑战。想象这样一个场景&#xff1a;你需要测试一个电商平台的购物流程&#xff0c;从登录到浏览商品再到下单支付&#xff0c…...

终极指南:如何让Intel Mac保持凉爽的3个简单技巧

终极指南&#xff1a;如何让Intel Mac保持凉爽的3个简单技巧 【免费下载链接】smcFanControl Control the fans of every Intel Mac to make it run cooler 项目地址: https://gitcode.com/gh_mirrors/smc/smcFanControl 你是否曾经在使用Intel Mac进行视频剪辑或编程时…...

手把手教你从零搭建Ubuntu20.04下的ROS2开发环境

1. 为什么选择Ubuntu 20.04和ROS2 机器人开发领域近年来发展迅猛&#xff0c;而ROS2作为第二代机器人操作系统&#xff0c;已经成为行业新标准。相比第一代ROS&#xff0c;ROS2在实时性、跨平台支持和分布式架构等方面都有显著提升。我最初接触ROS2时也经历过不少挫折&#xff…...

Fe₃O₄@Au-PEG-FITC,四氧化三铁@金-聚乙二醇/荧光素异硫氰酸酯纳米复合材料,物理性质

Fe₃O₄Au-PEG-FITC&#xff0c;四氧化三铁金-聚乙二醇/荧光素异硫氰酸酯纳米复合材料&#xff0c;物理性质Fe₃O₄Au-PEG-FITC是一类由四氧化三铁&#xff08;Fe₃O₄&#xff09;磁性纳米颗粒为核心&#xff0c;经金纳米层&#xff08;Au&#xff09;包覆&#xff0c;并通过聚…...