Fehler Beim Lesen von Großen Excel-Dateien (xlsx-Format) Via Apache POI
Ich versuche zu Lesen, große excel-xlsx-Dateien via Apache POI, sagen wir 40-50 MB. Ich bin immer out of memory-Ausnahme. Die aktuelle heap-Speicher 3GB.
Lesen kann ich kleinere excel-Dateien ohne Probleme. Ich brauche einen Weg, zu Lesen, große excel-Dateien und dann Sie zurück als Reaktion über Frühling excel anzeigen.
public class FetchExcel extends AbstractView {
@Override
protected void renderMergedOutputModel(
Map model, HttpServletRequest request, HttpServletResponse response)
throws Exception {
String fileName = "SomeExcel.xlsx";
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
OPCPackage pkg = OPCPackage.open("/someDir/SomeExcel.xlsx");
XSSFWorkbook workbook = new XSSFWorkbook(pkg);
ServletOutputStream respOut = response.getOutputStream();
pkg.close();
workbook.write(respOut);
respOut.flush();
workbook = null;
response.setHeader("Content-disposition", "attachment;filename=\"" +fileName+ "\"");
}
}
Ich das erste begann mit XSSFWorkbook workbook = new XSSFWorkbook(FileInputStream in);
aber das war teuer pro Apache POI API, also wechselte ich auf OPC Paket Weg, aber immer noch den gleichen Effekt. Ich brauche nicht zu analysieren oder verarbeiten Sie die Datei, Lesen Sie es und schicken es zurück.
- Versuchen SXSSF poi.apache.org/spreadsheet/index.html
- Ich brauche ein Beispiel. Ich Suche im Internet aber nicht finden können, ein Beispiel für das Lesen großen Bogen über SXSSF, sonst würde nicht die Frage gestellt in den ersten Platz.
- haben Sie diese option? -Xms1024M -Xmx2048M
- Nevermind, SXSSF soll schreiben großer Datenmengen nur. Geben Sie die JVM-heap-mehr Speicher, und vermeiden Sie solche unhöflich Kommentare.
- Haben Sie versucht, eine ODBC-Verbindung? Vielleicht ein besserer Ansatz
- Hast du Schreibzugriff auf lokale Datei, kann problem ist über die web-Anwendung.
- Es liest aus einem Verzeichnis die xlsx-Dateien.
- Haben Sie versucht, Blick auf die POI XSSF event API sehr wenig Speicher Lesen unterstützen?
- Ähnlich Große Excel-XLSX-Datei Lesen, Diskussion über post - stackoverflow.com/a/13480820/1343356, sehen Sie!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du nicht erwähnt, ob Sie ändern müssen Sie das Arbeitsblatt oder nicht.
Dies kann offensichtlich sein, aber wenn Sie nicht brauchen, zu ändern, Arbeitsblatt, dann brauchen Sie nicht zu analysieren, es und Schreibe es wieder aus, können Sie einfach die gelesenen bytes aus der Datei und schreibt die bytes, als würden Sie mit, sagen wir, ein Bild oder andere binary-format.
Wenn Sie tun müssen, ändern Sie die Kalkulationstabelle vor dem senden an den Benutzer, dann zu meinem wissen, Sie müssen möglicherweise einen anderen Ansatz.
Jede Bibliothek, die ich bewusst zum Lesen von Excel-Dateien in Java liest die gesamte Tabelle in den Speicher, so würden Sie haben 50 MB Speicher zur Verfügung für jede Tabelle, die möglicherweise sein könnte, die gleichzeitig verarbeitet. Dies beinhaltet, wie andere haben darauf hingewiesen, anpassen der heap zur Verfügung, um die VM.
Wenn Sie benötigen eine große Anzahl von Tabellen gleichzeitig, und kann nicht ausreichend Speicher reservieren, verwenden Sie ein format, das gestreamt werden kann, statt Lesen, alle auf einmal in den Speicher. CSV-format können geöffnet werden, indem Sie Excel, und ich habe gute Ergebnisse in der Vergangenheit durch das setzen des content-type auf application/vnd.ms-excel, - Einstellung der Anlage mit dem Namen etwas mit der Endung ".xls", sondern tatsächlich wieder den CSV-Inhalt. Ich habe nicht versucht, diese in ein paar Jahren, so YMMV.
Hier ist ein Beispiel für das Lesen eine große xls-Datei mit sax-parser.
In der bellwo Beispiel füge ich eine komplette code, wie zu analysieren, eine komplette excel-Datei (für mich 60Mo) in die Liste der Objekt ohne jedes problem von "out of memory" und funktionieren:
dann müssen Sie calss, die
Weitere Informationen visite dieser link
Auch ich Stand vor der gleichen Frage OOM während der Analyse xlsx-Datei...nach zwei Tagen Kampf, habe ich endlich herausgefunden, der code unten, dass war wirklich perfekt;
Dieser code basiert auf sjxlsx. Es liest die xlsx-Format, und speichert in einem HSSF sheet.