`
coconut_zhang
  • 浏览: 540731 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

使用jxl导出大数据量EXCEL时内存溢出的解决办法

    博客分类:
  • java
 
阅读更多
POI或者JXL在导出大量数据的时候,由于它们将每一个单元格生都成一个Cell对象,所以很容易导致内存溢出。
1、通过jx1最新版本的采用临时文件写入EXCEL功能,设定临时文件的位置,可以有效的避免内存溢出:
           wbSetting.setUseTemporaryFileDuringWrite(true);   
           wbSetting.setTemporaryFileDuringWriteDirectory(new File(excelPath));//临时文件夹的位置

2、EXCEL获取的list集合先读取数据总行数,再通过ROWNUM进行控制,设定每次读取多少行数据,比如一个List设定为50000;
            WorkbookSettings wbSetting = new WorkbookSettings();   
            wbSetting.setUseTemporaryFileDuringWrite(true);   
            wbSetting.setTemporaryFileDuringWriteDirectory(new File(excelPath));//临时文件夹的位置
            workbook = Workbook.createWorkbook(new File(fullPath),wbSetting);
            int returnCount=0;
            if(null!=pager)
            {
                returnCount = BrasDatabase.getReturnCount(pager.getStartTime(),
                        pager.getEndTime(), pager);
            }

            if (returnCount > 0) {    
                pager.setPageSize(50000);
                pager.setTotalRows(returnCount);// 获取总行数
                pager.setNewTotalPages(pager.getTotalRows()); // 总页数
                for (int i = 1; i 
<= pager
.getTotalPages(); i++) {
                    pager.setCurrentPage(i); // 当前页面d
                    List<BrasAuth
>
 list = BrasDatabase
                            .getBrasAuthResultByIpToExcelList(pager
                                    .getStartTime(), pager.getEndTime(), pager);
                    this.createExcel(list,excelFilePath);
                    list.clear();
                }
            }



3、在写入EXCEL的时候,将读取的LIST分割,每50000条数据生成一个EXCEL的sheet(一个sheet最多能存储60000多行数据),再写入,写入的时候,如果设置了采用临时文件写入的话,jx1会自动采用生成临时文件的方式写入EXCEL:
       for(int i=1;i<=list.size();i++)
        {
            if(i%50000
==0)
            
{
                sheetName
=format.format(new 
Date());
                toExcel(list.subList(reNum, i),sheetName);
                reNum
=i;
            
}
        }
------------------------------------------------------------------------------------------------------------------------------
写文本格式的Excel文件,而不是用POI等生成二进制的文件, 可以避免创建大批量的对象时内存溢出.代码如下可以作为参考:
第一种格式,CSV,最简单的,格式最差,最基本的行列,不能合并,不能设置着色, 
第二种,HTML格式的,如:"<TABLE>....</TABLE>"这样的文本,后辍名改为XLS就可以了,可以设置跨行列的合并,可以着色,图片没试过,估计是可以的,还可以设置单元格对齐,单元格的格式等
public static boolean createExcelFileByStream(String path, List list) { 
        try { 
         //定义表头
         String userxlsinfo = "序号\t用户ID\t姓名\t手机\t留言信息"; 
            File file = new File("c:\\streamExcel.xls"); 
            if (file.isFile()) { 
                file.mkdir(); 
            } 
            FileOutputStream out = new FileOutputStream(file); 
            OutputStreamWriter osw = new OutputStreamWriter(out, "GB2312"); 
            BufferedWriter bw = new BufferedWriter(osw); 
            // 创建表头  
            String sheader = userxlsinfo; 
            sheader += "\r\n"; 
            bw.write(sheader); 
            if (list != null) { 
             // List list 此处可以遍历list对象
                for (int i = 0; i < 5; i++) { 
                    StringBuffer mess = new StringBuffer(); 
                    // 用户信息  
                    mess.append((i + 1) + "\t"); 
                    mess.append((i + 1) + "\t"); 
                    mess.append((i + 1) + "\t"); 
                    mess.append((i + 1) + "\t"); 
                    mess.append((i + 1) + "\t"); 
                   
                    mess.append("\r\n");     
                    System.out.println(i); 
                    bw.write(mess.toString()); 
                } 
            } 
            bw.close(); 
            osw.close(); 
            out.close(); 
            return true; 
        } catch (FileNotFoundException e) { 
            e.printStackTrace(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        }
        return false; 
    } 



注意:表头部分和数据部分的间隔一定要用'\t ' 如果改用','号则导出文件用excel打开展示会有问题.
分享到:
评论
1 楼 安静听歌 2015-08-04  
设置了.setUseTemporaryFileDuringWrite(true);   还是溢出了,,,

相关推荐

    Android-Android使用jxl快速导出excel表

    此外,如果数据量较大,应考虑分批写入或使用流式处理,以优化性能。 在实际项目中,你可能会遇到一些问题,如文件权限、内存溢出或线程同步等。对于这些问题,要确保正确请求存储权限,使用内存管理策略(如流或...

    jxl导出excel总结

    例如,由于Excel文件的内存占用较大,处理大量数据时可能会导致内存溢出。此时,可以考虑使用流式读写模式,以减少内存消耗。此外,jxl对Excel 2007及以后版本的xlsx格式支持有限,如果需要处理这种格式,可能需要...

    导出Excel 支持大数据量导出

    总结来说,使用jxl库进行大数据量Excel导出,关键在于合理分块、优化内存管理和充分利用异步处理。通过这些策略,即使面对大量数据,也能保证导出的效率和系统的稳定性。在实际开发中,还需要根据具体业务场景进行...

    jxl导出数据

    注意,如果你的数据量非常大,可能需要考虑分批处理或使用流式写入以避免内存溢出。 总的来说,JXL库提供了一个方便的方式来处理Excel文件,无论是在Java应用程序还是服务器端,都能有效地进行数据导入和导出。通过...

    jxl从数据库导出到excel工具包

    4. **性能优化**:处理大量数据时,可能需要考虑分批读取和写入,避免一次性加载整个数据集导致内存压力过大。 5. **错误处理和异常处理**:在开发过程中,要确保捕获和处理可能出现的异常,如文件不存在、数据格式...

    Java使用JXL操作Excel

    - 当写入大量数据时,考虑分批写入或使用流式写入以优化性能。 - JXL不支持Excel 2007及更高版本的.xlsx格式,但可以处理旧版的.xls格式。 以上就是Java使用JXL库操作Excel的基本知识。通过这些方法,你可以创建...

    利用Jxl生成excel文件

    - 处理大数据量:当数据量较大时,为了避免内存溢出,可以使用流式写入(streaming)模式,逐行写入数据而不是一次性加载所有数据。 - 遍历读取Excel文件:Jxl也支持读取Excel文件,我们可以创建`Workbook`对象,...

    jxl-2.6.10.rar odjbc14.jar : oracle导入导出Excel所需 jar包

    - 性能优化:对于大数据量操作,可以考虑分批处理,避免一次性加载大量数据导致内存溢出。 总之,"jxl-2.6.10.rar"和"odjbc14.jar"这两个jar包组合,为Java开发者提供了一个有效工具集,用于在Oracle数据库和Excel...

    excel 导出用的jxl.jar

    当数据量较大时,为了避免内存溢出,可以使用`WritableWorkbook`的流式写入模式,即`Workbook.createWorkbook(OutputStream)`,这允许数据逐行写入,而不是一次性加载所有数据。 8. **读取Excel文件**: `jxl....

    CSV大数据分批并压缩导出

    这是因为这些库在内存中构建整个工作簿模型,当数据量过大时,所需内存会迅速增加,可能导致Java虚拟机(JVM)崩溃。为了解决这个问题,可以采取分批导出策略。 分批导出是指将大数据集分割成若干小块,逐批处理和...

    jxl技术-excel操作公共类

    尽管JXL库非常实用,但处理大量数据时可能性能较低。对于大型Excel文件,可以考虑使用Apache POI等其他库,它们提供了更高效的内存管理和多线程处理。 8. **异常处理**: 使用JXL进行Excel操作时,需要注意可能...

    Java处理100万行超大Excel文件秒级响应

    通过使用EasyExcel,我们不仅解决了处理大量Excel数据时可能出现的内存溢出问题,还大大提高了数据处理的速度。对于104万行20列的大规模Excel文件,EasyExcel能够在70秒内完成处理,极大地提高了工作效率。未来,...

    jxl帮助文档

    6. **数据流处理**:JXL提供了处理大量数据的能力,通过数据流模型,可以有效地处理大文件,避免内存溢出问题。 7. **错误处理和版本兼容**:JXL库能够处理读取和写入不同版本的Excel文件(从Biff8到Excel 2007的...

    jxl报表制作工具

    6. **性能优化**: 当处理大数据量时,JXL提供流式处理模式,避免一次性加载所有数据导致内存溢出,提高程序效率。 7. **兼容性与版本控制**: JXL库支持多种Excel文件版本,从早期的BIFF5到最新的XLSX格式,确保了与...

    jxl(文件批量导入文件时处理文件的读取和写)帮助

    - **内存管理**:为了避免一次性加载大量数据导致内存溢出,可以使用`StreamingReader`来按需读取数据。 - **缓冲区**:使用缓冲区可以减少磁盘I/O次数,提高读写速度。 - **批处理**:对于大规模数据,可以分批...

    jxls报表生成利器,比起jxl,poi牛逼得很

    5. **流式处理**: 对于大数据量的报表,Apache POI提供了流式处理模式,可以减少内存消耗,避免内存溢出问题。 6. **性能比较**: 相比jxl,Apache POI提供了更广泛的支持和更好的性能,尤其是在处理复杂Excel格式和...

    快速、简洁、解决大文件内存溢出的java处理Excel工具 .rar

    EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。 EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知...

    java导出数据到Excel

    在Java编程环境中,导出数据到Excel是一种常见的需求,特别是在数据...此外,如果你的数据量非常大,可能需要分批写入,以避免内存溢出。在处理大量数据时,可以考虑使用流式处理或者Apache POI的SXSSF API来提高性能。

    真香!Java 导出 Excel 表格竟变得如此简单优雅

    poi 和 jxl 对内存的消耗很大,在处理大批量的数据时,容易造成内存溢出。比如处理一个 3M 的 Excel,poi 和 jxl 可能需要上百兆的内存,但 easyexcel 可能只需要几百或几千 KB(内存消耗对比有些夸张)。在性能这...

Global site tag (gtag.js) - Google Analytics