使用Apache POI确定MS Excel文件类型

Ale*_*kin 20 java excel apache-poi

有没有办法在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:
   ...
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Gag*_*arr 40

推荐评论答案......

如果你要对这些文件做一些特别的事情,那么rjokelai的答案就是这样做的方法.

但是,如果您只是要使用HSSF/XSSF/Common SS用户模型,那么让POI为您执行此操作要简单得多,并使用WorkbookFactory来检测并打开您的类型.你会做类似的事情:

 Workbook wb = WorkbookFactory.create(new File("something.xls"));
Run Code Online (Sandbox Code Playgroud)

要么

 Workbook wb = WorkbookFactory.create(request.getInputStream());
Run Code Online (Sandbox Code Playgroud)

然后,如果你需要做一些特殊的事情,测试它是否是a HSSFWorkbookXSSFWorkbook.打开文件时,如果可能的话,使用File而不是InputStream来加速并节省内存.

如果您根本不知道文件是什么,请使用Apache Tika进行检测 - 它可以为您检测大量不同的文件格式.


RJo*_*RJo 22

您可以使用:

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

// For .xls
POIFSFileSystem.hasPOIFSHeader(new BufferedInputStream( new FileInputStream(file) ));
Run Code Online (Sandbox Code Playgroud)

这些本质上是WorkbookFactory#create(InputStream)用于确定类型的方法

请注意,两种方法仅支持支持"标记"功能(或PushBackInputStream)的流,因此不支持简单的FileInputStream.使用BufferedInputStream作为包装器.因此,在检测之后,您可以简单地重复使用流,因为它将重置为起始点.