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

java导出excel浏览器下载,单线程VS多线程

java导出excel浏览器下载,单线程VS多线程

package com.mengyang.transactional.other.excelxssf;

import com.mengyang.transactional.other.myselfExcel.ExcelUtils;
import com.mengyang.transactional.pojo.ZhongXinDTO;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.CountDownLatch;

public class ExportExcelUtil {

Class<T> clazz;public ExportExcelUtil(Class<T> clazz) {this.clazz = clazz;
}//单线程
public void exportExcel(HttpServletResponse response, String excelHeaer, int sheetNum, List<T> dataList) {SXSSFWorkbook workbook = new SXSSFWorkbook(-1);String fileName = "中信报表导出" + ".xlsx";try {//使用workbook对象创建样式对象CellStyle cellStyle = workbook.createCellStyle();//创建字体对象Font font = workbook.createFont();//处理表格头部信息String[] head = excelHeaer.split(",");// 得到目标目标类的所有的字段列表Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {field.setAccessible(true);}Sheet sheet = workbook.createSheet("XXX");ExcelUtils.setCellStyle(sheet, cellStyle, font);//遍历集合中的数据Iterator<T> iterator = dataList.iterator();int currentRow = 0;//写入头信息Row row = sheet.createRow(currentRow);for (int i = 0; i < head.length; i++) {Cell cell = row.createCell(i);cell.setCellValue(head[i]);cell.setCellStyle(cellStyle);}currentRow++;//写入业务数据while (iterator.hasNext()) {T t = iterator.next();row = sheet.createRow(currentRow);for (int i = 0; i < fields.length; i++) {Cell cell = row.createCell(i);cell.setCellValue(String.valueOf(fields[i].get(t)));cell.setCellStyle(cellStyle);}currentRow++;}//下载response.reset();response.setContentType("application/octet-stream; charset=utf-8");//以流的形式对文件进行下载response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));//对文件名编码,防止文件名乱码workbook.write(response.getOutputStream());} catch (Exception e) {e.printStackTrace();} finally {//删除之前保存的临时文件workbook.dispose();}
}public void exportExcelAndMoreThread(HttpServletResponse response, String excelHeaer, int sheetNum, List<T> dataList) {SXSSFWorkbook workbook = new SXSSFWorkbook(-1);String fileName = "中信报表导出" + ".xlsx";try {//使用workbook对象创建样式对象CellStyle cellStyle = workbook.createCellStyle();//创建字体对象Font font = workbook.createFont();//处理表格头部信息String[] head = excelHeaer.split(",");CountDownLatch countDownLatch = new CountDownLatch(sheetNum);//倒计时开关// 得到目标目标类的所有的字段列表Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {field.setAccessible(true);}//遍历集合中的数据//Iterator<T> iterator = dataList.iterator();int currentRow = 0;if (Objects.equals(0, sheetNum)) {//单线程处理Sheet sheet = workbook.createSheet("XXX");ExcelUtils.setCellStyle(sheet, cellStyle, font);//遍历集合中的数据Iterator<T> iterator = dataList.iterator();//写入头信息Row row = sheet.createRow(currentRow);for (int i = 0; i < head.length; i++) {Cell cell = row.createCell(i);cell.setCellValue(head[i]);cell.setCellStyle(cellStyle);}currentRow++;//写入业务数据while (iterator.hasNext()) {T t = iterator.next();row = sheet.createRow(currentRow);for (int i = 0; i < fields.length; i++) {Cell cell = row.createCell(i);cell.setCellValue(String.valueOf(fields[i].get(t)));cell.setCellStyle(cellStyle);}currentRow++;}} else {int dataCount = dataList.size();//数据的长度//如何把list集合分成对应的份数,开几条线程就相当于把数据分成几份int avgNum = (int) Math.floor(dataCount / sheetNum);//获得平均值int remainder = dataCount % sheetNum;//最后有余数  102%4 =2int fromIndex = 0;int toIndex = 0;for (int i = 0; i < sheetNum; i++) {fromIndex = i * avgNum;if (i == sheetNum - 1) {//最后一个线程被开启toIndex = (i + 1) * avgNum - 1 + remainder;} else {toIndex = (i + 1) * avgNum - 1;}//分解数据List<T> data = dataList.subList(fromIndex, toIndex + 1);Sheet sheet1 = workbook.createSheet("项目数据" + i);ExcelUtils.setCellStyle(sheet1, cellStyle, font);new Thread(() -> {Iterator<T> iterator = data.iterator();int startIndex = 0;Row row = sheet1.createRow(startIndex);for (int j = 0; j < head.length; j++) {Cell cell = row.createCell(j);cell.setCellValue(head[j]);cell.setCellStyle(cellStyle);}startIndex++;while (iterator.hasNext()) {T t = iterator.next();row = sheet1.createRow(startIndex);for (int k = 0; k < fields.length; k++) {Cell cell = row.createCell(k);try {cell.setCellValue(String.valueOf(fields[k].get(t)));cell.setCellStyle(cellStyle);} catch (IllegalAccessException e) {e.printStackTrace();}}startIndex++;}countDownLatch.countDown();}, "线程" + i).start();}//告诉主线程,要等所有的线程运行完再进行Excel的导出countDownLatch.await();}//下载response.reset();response.setContentType("application/octet-stream; charset=utf-8");//以流的形式对文件进行下载response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));//对文件名编码,防止文件名乱码workbook.write(response.getOutputStream());} catch (Exception e) {e.printStackTrace();} finally {//删除之前保存的临时文件workbook.dispose();}
}

}

相关文章:

java导出excel浏览器下载,单线程VS多线程

java导出excel浏览器下载&#xff0c;单线程VS多线程 package com.mengyang.transactional.other.excelxssf; import com.mengyang.transactional.other.myselfExcel.ExcelUtils; import com.mengyang.transactional.pojo.ZhongXinDTO; import org.apache.poi.ss.usermodel.*…...

【rust/egui】(二)看看template的main函数:日志输出以及eframe run_native

说在前面 rust新手&#xff0c;egui没啥找到啥教程&#xff0c;这里自己记录下学习过程环境&#xff1a;windows11 22H2rust版本&#xff1a;rustc 1.71.1egui版本&#xff1a;0.22.0eframe版本&#xff1a;0.22.0上一篇&#xff1a;这里 开始 首先让我们看看main.rs中有些什么…...

Eigen在QT中的配置

Eigen简介 Eigen支持包括固定大小、任意大小的所有矩阵操作&#xff0c;甚至是稀疏矩阵&#xff1b;支持所有标准的数值类型&#xff0c;并且可以扩展为自定义的数值类型&#xff1b;支持多种矩阵分解及其几何特征的求解&#xff1b;它不支持的模块生态系统提供了许多专门的功能…...

微服务04-elasticsearch

1、es概念 1.1 文档和字段 elasticsearch是面向**文档(Document)**存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在elasticsearch中: 而Json文档中往往包含很多的字段(Field),类似于数据库中的列。 1.2 索引和映射 索引(…...

uniapp 微信小程序 订阅消息

第一步&#xff0c;需要先去小程序官方挑选一下订阅模板拿到模板id 订阅按钮在头部导航上&#xff0c;所以 <u-navbar :bgColor"bgColor"><view class"u-nav-slot" slot"left" click"goSubscribe"><image :src"g…...

JDK8日期时间工具类

此文章为笔记&#xff0c;为阅读其他文章的感受、补充、记录、练习、汇总&#xff0c;非原创&#xff0c;感谢每个知识分享者。 文章目录 1. 旧版日期时间的问题2. 新日期时间API介绍3. 日期时间的常见操作4. 日期时间的修改和比较5. 格式化和解析操作6. Instant类7. 计算日期…...

智汇云舟入选IDC《中国智慧城市数字孪生技术评估,2023》报告

8月7日&#xff0c;国际数据公司&#xff08;IDC&#xff09;发布了《中国智慧城市数字孪生技术评估&#xff0c;2023》报告。智汇云舟凭借在数字孪生领域的创新技术与产品&#xff0c;入选《2023中国数字孪生城市技术提供商图谱》。 报告通过公开征集的形式进行申报&am…...

《Zookeeper》源码分析(九)之选举通信网络

在上一篇文章中讲到QuorumCnxManager&#xff0c;它负责zookeeper服务器在选举期间最底层的网络通信&#xff0c;整个网络涉及到的类如下&#xff1a; 整个网络建立的过程如下&#xff1a; 选举前创建好QuorumCnxManager实例&#xff0c;并在QuorumCnxManager构造函数中创建好…...

JVM——栈和堆概述,以及有什么区别?

方法栈 方法栈并不是某一个 JVM 的内存空间&#xff0c;而是我们描述方法被调用过程的一个逻辑概念。 在同一个线程内&#xff0c;T1()调用T2()&#xff1a; T1()先开始&#xff0c;T2()后开始&#xff1b;T2()先结束&#xff0c;T1()后结束。 堆和栈概述 从英文单词角度来…...

恒盛策略:沪指冲高回落跌0.26%,酿酒、汽车等板块走弱,燃气股拉升

10日早盘&#xff0c;两市股指盘中冲高回落&#xff0c;半日成交约4200亿元&#xff0c;北向资金净卖出超20亿元。 到午间收盘&#xff0c;沪指跌0.26%报3235.9点&#xff0c;深成指跌0.54%&#xff0c;创业板指跌0.28%&#xff1b;两市算计成交4202亿元&#xff0c;北向资金净…...

Mongodb 常用操作

// 查询 user_id 是否存在 db.getCollection("t_mongo_user").find({"user_id" : { $exists: true }}) // 查询 user_id 10 的记录 db.getCollection("t_mongo_user").find({"user_id" : 10}) // 排序 -1&#xff0c;按照 _id 倒…...

【python】-【】

文章目录 转义字符和原字符二进制与字符编码标识符和保留字变量的定义和使用变量字符串列表for 一、print会输出①数字②字符串&#xff08;必须加引号&#xff09;③含有运算符的表达式&#xff08;例如 31 其中3&#xff0c;1是操作数&#xff0c;是运算符&#xff09;&#…...

基于Elman神经网络的电力负荷预测

1 案例背景 1.1 Elman神经网络概述 根据神经网络运行过程中的信息流向,可将神经网络可分为前馈式和反馈式两种基本类型。前馈式网络通过引入隐藏层以及非线性转移函数可以实现复杂的非线性映射功能。但前馈式网络的输出仅由当前输人和权矩阵决定,而与网络先前的输出结果无关。…...

LeetCode 0088. 合并两个有序数组

【LetMeFly】88.合并两个有序数组&#xff1a;O(m 1) O(1)的做法 力扣题目链接&#xff1a;https://leetcode.cn/problems/merge-sorted-array/ 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2…...

定义行业新标准?谷歌:折叠屏手机可承受20万次折叠

根据Patreon账户上的消息&#xff0c;Android专家Mishaal Rahman透露&#xff0c;谷歌计划推出新的硬件质量标准&#xff0c;以满足可折叠手机市场的需求。Android原始设备制造商&#xff08;OEM&#xff09;将需要完成谷歌提供的问卷调查&#xff0c;并提交样品设备进行严格审…...

在vscode中配置C/C++环境GCC on Linux

https://code.visualstudio.com/docs/cpp/config-linux 官方文档 准备工作 为了能够在vs code中编译运行C/C程序&#xff0c;需要下载&#xff1a; Visual Studio Code C扩展插件&#xff0c;cuda&#xff0c;&#xff0c;&#xff0c; 对于该扩展插件&#xff0c;打开vs c…...

windows执行完LoadLibrary()后,可以删除源动态库文件,函数不会锁库文件

windows执行完LoadLibrary()后&#xff0c;可以删除源动态库文件&#xff0c;函数不会锁库文件。 #include <iostream> #include <Windows.h>int main() {char path[MAX_PATH]{};GetCurrentDirectoryA(sizeof(path), path);HMODULE lib LoadLibraryA("testd…...

ios 知识

IOS 类文件.h和.m中interface的区别 大家都知道我们在创建类文件时会发现&#xff1a; #import <UIKit/UIKit.h>interface ViewController : UIViewControllerend和 #import "ViewController.h"interface ViewController ()end那么他们之间有何区别呢&#x…...

8 | 美国航班数据分析

"在现代快节奏的生活中,航空旅行已经成为人们出行的重要方式之一。然而,航班的准时性一直以来都是旅客和航空公司关注的焦点。无论是商务出差还是休闲度假,乘客们都希望能够在既定的时间内安全、准时地到达目的地。而对于航空公司而言,准点运营不仅关乎乘客体验,还涉…...

app.use(express.json()) 使用

Express内置的中间件 自 Express 4.16.0 版本开始&#xff0c;Express 内置了 3 个常用的中间件&#xff0c;极大的提高了 Express 项目的开发效率和体验 express.static 快速托管静态资源的内置中间件&#xff0c;例如&#xff1a; HTML 文件、图片、CSS 样式等&#xff08;无…...

Obsidian科研知识管理架构:构建高效学术工作流的本地化解决方案

Obsidian科研知识管理架构&#xff1a;构建高效学术工作流的本地化解决方案 【免费下载链接】obsidian_vault_template_for_researcher This is an vault template for researchers using obsidian. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian_vault_template_fo…...

Maxwell磁场仿真实战:无线传能线圈建模与优化

1. 无线传能线圈建模基础 第一次用Maxwell做无线传能线圈仿真时&#xff0c;我对着空白的建模界面发呆了半小时——到底该从哪下手&#xff1f;后来发现&#xff0c;把复杂问题拆解成小步骤才是关键。我们先从最简单的单匝圆环线圈开始&#xff0c;就像学画画先从画圆圈开始一…...

洛雪音乐助手:3步快速上手的免费开源音乐播放器

洛雪音乐助手&#xff1a;3步快速上手的免费开源音乐播放器 【免费下载链接】lx-music-desktop 一个基于 Electron 的音乐软件 项目地址: https://gitcode.com/GitHub_Trending/lx/lx-music-desktop 洛雪音乐助手是一款基于Electron和Vue开发的免费开源跨平台音乐软件&a…...

Qwen3.5-2B算法优化实战:提升LSTM时序数据预测与多模态融合效果

Qwen3.5-2B算法优化实战&#xff1a;提升LSTM时序数据预测与多模态融合效果 1. 引言&#xff1a;当LSTM遇上多模态 最近在做一个股票预测项目时遇到个有趣问题&#xff1a;传统LSTM模型只看K线走势数据&#xff0c;效果总是不太稳定。后来发现&#xff0c;市场情绪对股价影响…...

YOLOv8蒸馏终极实战:v8x→v8n精度仅降1.5%,速度翻6倍,工业部署首选

一、引言 做工业部署的朋友一定都懂这种痛&#xff1a;YOLOv8x在测试集上mAP能到98%&#xff0c;但部署到Jetson Nano上只有5FPS&#xff0c;根本满足不了产线节拍&#xff1b;换成YOLOv8n&#xff0c;速度能到30FPS&#xff0c;但mAP直接掉到89%&#xff0c;漏检率超标。剪枝…...

告别Cartographer重定位慢:3个优化技巧与子图筛选源码解析

Cartographer重定位性能优化实战&#xff1a;从源码解析到参数调优全指南 在机器人定位与建图领域&#xff0c;Cartographer凭借其出色的SLAM算法表现成为工业界和学术界的宠儿。但当场景切换到重定位场景时&#xff0c;许多开发者都会遇到一个共同的痛点——匹配速度慢得令人抓…...

TikTok爆火C语言创意:电脑无硬件发无线电,靠谱吗?

一、刷爆TikTok的技术神操作&#xff0c;无硬件也能发无线电&#xff1f; 2026年3月17日&#xff0c;有一条C语言创意短视频&#xff0c;它刷爆了TikTok&#xff0c;在单日的时候&#xff0c;斩获了10万以上的播放量&#xff0c;以及5万以上的点赞量。并且它登顶了当日C语言创…...

昇腾NPU环境异常自救指南:当AddCustom样例都开始‘卡死’怎么办?

昇腾NPU环境异常自救指南&#xff1a;当AddCustom样例都开始‘卡死’怎么办&#xff1f; 在昇腾AI计算平台的日常运维中&#xff0c;最令人头疼的莫过于那些"传染性"的环境异常——一个自定义算子的错误执行&#xff0c;竟然能让官方提供的标准样例也开始出现概率性卡…...

移动端内存管理优化

移动端内存管理优化&#xff1a;提升性能的关键策略 随着移动应用功能日益复杂&#xff0c;内存管理成为影响用户体验的关键因素。内存泄漏、过度占用等问题不仅导致应用卡顿&#xff0c;还可能引发崩溃。如何高效管理内存&#xff0c;成为开发者必须面对的挑战。本文将从几个…...

实测WuliArt Qwen-Image Turbo:赛博朋克、幻想生物,你的创意秒变高清画作

实测WuliArt Qwen-Image Turbo&#xff1a;赛博朋克、幻想生物&#xff0c;你的创意秒变高清画作 作为一名长期关注AI生成内容的开发者&#xff0c;我最近深度体验了WuliArt Qwen-Image Turbo这款本地化文生图工具。它基于阿里通义千问的Qwen-Image-2512模型&#xff0c;通过T…...