2012-06-22 16 views
5

yüklemek için çok fazla zaman alır:XSSFWorkbook Aşağıdaki kodu kullanıyorum

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

xlsx dosyası kendisi 25.000 satır var ve her satır 500 sütunlarda içeriğe sahiptir. Hata ayıklama sırasında, bir XSSFWorkbook oluşturduğum üçüncü satırın, bu ifadeyi tamamlamak için çok zaman aldığını gördüm (1 saat!).

orijinal xlsx dosyası değerlerine erişmek için daha iyi bir yolu var mı?

Teşekkür Abhishek S

cevap

14

bir dosyayı varken İlk önce, inputStream bir XSSFWorkbook yük yok! Bir InputStream kullanmak, her şeyi belleğe ayırmayı gerektirir; bu da yer kaplar ve zaman alır. Bu arabelleği yapmanıza gerek olmadığından, yapma!

Gecelik en yeni POI yapılarıyla çalışıyorsanız, o zaman çok kolay. Kodunuz olur:

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

Aksi takdirde, çok benzer:

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

işleme gereksiniminiz varsa, bu sorunu tam olarak çözmezse, büyük bir dosyayı okumak için düşük bellek alanı olarak poi olay api'yi kullanabilirsiniz. Poi belgeleri burada bir örnek içerir: http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api –

+0

Teşekkürler, bunu deneyecek. Sadece bu sorunun nasıl çözüleceğini bilmek merak ediyor? İçeriği belleğe mi bağlayamaz? Yoksa orijinal referansları kullanarak herhangi bir şans eseri veriye erişecek mi? –

+2

Dosyayı bir dosya ile açarsanız, giriş akışında açıldığınızdan daha az arabelleğe alınacaktır. – Gagravarr

0

YEY'nin Akış sürümünü kullanmayı düşünün. Bu, dosyanın bir alt kümesini gerektiği gibi belleğe yükler. Büyük dosyalarla uğraşırken önerilen yöntemdir.

POI SXSSF

+9

Benim izlenimim sadece dosyaları okuma değil, yazma dosyalar için geçerlidir YEY'nin akış versiyonudur. –

+7

Doğru, SXSSF yalnızca yazmak içindir. Düşük bellek okuması yapmak için, olay (SAX) işleme – Gagravarr

İlgili konular