首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有xlsx的POI OutOfMemory异常(XSSF)

带有xlsx的POI OutOfMemory异常(XSSF)
EN

Stack Overflow用户
提问于 2012-05-23 13:45:56
回答 3查看 3.9K关注 0票数 3

我们试图使用POI 3.8作为我们的应用程序中的excel组件,它必须处理创建大型excel文件。我很高兴使用SXSSF流方法,它速度快,内存足印非常少。但是,我无法进行数据验证,必须使用XSSF。

在XSSF中,当我试图打开xlsx文件(~5MB)时,内存会迅速增加,并主要导致OutOfMemory。我的问题是,

  1. 是否可以使用SXSSF执行DataValidation (如从下拉列表中选择)。这对我来说是一种祝福。
  2. 是一种使用XSSF进行数据雪崩的方法,但是内存足印较少。
  3. 是一种用于xlsx数据验证的替代java解决方案,它速度快,内存效率高。

谢谢你提前..。

EN

回答 3

Stack Overflow用户

发布于 2014-09-12 20:26:27

OutOfMemory的原因,从调试器中可以看出,POI3.10.1:

代码语言:javascript
复制
XSSFWorkbook has ArrayList<XSSFSheet>; 
XSSFSheet has TreeMap<Integer,XSSFRow>;
XSSFRow has field _row._textsource._srcAfter found as char[32768]

计数: 32768 *(行数)=完全浪费内存.在我的情况下超过1GB。

票数 1
EN

Stack Overflow用户

发布于 2012-10-04 15:02:15

它在ss.usermodel (http://poi.apache.org/spreadsheet/quick-guide.html#Validation)中运行得很好。

只是不像手册中那样使用XSSF工作簿:

代码语言:javascript
复制
Workbook workbook = new XSSFWorkbook();    
Sheet sheet = workbook.createSheet("Data Validation");  
     DataValidationHelper dvHelper = sheet.getDataValidationHelper();

将您的SXSSF工作簿放在那里,以便从SXSSF工作表中提取DataValidationHelper

代码语言:javascript
复制
    Workbook workbook = new SXSSFWorkbook();    
    Sheet sheet = workbook.createSheet("Data Validation");  
         DataValidationHelper dvHelper = sheet.getDataValidationHelper();  
//stuff with validation
票数 0
EN

Stack Overflow用户

发布于 2013-10-20 07:31:32

在解析xlsx file...after两天的斗争中,我也面临着同样的OOM问题,最后我发现下面的代码非常完美;

此代码基于sjxlsx。它读取xlsx并存储在HSSF表中。

代码语言:javascript
复制
            // read the xlsx file
       SimpleXLSXWorkbook = new SimpleXLSXWorkbook(new File("C:/test.xlsx"));

        HSSFWorkbook hsfWorkbook = new HSSFWorkbook();

        org.apache.poi.ss.usermodel.Sheet hsfSheet = hsfWorkbook.createSheet();

        Sheet sheetToRead = workbook.getSheet(0, false);

        SheetRowReader reader = sheetToRead.newReader();
        Cell[] row;
        int rowPos = 0;
        while ((row = reader.readRow()) != null) {
            org.apache.poi.ss.usermodel.Row hfsRow = hsfSheet.createRow(rowPos);
            int cellPos = 0;
            for (Cell cell : row) {
                if(cell != null){
                    org.apache.poi.ss.usermodel.Cell hfsCell = hfsRow.createCell(cellPos);
                    hfsCell.setCellType(org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING);
                    hfsCell.setCellValue(cell.getValue());
                }
                cellPos++;
            }
            rowPos++;
        }
        return hsfSheet;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10721279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档