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

Java 确定Apache POI中是否需要HSSF或XSSF的最佳方法是什么?,java,excel,apache-poi,Java,Excel,Apache Poi,我为Microsoft Excel文件实施了上载服务,无法确定上载的文件类型。有时用户上传包含xlsx内容的扩展名为xls的文件。 为了解析文件,我使用ApachePOI,目前我首先尝试将上传的文件解析为HSSFWorkbook,如果捕获到异常,则尝试创建XSSFWorkbook 有没有更聪明的方法来检测需要什么版本 /** should parse the uploaded file */ private void handleUpload(File file) { Workbook wb

我为Microsoft Excel文件实施了上载服务,无法确定上载的文件类型。有时用户上传包含xlsx内容的扩展名为xls的文件。 为了解析文件,我使用ApachePOI,目前我首先尝试将上传的文件解析为HSSFWorkbook,如果捕获到异常,则尝试创建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;
  }
}

您可以使用SS Usermodel,它可以处理XSSF和HSSF工作簿

要以与类型无关的方式从文件加载工作簿,可以使用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

首选的是SS用户模型。可以处理.xls和.xlsx@BalajiKrishnan我读过,但找不到适合SXSSFWorkBook的构造函数,只需使用WorkbookFactory。这里有一个例子