2012-06-22 7 views
5

Ich verwende den folgenden Code zu laden:XSSFWorkbook nimmt viel Zeit

File file = new File("abc.xlsx"); 
InputStream st = new FileInputStream(file); 
XSSFWorkbook wb = new XSSFWorkbook(st); 

Die xlsx-Datei hat sich 25.000 Zeilen und jede Zeile hat Inhalt in 500 Spalten. Während des Debugging habe ich gesehen, dass die dritte Zeile, in der ich ein XSSFWorkbook erstelle, sehr lange dauert (1 Stunde!), Um diese Aussage zu vervollständigen.

Gibt es eine bessere Möglichkeit, auf die Werte der ursprünglichen xlsx-Datei zuzugreifen?

Dank Abhishek S

Antwort

14

Erstens, sie von einem Input eine XSSFWorkbook nicht geladen werden, wenn Sie eine Datei haben! Die Verwendung eines InputStream erfordert das Zwischenspeichern von allem in den Speicher, was Platz kostet und Zeit kostet. Da Sie diese Pufferung nicht durchführen müssen, tun Sie das nicht!

Wenn Sie mit den neuesten nächtlichen Builds von POI laufen, dann ist es sehr einfach. Ihr Code wird:

File file = new File("C:\\D\\Data Book.xlsx"); 
OPCPackage opcPackage = OPCPackage.open(file); 
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage); 

Ansonsten ist es sehr ähnlich:

File file = new File("C:\\D\\Data Book.xlsx"); 
OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath()); 
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage); 
+1

Wenn das das Problem nicht vollständig löst, können Sie Poi-Ereignis-API als einen geringen Speicherbedarf Weg verwenden, um eine große Datei zu lesen. Die Poi-Dokumentation enthält hier ein Beispiel: http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api –

+0

Danke, werde das ausprobieren. Nur neugierig zu wissen, wie das das Problem lösen wird? Werden die Inhalte nicht im Speicher zwischengespeichert? Oder greift es zufällig nur auf die Daten mit den Originalreferenzen zu? –

+2

Wenn Sie es mit einer Datei öffnen, wird weniger gepuffert als wenn Sie mit einem Eingabestream öffnen – Gagravarr

0

Betrachten Sie die Streaming-Version von POI verwenden. Dadurch wird bei Bedarf eine Teilmenge der Datei in den Speicher geladen. Dies ist die empfohlene Methode für große Dateien.

POI SXSSF

+9

Mein Eindruck ist, die Streaming-Version von POI nur Schreiben von Dateien gilt, nicht Lesen von Dateien. –

+7

Richtig, SXSSF ist nur zum Schreiben geeignet. Um wenig Speicher zu lesen, benötigen Sie die Verarbeitung des Ereignisses (SAX) – Gagravarr