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

标签 java excel apache-poi

我实现了 Microsoft Excel 文件的上传服务,但无法确定上传的文件类型。有时,用户会上传包含 xlsx 内容的 xls 扩展名的文件。 为了解析文件,我使用 Apache Poi,目前我首先尝试将上传的文件解析为 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 用户模型,它可以处理 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

关于java - 确定 Apache POI 中是否需要 HSSF 还是 XSSF 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35295788/

相关文章:

java - 将 0 和 1 的字符串转换为字节

java - Lucene 查询解析器使用过滤器进行通配符查询

excel - 如果整行使用 VBA 匹配,则删除重复的行

Java POI删除单元格

java - 使用 Apache POI 将父列添加到 Excel 数据透视表

java - 如何使用 Apache POI 读取具有日期的 Excel 单元格?

java - 使用带有 IN 子句的 jooq 条件

java - 向 JAXB 元素添加属性

python - 删除 pandas 中行的一部分/向上移动行的一部分?对齐列标题

excel - 自动测试 VBA UserForms - 工具和/或技术?