确定Apache POI中是否需要HSSF或XSSF的最佳方法是什么?

我实现了Microsoft Excel文件的上传服务,不能确定上传的文件types。 有时用户上传包含xlsx内容的xls扩展名的文件。 为了parsing我使用Apache Poi的文件,目前我首先尝试将上传的文件parsing为HSSFWorkbook,如果发现exception,我尝试创build一个XSSFWorkbook。

有没有更聪明的方法来检测需要什么版本?

/** should parse the uploaded file */ private void handleUpload(File file) { Workbook wb = tryToHandleHSSF(file); if (wb==null) wb = tryToHandleXSSF(file); if (wb!=null) { // ... do the parsing stuff } } /** helper for HSSF */ private Workbook tryToHandleHSSF(File file) { try { return new HSSFWorkbook(new FileInputStream(file)); } catch(Exception e) { return null; } } /** helper for XSSF */ private Workbook tryToHandleXSSF(File file) { Workbook workbook; try { InputStream fin = new FileInputStream(file); BufferedInputStream in = new BufferedInputStream(fin); try { if (POIFSFileSystem.hasPOIFSHeader(in)) { // if the file is encrypted POIFSFileSystem fs = new POIFSFileSystem(in); EncryptionInfo info = new EncryptionInfo(fs); Decryptor d = Decryptor.getInstance(info); d.verifyPassword(Decryptor.DEFAULT_PASSWORD); workbook = new org.apache.poi.xssf.usermodel.XSSFWorkbook(d.getDataStream(fs)); } else return new org.apache.poi.xssf.usermodel.XSSFWorkbook(in); } finally { in.close(); } } catch(Exception e) { return null; } } 

您可以使用可以处理XSSF和HSSF工作簿的SS Usermodel。

要以types不可知的方式从文件加载工作簿,可以使用WorkbookFactory中的create方法。

 import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.ss.usermodel.Workbook; ... ... // SS Workbook object Workbook workbook; // Handles both XSSF and HSSF automatically workbook = WorkbookFactory.create(new FileInputStream(file)); //Do your parsing using the workbook object