`
happyqing
  • 浏览: 3199071 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

poi导出大量数据excel内存溢出解决方案

    博客分类:
  • poi
阅读更多

 

Excel2003版最大行数是65536行。Excel2007开始的版本最大行数是1048576行。

Excel2003的最大列数是256列,2007以上版本是16384列。

 

poi导出excel,不使用模板的

http://happyqing.iteye.com/blog/2075985

 

xls格式导出使用HSSFWorkbook,(这个暂时没有好办法)

 

xlsx格式导出以前使用XSSFWorkbook,可以使用新的SXSSFWorkbook(poi3.8+)

 

Workbook wb = new SXSSFWorkbook(1000); //大于1000行时会把之前的行写入硬盘

 

Row,Cell还跟之前的一样

 

官方样例

http://poi.apache.org/spreadsheet/how-to.html#sxssf

import junit.framework.Assert;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

    public static void main(String[] args) throws Throwable {
        SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk
        Sheet sh = wb.createSheet();
        for(int rownum = 0; rownum < 1000; rownum++){
            Row row = sh.createRow(rownum);
            for(int cellnum = 0; cellnum < 10; cellnum++){
                Cell cell = row.createCell(cellnum);
                String address = new CellReference(cell).formatAsString();
                cell.setCellValue(address);
            }

        }

        // Rows with rownum < 900 are flushed and not accessible
        for(int rownum = 0; rownum < 900; rownum++){
          Assert.assertNull(sh.getRow(rownum));
        }

        // ther last 100 rows are still in memory
        for(int rownum = 900; rownum < 1000; rownum++){
            Assert.assertNotNull(sh.getRow(rownum));
        }
        
        FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");
        wb.write(out);
        out.close();

        // dispose of temporary files backing this workbook on disk
        wb.dispose();
    }

 

 值得注意的是SXSSFWorkbook只能写不能读。但是往往我们需要向一个Excel模版里导出数据,这样才更好提前定义里面的格式和vba代码。

这里就需要使用SXSSFWorkbook的另外一个构造函数:

SXSSFWorkbook(XSSFWorkbook workbook)
Construct a workbook from a template.

 通过XSSFWorkbook来读取模版,然后用SXSSFWorkbook来设置样式和写数据,详细使用就参考API吧。 http://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFWorkbook.html

 

分享到:
评论
1 楼 18335864773 2017-06-05  
推荐另一种生成excel的方法。用pageoffice生成excel。pageoffice设计的还是很方便的,很多接口函数。比poi生成excel简单。最主要的是可以在线打开 ,编辑, 保存文档。还可以在线操作word,ppt等办公文档。

相关推荐

    poi大量数据读取gc内存溢出解决方案

    poi读取大量数据会造成gc内存溢出的报错,由于垃圾回收机制无法将大量的对象及时的回收,而这些对象又会保存在内存中,会导致内存不够用的情况,这时候我们就需要使用新的方法,读取为cvs即可.此解决方案可支持千万数据的...

    java解决大批量数据导出Excel产生内存溢出的方案

    在Java开发中,当面临大批量数据导出到Excel...通过这些方法,我们可以在处理大量数据导出到Excel时避免内存溢出问题,同时保持程序的稳定性和效率。在实际应用中,可以根据具体需求和环境选择合适的方法进行组合使用。

    使用POI导出大数据量到EXCEL

    "使用POI导出大数据量到EXCEL"这个主题涉及到如何高效地利用POI处理大量数据并将其导出到Excel文件中。以下是对这个主题的详细讲解。 1. **Apache POI简介** Apache POI 是一个开源项目,它提供了Java API来创建、...

    poi多线程大数据导出excel文件.zip

    本项目“poi多线程大数据导出excel文件”提供了一个解决方案,利用多线程来提高Excel的大数据导出效率。 Apache POI 3.1版本是较早的版本,而项目中使用了更新的4.1版本,这意味着它可能利用了更多优化和新特性。在...

    Springboot+Poi实现Excel的导入导出

    4. **性能优化**:如果数据量较大,可以考虑分批读写,避免一次性加载大量数据导致内存溢出。同时,对于数据库操作,可以使用批量插入以提高效率。 5. **安全考虑**:在处理用户上传的Excel文件时,需要防止SQL注入...

    easyExcel实现大数据导出

    `easyExcel`是专门为处理大量数据设计的一个轻量级工具,它能够有效地解决内存溢出问题,特别适合大数据量的Excel读写操作。下面将详细阐述`easyExcel`的核心功能、使用方法以及如何实现大数据导出。 `easyExcel`的...

    easypoi的使用demo,包含Excel模板导出,html导出Excel,Excel导出pdf等

    这个工具的主要目的是为了提供一种高效、完善的解决方案,尤其在处理大量数据时,能够实现高并发下的稳定性能。在标题和描述中提到的几个关键功能,我们将详细探讨如何使用Easy POI进行Excel模板导出、HTML导出为...

    poi导出excel2007

    ### 使用Apache POI导出Excel 2007并避免内存溢出问题 #### 背景介绍 在处理大量数据时,使用Java导出Excel文件可能会遇到内存溢出的问题,尤其是在导出Excel 2007(.xlsx格式)时更为常见。这是因为传统的`...

    java导出30万数据量的excel(采用生成多个excel,最后打包zip)

    本项目针对这一问题提出了一种解决方案,即分块生成多个Excel文件,然后将它们打包成ZIP文件供用户下载。下面我们将详细探讨这一过程涉及的关键知识点。 1. **Java处理Excel**: Java中常用的库有Apache POI和...

    通用的POI导入Excel解决方案

    3. **导出Excel数据** - **创建Sheet和Row**:在导出数据时,我们需要先创建一个新的Sheet,然后在Sheet中创建Row。 - **设置Cell数据**:在Row中,我们创建Cell并设置其数据类型(如STRING, NUMERIC, BOOLEAN等)...

    Java使用POI导出大数据量Excel的方法

    在Java开发中,导出大数据量的Excel文件可能会面临内存溢出的问题,特别是在使用Apache POI库时。这是因为默认情况下,POI会将整个Excel工作簿存储在内存中,当数据量过大时,内存消耗非常显著,可能导致系统崩溃。...

    java多线程导出excel(千万级别)优化

    Java多线程导出Excel是处理大数据量时的一种高效策略,尤其在面对千万级别的数据时。传统的Apache POI库在处理大规模数据时可能会遇到栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)等问题,因为这些...

    Java_批量导出大数据量Excel方法.zip

    在Java开发中,批量导出大数据量到...通过以上方法,开发者可以构建一个高效且健壮的Java批量导出大数据量到Excel的解决方案。具体实现细节可能在提供的excelproj和ExpXLS文件中有所体现,建议解压后仔细研究源代码。

    java向excel 写入海量数据内存溢出问题的解决.pdf

    在Java中,向Excel写入海量数据时可能会遇到内存溢出的问题,特别是在使用Apache POI库处理Excel文件时。这是因为POI默认会将整个工作簿加载到内存中,当数据量巨大时,内存消耗非常快,导致Java虚拟机(JVM)内存...

    java poi处理excel数据

    首先,`问题.docx`可能是你在使用POI过程中遇到的问题汇总,它可能包含了错误信息、解决步骤或常见问题的解决方案。通过阅读这份文档,你可以避免或解决类似的问题,提升开发效率。 其次,`统计年鉴示例.xlsx`是一...

    处理大数据量excel

    1. **读取Excel**:使用Apache POI等库读取Excel文件,可以逐行或按需加载数据,避免一次性加载整个文件导致内存溢出。 2. **预处理数据**:在读取数据后,可能需要进行数据清洗、格式转换等预处理步骤,以符合...

    poi excel导出,组合表头

    同时,为了提高性能,建议使用内存优化策略,如延迟计算、分批写入等,以避免一次性加载大量数据导致内存溢出。 综上所述,这个项目的核心在于利用Apache POI库创建具有复杂表头结构的Excel文件,这对数据报告、...

    poi:适合解析小的excel文件,文件稍微大一点就出现OOM。

    事件驱动解析是把文件转换成xml,然后一边读取一边解析,这样就对内存的占用就会很少,可以很好的处理poi出现OOM的问题。 maven添加需要的jar包 &lt;groupId&gt;org.apache.poi &lt;artifactId&gt;poi &lt;version&gt;3.15 ...

Global site tag (gtag.js) - Google Analytics