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

2022-09-02 00:02:28

有没有办法在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:
   ...
}

谢谢。


答案 1

正在将评论提升为答案...

如果你打算对文件做一些特别的事情,那么rjokelai的答案就是做到这一点的方法。

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

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

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

然后,如果您需要执行某些特殊操作,请测试它是否为 or 。打开文件时,如果可能,请使用文件而不是输入流来加快速度并节省内存。HSSFWorkbookXSSFWorkbook

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


答案 2

您可以使用:

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

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

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

请注意,这两种方法都只支持支持“标记”功能(或PushBackInputStream)的流,因此不支持简单的FileInputStream。使用 BufferedInputStream 作为包装器。因此,在检测后,您可以简单地重用流,因为它将被重置为起点。


推荐