14

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

4

7 回答 7

19

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

使用 WorkbookFactory.create() 方法获取工作簿: 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));
}
于 2013-10-02T08:48:09.533 回答
18

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

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

对于 .xls-

Workbook wb = new HSSFWorkbook();

对于 .xlsx-

Workbook wb = new XSSFWorkbook();

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

于 2013-10-02T04:36:02.293 回答
12

您可以使用 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 文件

于 2015-07-16T12:19:30.760 回答
3

感谢汤姆的回答只是添加,使用 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);
     }   
于 2014-03-21T10:17:00.730 回答
3

您可以使用

Workbook wb = WorkBookFactory().create(inputStream); 
于 2017-06-15T21:06:51.163 回答
1

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

于 2013-10-02T04:38:11.250 回答
0

看来您正在寻找一种抽象读取过程的方法,您是说它的 XLS 或 XLSX 都没有关系,您希望您的代码无需修改即可工作。

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

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

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

于 2013-10-02T04:57:10.777 回答