2017-11-23 9 views
0
を使用して大規模なExcelファイルのためのシート名をエクセルゲット

I Iは、Excelファイルのシート名を取得するために使用し、次のコードを持っている(の.xlsx)のApache POI

XSSFWorkbook workBookXlsx = new XSSFWorkbook(new FileInputStream(pathToFile)); 
    ArrayList<String> sheetNames = new ArrayList<>(); 

    int numberOfSheets = workBookXlsx.getNumberOfSheets(); 
    for (int i = 0; i < numberOfSheets; i++) { 
     sheetNames.add(workBookXlsx.getSheetAt(i).getSheetName()); 
    } 

    workBookXlsx = null; 

私は上記のコードを持っている問題サイズが9MBのファイルに対しては、XSSFWorkbookを作成するには、多くのメモリ(〜700MB)が長時間(5-6秒)&になるということです。でもnullworkBookXlsxを設定すると(私はgcがまたは私がnullに変数が設定されているという理由だけで文句を言わないメモリを解放& JVMと呼ばれることmaynotも知っている)

私はドキュメントを経るでしたjavawで撮影したメモリーを解放しませんWorkbookXSSFWorkbook &私が理解したところから、メモリの少ないインプリントでシート名を得るのに役立つ方法はありません。

私が発見した一つの解決策は、手動で.xlsxファイルを解凍し、シート名とr:id

を取得するために.\xl\woorkbook.xmlの内容を読み取ることがあるなし.xlsxファイル内のシート名を取得するためのAPIがあります大きなメモリの刻印? @Gagravarrは、おそらく彼のコメントで何を意味するのか表示するには

+0

低レベルの[SAXベースのAPI](http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api)を使用してシート処理ステップをスキップしてみませんか? – Gagravarr

+1

https://stackoverflow.com/questions/46363139/how-to-get-list-of-named-range-sheet-name-and-referance-formuls-using-xssf-and-s/46364250#46364250 –

+0

を参照してください。 @Gagravarr多くのシートがあるので、最初にシートを選択してからSAXパーサーを使用しなければなりません。 –

答えて

2

:。

XSSFReaderは、あなたが順番にすべての異なるシートで入手できるようになると、各シートの入力ストリームのみが開かれたIteratorを返します」方法XSSFReader.getSheetsDataが含まれていますIteratorからフェッチされます。それぞれの処理が完了したら、InputStreamを閉じるのはあなた次第です。 "しかし、しばしばこれは完全な真実ではありません。実際にはXSSFReader.SheetIteratorが返され、シート名を取得するにはXSSFReader.SheetIterator.getSheetNameというメソッドがあります。

例:

import java.io.InputStream; 
import java.io.FileInputStream; 

import org.apache.poi.openxml4j.opc.OPCPackage; 
import org.apache.poi.xssf.eventusermodel.XSSFReader; 

import java.util.Iterator; 

public class ExcelXSSFGetSheetNamesXSSFReader { 

public static void main(String[] args) throws Exception { 

    OPCPackage pkg = OPCPackage.open(new FileInputStream("Example.xlsx")); 
    XSSFReader r = new XSSFReader(pkg); 
    Iterator<InputStream> sheets = r.getSheetsData(); 

    if (sheets instanceof XSSFReader.SheetIterator) { 
    XSSFReader.SheetIterator sheetiterator = (XSSFReader.SheetIterator)sheets; 

    while (sheetiterator.hasNext()) { 
    InputStream dummy = sheetiterator.next(); 

    System.out.println(sheetiterator.getSheetName()); 

    dummy.close(); 
    } 
    } 

    pkg.close(); 
} 
} 

結論:現在、あなたが唯一のAPIドキュメントを信頼することでapache poiで動作することはできません。代わりに、必ずsource codeをご覧ください。

+0

にコミットすることができれば、他の人にとっては便利です。これは実際には高速ですが、あなたが共有している他のリンクよりも多くのメモリーインプリントがあります。このコードは〜2秒かかるのに対し、他のコードは同じファイルに対して約7秒かかった。 –