我需要创建一个可以读取xls和xlsx文件的方法。根据我的研究,HSSF用于读取xls和XSSF以读取xlsx。我可以使用Apache POI的一部分来读取这两个文件吗?我也遇到了ss.usermodel,但发现没有足够的代码可以兼顾xls和xlsx ....
答案 0 :(得分: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));
}
答案 1 :(得分:17)
我对Apache POI没有多少exp,但据我所知,如果你按类“Workbook”引用工作簿,那么你可以读写xls& XLSX。
您所要做的就是创建对象写入
表示.xls -
Workbook wb = new HSSFWorkbook();
表示.xlsx -
Workbook wb = new XSSFWorkbook();
您可以传递文件类型的参数,并使用If语句相应地创建WorkBook对象。
答案 2 :(得分:10)
你可以使用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文件
答案 3 :(得分:3)
感谢Tom的回答,只需添加,请使用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);
}
答案 4 :(得分:2)
您可以使用
Workbook wb = WorkBookFactory().create(inputStream);
答案 5 :(得分:1)
一个选项是使用lastIndexOf检查文件名。并查看它是否是.xls或xlsx然后使用if条件进行相应切换。 自从我工作poi以来已经有很长一段时间,但我认为它的属性就像.xls的HSSF和.xlsx的XSSF 请参阅http://poi.apache.org/网站,该主题下的最后一行 我为什么要使用Apache POI?
答案 6 :(得分:0)
看来你正在寻找一种抽象读取过程的方法,你说它无论是XLS还是XLSX都没关系,你希望你的代码无需修改即可工作。
我建议你看看Apache Tika,它是一个抽象文件阅读和内容解析的很棒的库,它使用POI和许多其他库,对所有这些库都有很好的抽象。
阅读PDF / XLS / XLSX类似于阅读文本文件,所有工作都在幕后完成。
阅读此内容以获取更多信息。 http://www.searchworkings.org/blog/-/blogs/introduction-to-apache-tika