Frage

Ich möchte mit Java in eine Excel -Datei (.xls MS Excel 2003 -Format) schreiben. Die Excel -Ausgabedateien können ~ 200.000 Zeilen enthalten, die ich über die Anzahl der Blätter (64.000 Zeilen pro Blatt aufgrund der Excel -Grenze) teilen möchte.

Ich habe versucht, die Apache -POI -APIs zu verwenden, aber es scheint ein Speicherschwein aufgrund des API -Objektmodells zu sein. Ich bin gezwungen, dem Arbeitsbuch -Objekt im Speicher Zellen/Blätter hinzuzufügen, und nur sobald alle Daten hinzugefügt werden, kann ich die Arbeitsmappe in eine Datei schreiben! Hier ist ein Beispiel, wie der Apache empfiehlt, Excel -Dateien mit ihrer API zu schreiben:

Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");

//Create a row and put some cells in it
Row row = sheet.createRow((short)0);

// Create a cell and put a value in it.
Cell cell = row.createCell(0);
cell.setCellValue(1);

// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Das Schreiben von ~ 20.000 Zeilen (mit etwa 10 bis 20 Spalten in jeder Reihe) gibt mir das gefürchtete "java.lang.outofMemoryError: Java Heap Space".

Ich habe versucht, die JVM -Initial -Heapsize- und maximale Haufengröße unter Verwendung von XMS- und XMX -Parametern als XMS512M und XMX1024 zu erhöhen. Ich kann immer noch nicht mehr als 150.000 Zeilen in die Datei schreiben.

Ich suche nach einer Möglichkeit, in eine Excel -Datei zu streamen, anstatt die gesamte Datei im Speicher zu erstellen, bevor sie sie auf die Festplatte schreibe, was hoffentlich viel Speichernutzung speichert. Alle alternativen API oder Lösungen wären geschätzt, aber ich bin auf die Verwendung von Java beschränkt. Vielen Dank! :)

War es hilfreich?

Lösung

Alle vorhandenen Java -APIs versuchen, das gesamte Dokument gleichzeitig im RAM zu erstellen. Versuchen Sie, eine XML -Datei zu schreiben, die stattdessen dem neuen XSLX -Dateiformat entspricht. Um Ihnen den Einstieg zu erleichtern, empfehle ich, eine kleine Datei in der gewünschten Form in Excel zu erstellen und zu speichern. Öffnen Sie es dann und untersuchen Sie die Struktur und ersetzen Sie die gewünschten Teile.

Wikipedia hat a Guter Artikel über das Gesamtformat.

Andere Tipps

Versuchen zu benutzen SXSSF Arbeitsbuch, das ist großartig für riesige XLS

Ich musste meine Dateien in mehrere Excel -Dateien teilen, um die Ausnahme von Heap Space zu überwinden. Ich dachte mir, dass ungefähr 5K -Zeilen mit 22 Spalten darüber waren, also habe ich einfach meine Logik gemacht, damit jede 5 -km -Zeile die Datei beendete, eine neue startete und die Dateien entsprechend entsprechend nähert.

In den Fällen, in denen ich 20.000 Zeilen zu schreiben hatte, habe ich 4+ verschiedene Dateien, die die Daten darstellen.

Schauen Sie sich das an die HSSF Serializer Aus dem Cocoon -Projekt.

Der HSSF -Serializer fängt SAX -Ereignisse an und erstellt eine Tabelle im XLS -Format von Microsoft Excel

Es gibt auch Jexcelapi, aber es verwendet mehr Speicher. Ich denke, Sie sollten eine .csv -Datei erstellen und in Excel öffnen. Sie können viele Daten übergeben, aber Sie können keine "Excel -Magie" machen.

Erwägen Sie, das CSV -Format zu verwenden. Auf diese Weise sind Sie nicht mehr durch den Speicher eingeschränkt -well, vielleicht nur während der Vorbereitung der Daten für CSV, aber dies kann auch effizient erfolgen, beispielsweise die Abfrageteilung von Zeilen von DB beispielsweise mit dem Beispiel LIMIT/OFFSET und schreiben Sie es sofort in die Datei, anstatt den gesamten DB -Tabelleninhalt in Javas Speicher zu bringen, bevor Sie eine Zeile schreiben. Die Excel -Begrenzung der Menge in einem "Blatt" wird auf etwa eine Million steigen.

Wenn die Daten tatsächlich von einem DB stammen, würde ich mich sehr überdenken, wenn Java das richtige Werkzeug dafür ist. Die meisten anständigen DBs haben eine Export-zu-CSV-Funktion, die diese Aufgabe zweifellos viel effizienter erledigen kann. Im Fall von MySQL können Sie die verwenden LOAD DATA INFILE Befehl dafür.

Wir haben zu diesem Zweck eine Java -Bibliothek entwickelt und sie ist derzeit als Open -Source -Projekt erhältlich https://github.com/jbaliuka/x4j-analytic . Wir verwenden es für die operative Berichterstattung. Wir generieren riesige Excel -Dateien, ~ 200.000 sollten ohne Probleme funktionieren, Excel schafft es auch, solche Dateien zu öffnen. Unser Code verwendet POI, um Vorlage zu laden, aber generierter Inhalt wird direkt in Datei ohne XML oder Objektmodellschicht im Speicher gestreamt.

Ist dieses Speicherproblem auftritt, wenn Sie Daten in Zelle einfügen oder wenn Sie Datenberechnung/-generierung durchführen?

Wenn Sie Dateien in eine Excel laden möchten, die aus vordefinierten statischen Vorlagenformat besteht, speichern Sie eine Vorlage besser und verwenden Sie mehrere Zeit wieder. Normalerweise ereignen sich Vorlagenfälle, wenn Sie tägliche Verkaufsbericht (usw.) generieren.

Ansonsten müssen Sie jedes Mal, wenn Sie eine neue Zeile, Rand, Spalte usw. von Grund auf neu erstellen müssen.

Bisher ist Apache Poi die einzige Wahl, die ich gefunden habe.

"Das Schreiben von ~ 20k Zeilen (mit etwa 10 bis 20 Spalten in jeder Reihe) gibt mir das gefürchtete" java.lang.outofMemoryError: Java Heap Space ".

"Enterprise it"

Was Sie tun können, ist Stapeldateninsertion durchzuführen. Erstellen Sie jedes Mal eine Queuetask -Tabelle, die nach der Generierung 1 Seite generieren, sich für Sekunden ausruhen und dann den zweiten Teil fortsetzen. Wenn Sie sich Sorgen über die dynamischen Datenänderungen während Ihrer Warteschlangenaufgabe machen, können Sie zunächst den Primärschlüssel in die Excel einholen (indem Sie die Spalte aus der Benutzeransicht verstecken und sperren). Der erste Lauf wird der Primärschlüssel einfügen. Anschließend wird die zweite Warteschlange aus dem Notepad ausgelesen und den Aufgabenabschnitt nach dem Teil ausgeführt.

Wir haben etwas ganz ähnliches, gleiche Datenmenge gemacht, und wir mussten zu Jexcelapi wechseln, weil POI die Ressourcen so stark ist. Versuchen Sie es mit Jexcelapi, Sie werden es nicht bereuen, wenn Sie große Excel-Files manipulieren müssen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top