【问题标题】:Is there any way to read both .xls and .xlsx files using Apache POI?有没有办法使用 Apache POI 读取 .xls 和 .xlsx 文件?
【发布时间】:2017-06-16 05:06:51
【问题描述】:

我需要创建一个可以同时读取 xls 和 xlsx 文件的方法。根据我的研究,HSSF 用于读取 xls,XSSF 用于读取 xlsx。我可以使用 Apache POI 的一部分来读取这两个文件吗?我也遇到了 ss.usermodel 但发现没有足够的代码可以同时满足 xls 和 xlsx....

【问题讨论】:

标签: java excel apache-poi


【解决方案1】:

是的,POI 提供了一组新的接口,可用于这两种类型。

使用 WorkbookFactory.create() 方法获取 Workbook:http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/WorkbookFactory.html

您可以在不依赖文件扩展名的情况下检查 excel 文件(这是不可靠的 - 例如,许多 csv 文件具有 xls 扩展名,但 POI 无法解析):

//simple way to check for both types of excel files
public boolean isExcel(InputStream i) throws IOException{
    return (POIFSFileSystem.hasPOIFSHeader(i) || POIXMLDocument.hasOOXMLHeader(i));
}

【讨论】:

  • 您好!感谢您发布的代码。我发现它比我尝试过的冗长代码更好。
  • .doc 将通过此检查
  • hasPOIFSHeaderhasOOXMLHeader 现在已弃用:(
【解决方案2】:

我对 Apache POI 没有太多经验,但据我所知,如果您按“工作簿”类引用工作簿,那么您可以读写 xls 和 xlsx。

你所要做的就是在创建对象时写

对于.xls-

Workbook wb = new HSSFWorkbook();

对于.xlsx-

Workbook wb = new XSSFWorkbook();

您可以传递文件类型的参数并使用 If 语句相应地创建 WorkBook 对象。

【讨论】:

  • 您好!我也记住了上述代码,如果我找不到任何其他方法来检测文件扩展名,我打算使用这些代码。
  • 我建议您检查此基本实用程序以读取所有 excel 文件:github.com/eaorak/excelr
【解决方案3】:

您可以使用 apache 提供的 poi-ooxml 和 poi-ooxml-schema jar 来阅读。

并使用以下代码:--

Workbook wb = null;
excelFileToRead = new FileInputStream(fileName);
wb = WorkbookFactory.create(excelFileToRead); 
Sheet sheet = wb.getSheet(sheetName);

上面的代码会同时读取 xls 和 xlsx 文件

【讨论】:

  • 这是最好的答案。如果有一天 POI 支持第三种格式,这段代码仍然可以工作。
【解决方案4】:

感谢汤姆的回答只是添加,使用 foll。获取输入流的代码,否则我们可能会遇到Exception in thread "main" java.io.IOException: mark/reset not supported

     InputStream inputStream = new FileInputStream(new File("C:\\myFile.xls"));

     if(! inputStream.markSupported()) {
                inputStream = new PushbackInputStream(fileStream, 8);
     }   

【讨论】:

    【解决方案5】:

    你可以使用

    Workbook wb = WorkBookFactory().create(inputStream); 
    

    【讨论】:

    【解决方案6】:

    一个选项是使用 lastIndexOf 检查文件名。并查看它是 .xls 还是 xlsx,然后使用 if 条件进行相应切换。 自从我从事 poi 工作以来已经有很长时间了,但我认为它的属性就像 .xls 的 HSSF 和 .xlsx 的 XSSF 参考http://poi.apache.org/站点,主题下的最后一行 为什么要使用 Apache POI?

    【讨论】:

      【解决方案7】:

      您似乎正在寻找一种抽象读取过程的方法,您是说无论是 XLS 还是 XLSX,您都希望您的代码无需修改即可工作。

      我建议你看看Apache Tika,它是一个很棒的库,可以抽象文件读取和内容解析,它使用 POI 和许多其他库,并且对所有这些库都有很好的抽象。

      阅读 PDF/XLS/XLSX 类似于阅读文本文件,所有工作都在幕后完成。

      阅读本文了解更多信息。 http://www.searchworkings.org/blog/-/blogs/introduction-to-apache-tika

      【讨论】:

      • 非常感谢您推荐 Apache Tika,这是我第一次读到它。我将对此进行研究并将其与 Apache POI 进行比较
      • Tika 使用 POI 和许多其他库,它是对所有这些库的抽象,而不是替代。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多