22

Apache POI で MS Office Excel ファイルの種類を特定する方法はありますか? Excel ファイルの形式 (Excel '97(-2007) (.xls) または Excel 2007 OOXML (.xlsx)) を知る必要があります。

私はこのようなことができると思います:

int type = PoiTypeHelper.getType(file);
switch (type) {
case PoiType.EXCEL_1997_2007:
   ...
   break;
case PoiType.EXCEL_2007:
   ...
   break;
default:
   ...
}

ありがとう。

4

5 に答える 5

47

コメントを回答に昇格しています...

ファイルで何か特別なことをするつもりなら、rjokelai の答えがその方法です。

ただし、HSSF / XSSF / Common SS ユーザーモデルを使用するだけの場合は、POI でそれを行い、WorkbookFactoryを使用してタイプを検出して開く方がはるかに簡単です。次のようにします。

 Workbook wb = WorkbookFactory.create(new File("something.xls"));

また

 Workbook wb = WorkbookFactory.create(request.getInputStream());

次に、何か特別なことをする必要がある場合は、それがHSSFWorkbookまたは かどうかをテストしXSSFWorkbookます。ファイルを開くときは、可能な場合は InputStream ではなく File を使用して、処理を高速化し、メモリを節約します。

ファイルがまったくわからない場合は、Apache Tikaを使用して検出を行います。膨大な数の異なるファイル形式を検出できます。

于 2013-01-25T14:58:42.160 に答える
24

以下を使用できます。

// For .xlsx
POIXMLDocument.hasOOXMLHeader(new BufferedInputStream( new FileInputStream(file) ));

// For .xls
POIFSFileSystem.hasPOIFSHeader(new BufferedInputStream( new FileInputStream(file) ));

これらは基本的にWorkbookFactory#create(InputStream)、タイプを決定するために が使用するメソッドです。

どちらのメソッドも「マーク」機能 (または PushBackInputStream) をサポートするストリームのみをサポートするため、単純な FileInputStream はサポートされないことに注意してください。BufferedInputStream をラッパーとして使用します。このため、ストリームは開始点にリセットされるため、検出後に単純にストリームを再利用できます。

于 2013-01-25T13:12:15.940 に答える