Laden einer großen xlsx-Datei aus dem INPUT-STREAM werfen OutOfMemoryError Apache POI

Ich Lesen möchte eine große excel-Datei(.xlsx/.xls). Wenn ich hochladen eine 20MB-Datei, plötzlich Java-Heap wurde erhöht von 2 GB und lief in OutOfMemoryError.

private Sheet getSheetForFileType(String filType, InputStream fileData) throws IOException {
    Workbook workbook;
    Sheet sheet;
    if (filType.equalsIgnoreCase("xls")) {
        workbook = new HSSFWorkbook(fileData); //OutOfMemoryError
        sheet = workbook.getSheetAt(0);
    } else {
        workbook = new XSSFWorkbook(fileData); //OutOfMemoryError
        sheet = workbook.getSheetAt(0);
    }
    return sheet;
}

Wie hier erwähnt, Apache-POI-übersicht , versuchte ich mit XSSF und SAX (Event, API) Geänderten code, wie unten:

private Sheet getSheetForFileType(String filType, InputStream fileData) throws IOException {

    if (filType.equalsIgnoreCase("xls")) {
        ....
    } else {
        OPCPackage opcPackage = OPCPackage.open(fileData);  //OutOfMemoryError
        XSSFReader xssfReader = new XSSFReader(opcPackage);
        SharedStringsTable sharedStringsTable = xssfReader.getSharedStringsTable();
        XMLReader parser = getSheetParser(sharedStringsTable);
        ....
        ....
    }
    return sheet;
}

Trotzdem bin ich mir nicht laden-Datei und Lesen Sie es.

I read file-data from Input-Stream, purpose is ONLY to Read-Data no write operations on it.

Das Lesen einer Datei dauert weniger Speicher, während ein InputStream mehr Speicher benötigt, als es zur Zwischenspeicherung der gesamten Datei.

Ich ging durch die anderen Beiträge, was ich verstehe:

  • erhöhen Heap-Speicher
  • excel-streaming-reader [nicht verwenden kann, habe ich zur Unterstützung(.xlsx/.xls)]
  • Lesen mit SAX-parser

Update-1: es wurde eine Beispiel-excel-Bild.

sample excel

0
2019-09-17 18:00:05
Quelle
0 Antworten

Sehen Sie sich andere Fragen zu Tags an