Apache POI HSSF XLS读取错误

在.xls文件中读取时使用以下代码,其中s是文件目录:

InputStream input = new FileInputStream(s); Workbook wbs = new HSSFWorkbook(input); 

我收到以下错误信息:

 Exception in thread "main" java.io.IOException: Invalid header signature; read 0x0010000000060809, expected 0xE11AB1A1E011CFD0 

我需要一个能够读取XLSX或XLS的程序,并使用完全相同的代码来调整XSSF,在XLSX文件中读取完全没有问题。

如果文件是xlsx格式而不是xls,则可能会出现此错误。 我会尝试使用通用的工作簿对象(也称为SS用户模式)

检出Workbook接口和WorkbookFactory对象 。 工厂应该能够从xlsx或xls中为您创build一个通用工作簿。

我以为我有一个很好的教程,但我似乎无法find它。 我会继续寻找。

编辑

我从Apache的网站上发现了这个小小的片段 ,使用SS Usermodel进行读取和重写。

我希望这有帮助!

无效的标题签名; 读取0x342E312D46445025,预计0xE11AB1A1E011CFD0

那么当我上传损坏的xls / xlsx文件(将我更名为sample.pdf的损坏file upload到sample.xls)时,我得到了这个错误。 添加validation,如:

 Workbook wbs = null; try { InputStream input = new FileInputStream(s); wbs = new HSSFWorkbook(input); } catch(IOException e) { // log "file is corrupted", show error message to user } 

你得到的exception是告诉你,你提供的文件不是一个有效的Excel二进制文件,至less不是自1990年以来产生的有效的Excel文件。你得到的exception告诉你什么POI期望,而且它发现了其他的东西,而不是一个有效的.xls文件,并没有任何其他POI可以检测到。

有一点要注意的是,Excel打开了各种不同的文件格式,包括.csv和.html。 这对文件扩展名也不是很挑剔,所以很高兴打开一个已经重命名为.xls的CSV文件。 但是,由于将.csv重命名为.xls并不会奇迹般地改变格式,所以POI仍然无法打开它!

从例外情况来看,我可以告诉发生了什么,也可以告诉你使用的是古老版本的Apache POI! 0x0010000000060809的标头签名对应于大约25年前的Excel 4文件格式! 如果您使用更新版本的Apache POI,它会给您一个有用的错误消息,告诉您所提供的文件是旧的,基本上不受支持的Excel文件。 POI的新版本包括OldExcelExtractor工具 ,可以从这些古老的格式中提取一些信息。

否则,就像这种types的所有exception一样,请尝试在Excel中打开文件并执行另存为。 这将给你一个什么文件目前是一个想法(例如.html保存为.xls,.csv保存为.xls等),也可以让你重新保存它作为一个正确的.xls文件的POI加载和与…合作。