参考文章:

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中相关推荐

  1. Java 百万数据秒级导出到Excel中

    出自: 腾讯课堂 700多分钟干货实战Java多线程高并发高性能实战全集 , 我学习完了之后, 我给 老师在课上说的话做了个笔记,以及视频的内容,还有代码敲了一遍,然后添加了一些注释,把执行结果也整理 ...

  2. python处理大量excel数据-使用python将大量数据导出到Excel中的小技巧分享

    (1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢?如果碰到需要导出大量数据又该如何操作呢? 本文主要解决以 ...

  3. python输出数据到excel-使用python将大量数据导出到Excel中的小技巧分享

    (1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢?如果碰到需要导出大量数据又该如何操作呢? 本文主要解决以 ...

  4. python输出数据到excel-如何使用python将大量数据导出到Excel中的小技巧之一

    如何使用python将大量数据导出到Excel中的小技巧 (1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢 ...

  5. 如何将存储在MongoDB数据库中的数据导出到Excel中?

    将MongoDB数据库中的数据导出到Excel中,只需以下几个步骤: (1)首先,打开MongoDB安装目录下的bin文件夹,(C:\Program Files (x86)\MongoDB\Serve ...

  6. python数据导出excel_【python Excel】如何使用python将大量数据导出到Excel中的小技巧之一...

    如何使用python将大量数据导出到Excel中的小技巧 (1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢 ...

  7. 如何将python数据输入到excel中_如何使用python将大量数据导出到Excel中的小技巧之一...

    如何使用python将大量数据导出到Excel中的小技巧 (1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢 ...

  8. python获取excel整行数据如何保存到新的工作簿中_如何使用python将大量数据导出到Excel中的小技巧之一...

    如何使用python将大量数据导出到Excel中的小技巧 (1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢 ...

  9. python导出百万数据到excel_使用python将大量数据导出到Excel中的小技巧分享

    使用python将大量数据导出到Excel中的小技巧分享 今天小编就为大家分享一篇使用python将大量数据导出到Excel中的小技巧心得,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看 ...

最新文章

  1. 136 Single Number(找唯一数Medium)
  2. linux spec 脚本,关于linux:shell脚本的单元测试
  3. 去除桌面图标蓝底的方法步骤
  4. c++多字节与宽字节字符串转换(windows平台)
  5. 解决ubuntu16.E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
  6. 【转载】同步和互斥的POSIX支持(互斥锁,条件变量,自旋锁)
  7. 在 Blazor WebAssembly 中使用 gRPC-Web
  8. seaborn.heatmap概述
  9. golang搭建微服务遇到的问题(不断更新)
  10. jenkins启动/重启/停止命令 改端口
  11. golang中如何使用http,socket5代理
  12. 持续集成 TeamCity 的配置与使用
  13. CSS:模拟实现QQ浏览器
  14. 日本家用电器技术标准及IEC对照介绍
  15. 【硬盘】2021-希捷叠瓦盘(SMR)、垂直盘(CMR/PMR)型号、容量大全
  16. 江南爱窗帘十大品牌 | 窗帘的定做有哪些技巧和注意事项?
  17. 程序员进阶攻略-笔记-051~061(完)
  18. 2014工作总结与2015展望
  19. PATINDEX 的纯 T-SQL 全部替换函数
  20. 个人账号被Facebook封号怎么办

热门文章

  1. iOS 14 UIDatePicker适配问题,使用老的选择器样式。
  2. 论文阅读和分析:A Tree-Structured Decoder for Image-to-Markup Generation
  3. deallocate mysql_MySQL中预处理语句prepare、execute与deallocate的使用教程
  4. EF学习之路——1.EF介绍及架构搭建
  5. 为Twemproxy 添加 Auth
  6. JDK和OpenJDK的区别
  7. iis的安全性如何加强?
  8. IIS/IIS Express中遇到的证书问题,此网站的安全证书存在问题。
  9. Hermite矩阵,正交矩阵,正交基
  10. 【DETR用于3D目标检测】DETR3D: 3D Object Detection from Multi-view Images via 3D-to-2D Queries