2012-06-22 19 views
5

używam następujący kod: sam plikXSSFWorkbook zajmuje dużo czasu, aby załadować

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

XLSX ma 25000 wierszy i każdy rząd ma zawartość w 500 kolumnach. Podczas debugowania zobaczyłem, że trzeci wiersz, w którym tworzę książkę XSSFWorkbook, zajmuje dużo czasu (1 godzina!), Aby zakończyć to stwierdzenie.

Czy istnieje lepszy sposób dostępu do wartości oryginalnego pliku Xlsx?

Dzięki Abhishek S

Odpowiedz

14

Najpierw, nie wkładać XSSFWorkbook od InputStream gdy masz plik! Korzystanie z InputStream wymaga buforowania wszystkiego w pamięci, co pochłania dużo miejsca i wymaga czasu. Ponieważ nie musisz robić tego buforowania, nie rób tego!

Jeśli korzystasz z najnowszych, nocnych buildów UM, jest to bardzo łatwe. Kod staje się:

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

Inaczej, jest bardzo podobna:

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

Jeśli to nie rozwiąże całkowicie problemu, możesz użyć interfejsu API poi jako sposobu na niski odczyt pamięci, aby odczytać duży plik. Dokumentacja poi zawiera przykład: http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api –

+0

Dzięki, wypróbujemy to. Po prostu ciekawy, jak to rozwiąże problem? Czy nie buforuje zawartości w pamięci? Czy może przypadkiem dostęp do danych przy użyciu oryginalnych referencji? –

+2

Jeśli otworzysz go z plikiem, mniej będzie buforowane niż w przypadku otwierania za pomocą strumienia wejściowego – Gagravarr

0

Rozważ użycie wersję Streaming UM. Spowoduje to załadowanie podzbioru pliku do pamięci w razie potrzeby. Jest to zalecana metoda w przypadku dużych plików.

POI SXSSF

+9

Moje wrażenie jest wersja streaming POI stosuje się tylko do zapisu plików, nie czyta plików. –

+7

Prawidłowo, SXSSF służy wyłącznie do pisania. Aby wykonać odczyt z małej ilości pamięci, potrzebujesz przetwarzania zdarzenia (SAX). – Gagravarr

Powiązane problemy