JAVA将百万级数据高效的导出到EXCEL表单

news2024/12/28 6:04:38

遇到的问题

1.list集合太大,触发oom

2.导出excel数据量太大内存占满,没输出到硬盘前已经出发oom

接下来尝试用poi解决

<dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-ooxml</artifactId>
     <version>3.10-FINAL</version>
</dependency>
<dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-ooxml-schemas</artifactId>
     <version>3.10-FINAL</version>
</dependency>

一开始用XSSFWorkbook

rows参数是传进来的总条数,col是输出的总列数

public static void XSSFWorkbook(int rows, int col) throws Exception {
        long start = System.currentTimeMillis();
        XSSFWorkbook workbook1 = new XSSFWorkbook();
        Sheet first = workbook1.createSheet("sheet1");
        for (int i = 0; i < rows; i++) {
            Row row = first.createRow(i);
            for (int j = 0; j < col; j++) {
                if(i == 0) {
                    // 首行
                    row.createCell(j).setCellValue("column" + j);
                } else {
                    // 数据
                    if (j == 0) {
                        CellUtil.createCell(row, j, String.valueOf(i));
                    } else
                        CellUtil.createCell(row, j, String.valueOf(Math.random()));
                }
            }
        }
        FileOutputStream out = new FileOutputStream("E:/XSSFWorkbookworkbook.xlsx");
        workbook1.write(out);
        out.close();
        System.out.println(("XSSFWorkbook "+(System.currentTimeMillis()-start)/1000));
    }

导致触发GC

原因是excel文档的数据都存在内存中,当一直望excel填充数据,那么就越大,内存就扛不住

去poi官网看到

再次回到POI的官网。http://poi.apache.org/spreadsheet/index.html

官方提到自POI3.8版本开始提供了一种SXSSF的方式,用于超大数据量的操作。于是…

原文:

SXSSF is an API-compatible streaming extension of XSSF to be used when very large spreadsheets have to be produced…

 POI类库实现了相对高效的批量写入类SXSSFWorkbook

于是尝试了

public static void SXSSFWorkbook(int rows, int col) throws Exception {
        long start = System.currentTimeMillis();
        XSSFWorkbook workbook1 = new XSSFWorkbook();
        SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(workbook1, 100);
        Sheet first = sxssfWorkbook.createSheet("sheet1");
        for (int i = 0; i < rows; i++) {
            Row row = first.createRow(i);
            for (int j = 0; j < col; j++) {
                if(i == 0) {
                    // 首行
                    row.createCell(j).setCellValue("column" + j);
                } else {
                    // 数据
                    if (j == 0) {
                        CellUtil.createCell(row, j, String.valueOf(i));
                    } else
                        CellUtil.createCell(row, j, String.valueOf(Math.random()));
                }
            }
        }
        FileOutputStream out = new FileOutputStream("E:/SXSSFWorkbookworkbook.xlsx");
        sxssfWorkbook.write(out);
        out.close();
        System.out.println(("SXSSFWorkbook "+(System.currentTimeMillis()-start)/1000));
    }

看到数据的瞬间感觉,哇塞。好给力的说。居然从将近50秒缩短带11秒。。。

为什么都是代码差距就这么大呢?

原来,SXSSF实现了一套自动刷入数据的机制。当数据数量达到一定程度时(用户可以自己设置这个限制)。像文本中刷入部分数据输出到硬盘中。这样就缓解了程序运行时候内存的压力。达到高效的目的。

原理:用硬盘换内存

当然也有现成的工具类hutool的BigExcelWriter

查看源码只是在poi的基础上封装了一层 

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

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

相关文章

如何在Exchange Online中使用使用反垃圾邮件策略将域列入白名单

将域列入白名单 打开安全门户单击威胁策略单击反垃圾邮件策略单击反垃圾邮件入站策略(默认)单击“允许域”Exchange Online已启用默认的反垃圾邮件策略。策略的名称为Default。不建议使用这些电子邮件,因为它们会使你的组织容易受到来自该域或发件人的欺骗电子邮件的攻击。我…

【环境配置】在Ubuntu中使用Docker20.10.23配置FATE1.10.0(单机部署)

前言 本文讲解了在Ubuntu22中使用Docker20配置FATE1.10.0的方法 分为官方文档与我自己的实际操作两个部分 需要先安装docker&#xff0c;可以看我的上一篇文章 安装流程前言一、FATE单机部署指南&#xff08;官方&#xff09;1. 说明2. 使用Docker镜像安装FATE&#xff08;推荐…

Maven(mvn)基础

Maven&#xff08;mvn&#xff09;基础 文章目录Maven&#xff08;mvn&#xff09;基础传统项目管理状态分析Maven是什么Maven的作用下载与安装1.下载安装2.环境变量配置Maven基础概念仓库坐标本地仓库配置全局setting与用户setting第一个Maven项目(手动)Maven工程目录结构Mave…

蓝桥杯-长草

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 已知一个长度为n&#xff0c;宽度为m的长方形草地&#xff0c;但不是每一个方格里面都长满了草&#xff0c;只有部分的方格张了些草。并且每个月草会向上下左右都繁殖一个…

Linux中MMU内存管理【进阶学习】

前言 现代操作系统普遍采用虚拟内存管理&#xff08;Virtual Memory Management&#xff09;机制&#xff0c;这需要处理器中的MMU&#xff08;Memory Management Unit&#xff0c;内存管理单元&#xff09;提供支持。 MMU&#xff08;Memory Management Unit) &#xff1a;内…

微信小程序023安全科普之家在线考试错题集

开发语言&#xff1a;Java 小程序前端框架&#xff1a;uniapp 小程序运行软件&#xff1a;微信开发者 后端技术:Ssm(SpringSpringMVCMyBatis)vue.js 后端开发环境:idea/eclipse 数据库:mysql 本系统设计的是一个“科普之家”知识在线考试小程序的网站&#xff0c;此网站使用户实…

计算机网络基础知识点

计算机网络基础知识点计算机网络1、概述1.1 计算机网络基本概念1.2 互联网核心部分:数据交换1.3 计算机网络的性能指标1.4 计算机网络体系结构2、物理层2.1 物理层基本概念2.2 数据通信系统模型2.3 数据编码技术2.4 信道复用技术3、数据链路层3.1 概述3.2 PPP协议3.3 CSMA/CD3.…

Python垃圾回收机制——完美讲解

Garbage collection(GC) 现在的高级语言如java&#xff0c;c#等&#xff0c;都采用了垃圾收集机制&#xff0c;而不再是c&#xff0c;c里用户自己管理维护内存的方式。自己管理内存极其自由&#xff0c;可以任意申请内存&#xff0c;但如同一把双刃剑&#xff0c;为大量内存泄…

小程序用ts时点击事件e的类型

今天检查代码的时候发现&#xff0c;小伙伴用ts写的文件里面&#xff0c;点击事件的e都是用any&#xff0c;这明显不对。所以趁着有空&#xff0c;去百度去翻阅资料解决这个问题。 小程序的官方社区下面直接给了答案&#xff0c;如下图&#xff1a; 嗯&#xff0c;是的&#x…

看ChatGPT这形势,留给我们开发人员的时间不多了

程序员一直所做的工作是什么&#xff1f;恐怕想到最后&#xff0c;每个努力的程序员都是在让自己努力的走向失业。最近ChatGPT爆火&#xff0c;他能做什么&#xff1f;能写文章&#xff0c;写的很好&#xff0c;可以代替你发邮件&#xff0c;一直到发现OpenAI的深度加持&#x…

微信小程序 Springboot+vue+nodejs学科竞赛比赛报名管理系统

目 录 摘 要 III Abstract 4 1 系统概述 5 1.1 概述 5 1.2课题意义 5 1.3 主要内容 5 2 系统开发环境 6 2.1微信开发者工具 6 2.2小程序框架以及目录结构介绍 6 2.3 JAVA简介 7 2.4 MySQL数据库 7 3 需求分析 1 3.1 系统设计目标 1 …

实战案例 Python批量识别银行卡号码并且写入Excel,初学者也可以轻松使用~

大家好&#xff0c;这里是恶霸 今天我们继续学习Python自动化办公&#xff1a;每次有新员工入职&#xff0c;都要收集大量的工资卡信息&#xff0c;并且生成Excel文档&#xff0c;能不能用Python准确、快速地解决呢&#xff1f; 今天我们就来学习一下&#xff0c;如何用1行代…

【07】FreeRTOS的列表和列表项

目录 1.列表和列表项的简介 1.1列表结构体成员-介绍 1.2列表项结构层成员-介绍 1.3迷你列表项 1.4列表和列表项的关系 2.列表相关API函数介绍 2.1列表初始化函数vListInitialise() 2.2列表项初始化函数vListInitialiseItem() 2.3列表项插入函数vListInsert() 2.4末尾…

微服务配置中心, 这个方案 Go 里用起来不输SpringCloud

微服务架构设计模式里有一条讲到&#xff0c;要设计可配置的服务。把服务从单体架构细分成微服务后&#xff0c;所有配置属性都集中存储在一个位置&#xff0c;更易于管理。这个集中存储管理配置的地方叫&#xff0c;就是配置中心。 使用配置中心还有一个好处就是&#xff0c;…

java基础面试题 一

一、面向对象五大基本原则是什么 1.单一职责原则SRP(Single Responsibility Principle) 类的功能要单一&#xff0c;不能包罗万象&#xff0c;跟杂货铺似的。 2.开放封闭原则OCP(Open&#xff0d;Close Principle) 一个模块对于扩展是开放的&#xff0c;对于修改是封闭的 …

Jenkins基于docker cloud动态增减节点

jenkins可以按照jenkins容器启动去部署 Jenkins管理动态节点 动态节点可以在有job运行时&#xff0c;临时加入一个agent到jenkins master&#xff0c;然后等job执行完毕之后&#xff0c;所加入的agent再自动删除掉&#xff0c;达到一个动态的增删节点效果&#xff0c;使所有的…

引用第三方插件到分包中即如何把uni_modules文件夹中的插件放入分包中

网上搜索了很多&#xff0c;但都没有直接说明如何把node_modules中的第三方插件如何引入到分包中&#xff0c;首先为什么要在分包引入&#xff0c;原因就是小程序有包大小的限制&#xff0c;不能超过2M&#xff0c;超过2M的话&#xff0c;则不能发布或预览&#xff0c;于是不能…

SCT81620QSTER,升降压电源芯片

P2P替代 LM3478和LM3481SCT81620QSTER设备是一个宽输入、非同步升压控制器。该设备可用于增强、间隔和反馈转换器和拓扑结构。SCT81620Q设备的开关频率可以通过将SCT81620Q设备的开关频率调整到100 kHz到2.2MHz之间的任何值。电流模式控制提供了优越的带宽和瞬态响应&#xff0…

IDEA设置注释模板(详细版)

IDEA设置注释模板 类注释模板方法注释模板效果展示 1. 类注释模板 类注释模板是IDEA创建类时生成的注释 第一步、File -> Settings 第二步、Editor -> File and Code Templates -> Includes -> File Header 点apply&#xff0c;再点ok即可 模板参考如下&#…

拉格朗日插值原理及其Julia实现

文章目录数学原理算法化测试设函数yf(x)yf(x)yf(x)在区间[a,b][a,b][a,b]上有定义&#xff0c;且在点a⩽x0⩽x1…⩽xn⩽ba\leqslant x_0\leqslant x_1\ldots\leqslant x_n\leqslant ba⩽x0​⩽x1​…⩽xn​⩽b上的值y0,y1…yny_0, y_1 \ldots y_ny0​,y1​…yn​之间存在一个函…