在读取.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文件中的所有读取都没有问题。
答案 0 :(得分:2)
如果文件是xlsx格式而不是xls,则可能会出现此错误。我会尝试使用通用的Workbook对象(也称为SS Usermodel)
查看Workbook interface和WorkbookFactory object。工厂应该能够从xlsx或xls中为您创建通用工作簿。
我以为我有一个很好的教程,但我似乎无法找到它。我会继续看。
修改强>
我在Apache的网站上找到了this little tiny snippet关于使用SS Usermodel进行阅读和重写的内容。
我希望这有帮助!
答案 1 :(得分:1)
标头签名无效;读取0x342E312D46445025,预期为0xE11AB1A1E011CFD0
当我上传损坏的xls / xlsx文件时,我收到此错误(上传损坏的文件我将sample.pdf重命名为sample.xls)。添加验证,如:
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
}
答案 2 :(得分:1)
您获得的异常是告诉您,您提供的文件不是有效的Excel二进制文件,至少不是自1990年以来生成的有效Excel文件。您获得的异常会告诉您什么POI期望,并且它发现其他东西而不是有效的.xls
文件,并且不是POI可以检测到的任何其他内容。
需要注意的一点是,Excel会打开各种不同的文件格式,包括.csv和.html。它对文件扩展名也不是很挑剔,因此很乐意打开一个已重命名为.xls文件的CSV文件。但是,由于将.csv重命名为.xls并没有神奇地改变格式,POI仍然无法打开它!
从例外情况来看,我可以告诉你发生了什么,我也可以告诉你正在使用古老版本的Apache POI!标题0x0010000000060809
对应于Excel 4文件格式,大约25年前!如果您使用更新版本的Apache POI,它将为您提供一条有用的错误消息,告诉您所提供的文件是旧的且基本上不受支持的Excel文件。新版本的POI确实包含OldExcelExtractor tool,它可以从那些古老的格式中提取一些信息。
否则,与此类型的所有异常一样,尝试在Excel中打开文件并执行另存为。这将使您了解文件当前是什么(例如.html保存为.xls,.csv保存为.xls等),并且还允许您将其重新保存为正确的.xls文件以供POI加载和与之合作。