Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法使用ApachePOI同时读取.xls和.xlsx文件?_Java_Excel_Apache Poi - Fatal编程技术网

Java 有没有办法使用ApachePOI同时读取.xls和.xlsx文件?

Java 有没有办法使用ApachePOI同时读取.xls和.xlsx文件?,java,excel,apache-poi,Java,Excel,Apache Poi,我需要创建一个可以同时读取xls和xlsx文件的方法。根据我的研究,HSSF用于读取xls,XSSF用于读取xlsx。我是否可以使用Apache POI的一部分来读取这两个文件?我也遇到了ss.usermodel,但没有找到足够的代码来支持xls和xlsx….我对Apache POI没有太多经验,但据我所知,如果您按类“工作簿”引用工作簿,那么您可以读写xls和xlsx 您所要做的就是创建对象写入 对于.xls- Workbook wb = new HSSFWorkbook(); 对于.xls

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

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

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

对于.xls-

Workbook wb = new HSSFWorkbook();
对于.xlsx-

Workbook wb = new XSSFWorkbook();

您可以为文件类型传递一个参数,并使用If语句相应地创建工作簿对象。

一个选项是使用lastIndexOf检查文件名。并查看它是.xls还是xlsx,然后使用if条件相应地切换。 我已经很久没有研究poi了,但我认为它的属性类似于.xls的HSSF和.xlsx的XSSF 参考站点,主题下的最后一行
为什么我要使用Apache POI?

似乎您正在寻找一种抽象读取过程的方法,您是说它的XLS或XLSX都无关紧要,您希望您的代码在不修改的情况下工作

我建议你看一下,它是一个很棒的库,对文件读取和内容解析进行了抽象,它使用POI和许多其他库,并且对所有库都有很好的抽象

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


阅读本文了解更多信息

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

使用WorkbookFactory.create()方法获取工作簿:

您可以使用以下方法检查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));
}

多亏了汤姆的回答,我想补充一下,用foll。获取inputstream的代码,否则我们可能会在线程“main”java.io中遇到异常。IOException:不支持标记/重置

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

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

您可以使用apache提供的poi ooxml和poi ooxml模式JAR进行读取

并使用以下代码:--

上述代码将读取您可以使用的xls和xlsx文件

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

你好我也记住了上面提到的代码,如果我找不到任何其他方法来检测文件扩展名,我打算使用这些代码。我建议您检查这个基本实用程序来读取所有excel文件:非常感谢您推荐Apache Tika,这是我第一次读到它。我将对此进行研究,并将其与ApachePoitika使用POI和许多其他库进行比较,这是对所有库的抽象,而不是替代。您好!谢谢你发布的代码。我发现它比我尝试过的冗长代码要好..doc将通过此检查
hasPOIFSHeader
hasOOXMLHeader
现在已被弃用:(WorkbookFactory.create()必须是可接受的答案。使用
文件通常更好,请参阅这是最佳答案。如果有一天POI支持第三种格式,此代码仍然有效。
Workbook wb = WorkBookFactory().create(inputStream);