2012-06-22 15 views
5

をロードするために多くの時間をとります。XSSFWorkbookは、私は次のコードを使用してい

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

のxlsxファイル自体は25,000行があり、各行は500列のコンテンツを持っています。デバッグ中に、私はXSSFWorkbookを作成する第3行目を見ました。このステートメントを完了するのに多くの時間(1時間!)がかかります。

元のxlsxファイルの値にアクセスするより良い方法はありますか?

おかげ アビシェークS

答えて

14

まずアップファイルを持っているとき、入力ストリームからXSSFWorkbookをロードしないでください! InputStreamを使用すると、すべてをメモリにバッファリングする必要があり、スペースが必要になり、時間がかかります。あなたはそのバッファリングをする必要がないので、しないでください!

POIの最新の夜間ビルドを使用している場合は、非常に簡単です。あなたのコードは次のようになります。

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

そうでなければ、それは非常に似ています:

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

これで問題が完全に解決されない場合は、poi event apiを小さなメモリフットプリントとして使用して大きなファイルを読み取ることができます。 poiのドキュメントには、次の例があります。http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api –

+0

ありがとう、これを試してみてください。これがどのようにして問題を解決するのか不思議です。内容をメモリにバッファリングしませんか?または、それはちょうど元の参考文献を使用してデータにアクセスしますか? –

+2

ファイルを開いて開くと、入力ストリームで開いた場合よりもバッファリングが少なくなります – Gagravarr

0

POIのストリーミングバージョンを使用することを検討してください。これにより、必要に応じてファイルのサブセットがメモリにロードされます。大きなファイルを扱うときは、この方法をお勧めします。

POI SXSSF

+9

私の印象は、ファイルだけを読んでいない、書き込みファイルに適用されるPOIのストリーミングバージョンです。 –

+7

正しいですが、SXSSFは書き込み専用です。低メモリ読取りを行うには、イベント(SAX)処理が必要です – Gagravarr

関連する問題