Исключение POI OutOfMemory с xlsx (XSSF)

Мы пытаемся использовать POI 3.8 для компонента Excel в нашем приложении, который должен иметь дело с созданием больших файлов Excel. Я был рад использовать потоковый подход SXSSF, который был быстрым и занимал очень мало памяти. Однако я не могу выполнить проверку данных и должен использовать XSSF.

В XSSF, когда я пытаюсь открыть файл xlsx (~ 5 МБ), память увеличивается и в основном приводит к OutOfMemory. Мои вопросы,

  1. Можно ли выполнить DataValidation (например, выбрать из раскрывающегося списка) с помощью SXSSF. Это было бы благословением для меня.

  2. Есть ли способ использовать XSSF для проверки данных, но с меньшим объемом памяти.

  3. Есть ли альтернативное java-решение для проверки данных xlsx, которое быстро и эффективно использует память.

Заранее спасибо..


person Sriram    schedule 23.05.2012    source источник
comment
Вам рекомендуется обратиться в список рассылки пользователей poi или даже открыть JIRA с тестовым примером.   -  person bmargulies    schedule 23.05.2012


Ответы (3)


Причина OutOfMemory, как видно из отладчика, POI 3.10.1:

XSSFWorkbook has ArrayList<XSSFSheet>; 
XSSFSheet has TreeMap<Integer,XSSFRow>;
XSSFRow has field _row._textsource._srcAfter found as char[32768]

подсчет: 32768 * (количество строк) = полная трата памяти.... В моем случае более 1 ГБ.

person Nikolai Varankine    schedule 12.09.2014

Он довольно хорошо работает с ss.usermodel (http://poi.apache.org/spreadsheet/quick-guide.html#Validation)

Просто вместо использования рабочей книги XSSF, как в руководстве:

Workbook workbook = new XSSFWorkbook();    
Sheet sheet = workbook.createSheet("Data Validation");  
     DataValidationHelper dvHelper = sheet.getDataValidationHelper();

поместите туда свою книгу SXSSF, чтобы DataValidationHelper был извлечен из листа SXSSF

    Workbook workbook = new SXSSFWorkbook();    
    Sheet sheet = workbook.createSheet("Data Validation");  
         DataValidationHelper dvHelper = sheet.getDataValidationHelper();  
//stuff with validation
person mordka    schedule 04.10.2012

Я тоже столкнулся с той же проблемой OOM при анализе файла xlsx ... после двух дней борьбы я наконец обнаружил приведенный ниже код, который был действительно идеальным;

Этот код основан на sjxlsx. Он читает xlsx и сохраняет на листе HSSF.

            // 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;
person Meer Nasirudeen    schedule 20.10.2013