在读取.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文件时完全没有问题。
发布于 2012-05-30 23:00:01
如果文件是xlsx格式而不是xls格式,您可能会收到此错误。我会尝试使用通用的Workbook对象(也称为SS Usermodel)
查看Workbook interface和WorkbookFactory object。工厂应该能够为您创建一个基于xlsx或xls的通用工作簿。
我以为我有一个很好的教程,但我似乎找不到它。不过我会继续找的。
编辑
我在Apache的网站上找到了关于使用SS用户模型进行读取和重写的this little tiny snippet。
我希望这能帮到你!
发布于 2012-05-29 14:32:30
标头签名无效;读取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
}发布于 2012-05-29 23:10:47
您得到的异常是,您提供的文件不是有效的Excel二进制文件,至少不是自1990年以来生成的有效Excel文件。你得到的异常告诉你POI期望什么,并且它发现了不是有效的.xls文件的其他东西,并且没有任何其他POI可以检测到的东西。
需要注意的一件事是,Excel可以打开各种不同的文件格式,包括.csv和.html。它对文件扩展名也不是很挑剔,所以会愉快地打开一个已重命名为.xls的CSV文件。但是,由于将.csv重命名为.xls并不能神奇地改变格式,所以POI仍然无法打开它!
。
从这个异常中,我可以知道发生了什么,我还可以告诉您正在使用Apache POI的一个旧版本!0x0010000000060809的头签名对应于大约25年前的Excel4文件格式!如果您使用更新版本的Apache POI,它将显示一条有用的错误消息,告诉您所提供的文件是一个旧的、基本上不受支持的Excel文件。新版本的POI确实包括OldExcelExtractor tool,它可以从这些古老的格式中提取一些信息。
否则,与此类型的所有例外情况一样,尝试在Excel中打开该文件并执行另存为。这将使您了解当前的文件是什么(例如.html另存为.xls,.csv另存为.xls等),还允许您将其重新保存为适当的.xls文件,以便加载和使用。
https://stackoverflow.com/questions/10790136
复制相似问题