如何将几十万的数据高效的导出到excel中
参考文章:
excel 大量数据导出:
POI之SXSSFWorkbook大量数据导出至excel
https://blog.csdn.net/k_520_w/article/details/84404652
https://blog.csdn.net/z69183787/article/details/52045844
https://www.jianshu.com/p/aeb578844e5c?open_source=weibo_search
java导出excel弹出下载框
http://www.360doc.com/content/17/0625/18/29229598_666467187.shtml
思路:
一、同步导出
1、分页查询数据
2、将数据通过poi SXSSFWorkbook类写入excel,并可持久化到磁盘,防止内存溢出
3、多线程 TODO
4、导出时,通知用户,导出到哪一行了 TODO
a、可通过websocket通知
b、算法: (当前值/总大小值) *(100/100)
c、下载文件设置显示进度:https://blog.csdn.net/mynamepg/article/details/79801413
5、提示用户导出所需的大概时间(每毫秒所需时间=总时间(毫秒)/总导出记录数)
6、导出数量的控制(比如1w条)
二、异步导出 TODO
三、注意点:
1、poi 3.8 SXSSFWorkbook没有删除本地缓存文件方法
2、excel文件写性能优化
3、同步导出时,nginx超时时间设置:
location /xxxx/ {
proxy_pass http://localhost:11111/xxxx/xxxx/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_send_timeout 1200;
proxy_read_timeout 1200;
}
四、源码 链接: https://pan.baidu.com/s/1FS6gY_Ybh5aBGJT_KrDbkg 密码: 69t7
1、实现代码,
/*** 自定义字段的导出*/@RequestMapping("/xxxx")@ResponseBodypublic void xxxx(HttpServletRequest request, HttpServletResponse response) {Result result = new Result();OutputStream ouputStream = null;InputStream inputStream = null;XSSFWorkbook xssfWorkbook = null;SXSSFWorkbook sxssfWorkbook = null;long startTime=System.currentTimeMillis();try {Map<String, String> paramMap = this.getParamMap(request);logger.warn("导出excel原始请求参数:" + paramMap);String ip = getIpAddr(request);String sessionId = getCookieValue(request);inputStream = this.getClass().getResourceAsStream("/xxx.xlsx");xssfWorkbook = new XSSFWorkbook(inputStream);//既可读、也可写XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0);//设置表头XSSFRow row9 = xssfSheet.getRow(9);XSSFCell cell9_1Style = row9.getCell(1);CellStyle cellStyle = cell9_1Style.getCellStyle();//设置内容样式CellStyle style = xssfWorkbook.createCellStyle();Font font = xssfWorkbook.createFont();font.setFontHeightInPoints((short) 10);font.setFontName("微软雅黑");style.setFont(font);CellStyle style2 = xssfWorkbook.createCellStyle();style2.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框style2.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框style2.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框style2.setTopBorderColor(HSSFColor.WHITE.index);style2.setBottomBorderColor(HSSFColor.WHITE.index);style2.setLeftBorderColor(HSSFColor.WHITE.index);style2.setRightBorderColor(HSSFColor.WHITE.index);// 设置账号和时间XSSFRow row6 = xssfSheet.getRow(6);XSSFCell cell6_12 = row6.createCell(12);cell6_12.setCellValue("导出账号:" + mobile);cell6_12.setCellStyle(style2);//设置时间XSSFRow row7 = xssfSheet.getRow(7);XSSFCell cell7_12 = row7.createCell(12);String date = DateUtil.Date2String(new Date(), DateUtil.DATE_FORMAT);cell7_12.setCellValue("导出日期:" + date);cell7_12.setCellStyle(style2);String[] keyArr = paramMap.get("myMap").split(",");xssfSheet.removeRow(row9);row9 = xssfSheet.createRow(9);int x = 1;XSSFCell cell9_0 = row9.createCell(0);cell9_0.setCellValue("序号");cell9_0.setCellStyle(cellStyle);for (String s : keyArr) {XSSFCell cell9_n = row9.createCell(x);cell9_n.setCellStyle(cellStyle);cell9_n.setCellValue(xxx.get(s));x++;}for (int y = x; y < 31; y++) {XSSFCell cell9_y = row9.createCell(y);cell9_y.setCellStyle(cellStyle);cell9_y.setCellValue("");}sxssfWorkbook = new SXSSFWorkbook(xssfWorkbook);//SXSSFWorkbook用来写数据的sxssfWorkbook.setCompressTempFiles(true);SXSSFSheet sxssfSheet = sxssfWorkbook.getSheetAt(0);paramMap.remove("myMap");paramMap.remove("pageNum");paramMap.put("xxx","xxxx");Pager<DataVo> firstPager = this.searchApi.list(paramMap,1);int totalPage = firstPager.getTotalPage();//设置内容int i = 10;int m = 1;logger.warn("请求总页数:"+totalPage);for (int currPage = 1; currPage <= totalPage; currPage++) {logger.warn("请求第"+currPage+"页");List<xxx> xxxx= null;if(currPage==1){xxxx= firstPager.getRows();}else{xxxx= this.searchApi.list(paramMap,currPage).getRows();}if(CollectionUtils.isEmpty(dataVos)){logger.warn("第"+currPage+"页无数据");continue;}List<Product> list;for (xxx xxx: list) {sxssfSheet.createRow(i);SXSSFRow row = sxssfSheet.getRow(i);SXSSFCell cell0 = row.createCell(0);cell0.setCellValue(m);cell0.setCellStyle(style);int y = 1;for (String key : keyArr) {SXSSFCell cell = row.createCell(y);y++;}i++;m++;}}} catch (Exception e) {logger.error("导出数据异常1", e);sxssfWorkbook.removeSheetAt(0);sxssfWorkbook.createSheet().createRow(0).createCell(0).setCellValue("导出数据失败,请稍后再试");}try {response.setContentType("application/vnd.ms-excel;");response.setHeader("Content-disposition","attachment;filename=" + new String("批量导出.xlsx".getBytes("GB2312"), "ISO8859_1"));// 设定输出文件头ouputStream = response.getOutputStream();sxssfWorkbook.write(ouputStream);ouputStream.flush();} catch (Exception e) {logger.error("导出数据异常2", e);} finally {if (sxssfWorkbook != null) {sxssfWorkbook.dispose();}closeIOs(ouputStream, inputStream, sxssfWorkbook, xssfWorkbook);}logger.warn("当前程序耗时:"+(System.currentTimeMillis()-startTime)/1000+"s");}private void closeIOs(Closeable... closeables) {for (Closeable closeable : closeables) {if (closeable != null) {try {closeable.close();} catch (IOException e) {logger.error("io关闭异常", e);}}}}
如何将几十万的数据高效的导出到excel中相关推荐
- Java 百万数据秒级导出到Excel中
出自: 腾讯课堂 700多分钟干货实战Java多线程高并发高性能实战全集 , 我学习完了之后, 我给 老师在课上说的话做了个笔记,以及视频的内容,还有代码敲了一遍,然后添加了一些注释,把执行结果也整理 ...
- python处理大量excel数据-使用python将大量数据导出到Excel中的小技巧分享
(1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢?如果碰到需要导出大量数据又该如何操作呢? 本文主要解决以 ...
- python输出数据到excel-使用python将大量数据导出到Excel中的小技巧分享
(1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢?如果碰到需要导出大量数据又该如何操作呢? 本文主要解决以 ...
- python输出数据到excel-如何使用python将大量数据导出到Excel中的小技巧之一
如何使用python将大量数据导出到Excel中的小技巧 (1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢 ...
- 如何将存储在MongoDB数据库中的数据导出到Excel中?
将MongoDB数据库中的数据导出到Excel中,只需以下几个步骤: (1)首先,打开MongoDB安装目录下的bin文件夹,(C:\Program Files (x86)\MongoDB\Serve ...
- python数据导出excel_【python Excel】如何使用python将大量数据导出到Excel中的小技巧之一...
如何使用python将大量数据导出到Excel中的小技巧 (1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢 ...
- 如何将python数据输入到excel中_如何使用python将大量数据导出到Excel中的小技巧之一...
如何使用python将大量数据导出到Excel中的小技巧 (1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢 ...
- python获取excel整行数据如何保存到新的工作簿中_如何使用python将大量数据导出到Excel中的小技巧之一...
如何使用python将大量数据导出到Excel中的小技巧 (1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢 ...
- python导出百万数据到excel_使用python将大量数据导出到Excel中的小技巧分享
使用python将大量数据导出到Excel中的小技巧分享 今天小编就为大家分享一篇使用python将大量数据导出到Excel中的小技巧心得,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看 ...
最新文章
- 136 Single Number(找唯一数Medium)
- linux spec 脚本,关于linux:shell脚本的单元测试
- 去除桌面图标蓝底的方法步骤
- c++多字节与宽字节字符串转换(windows平台)
- 解决ubuntu16.E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
- 【转载】同步和互斥的POSIX支持(互斥锁,条件变量,自旋锁)
- 在 Blazor WebAssembly 中使用 gRPC-Web
- seaborn.heatmap概述
- golang搭建微服务遇到的问题(不断更新)
- jenkins启动/重启/停止命令 改端口
- golang中如何使用http,socket5代理
- 持续集成 TeamCity 的配置与使用
- CSS:模拟实现QQ浏览器
- 日本家用电器技术标准及IEC对照介绍
- 【硬盘】2021-希捷叠瓦盘(SMR)、垂直盘(CMR/PMR)型号、容量大全
- 江南爱窗帘十大品牌 | 窗帘的定做有哪些技巧和注意事项?
- 程序员进阶攻略-笔记-051~061(完)
- 2014工作总结与2015展望
- PATINDEX 的纯 T-SQL 全部替换函数
- 个人账号被Facebook封号怎么办
热门文章
- iOS 14 UIDatePicker适配问题,使用老的选择器样式。
- 论文阅读和分析:A Tree-Structured Decoder for Image-to-Markup Generation
- deallocate mysql_MySQL中预处理语句prepare、execute与deallocate的使用教程
- EF学习之路——1.EF介绍及架构搭建
- 为Twemproxy 添加 Auth
- JDK和OpenJDK的区别
- iis的安全性如何加强?
- IIS/IIS Express中遇到的证书问题,此网站的安全证书存在问题。
- Hermite矩阵,正交矩阵,正交基
- 【DETR用于3D目标检测】DETR3D: 3D Object Detection from Multi-view Images via 3D-to-2D Queries