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 HSSFWorkbook或XSSFWorkbook.打开文件时,如果可能的话,使用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作为包装器.因此,在检测之后,您可以简单地重复使用流,因为它将重置为起始点.
| 归档时间: |
|
| 查看次数: |
23163 次 |
| 最近记录: |