3

在读取 .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 文件中的读取完全没有问题。

4

3 回答 3

2

如果文件是 xlsx 格式而不是 xls,您可能会收到此错误。我会尝试使用通用 Workbook 对象(也称为 SS Usermodel)

查看Workbook 接口WorkbookFactory 对象。工厂应该能够使用 xlsx 或 xls 为您创建通用工作簿。

我以为我有一个很好的教程,但我似乎找不到它。不过我会继续寻找。

编辑

我从 Apache 的网站上找到了这个关于使用 SS 用户模型进行读取和重写的小片段。

我希望这有帮助!

于 2012-05-30T15:00:00.543 回答
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
}
于 2012-05-29T06:32:30.480 回答
1

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

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

.

从异常中,我可以知道发生了什么,我也可以告诉您使用的是旧版本的 Apache POI!标题签名0x0010000000060809对应于大约 25 年前的 Excel 4 文件格式!如果您使用较新版本的 Apache POI,它会给您一个有用的错误消息,告诉您提供的文件是旧的并且很大程度上不受支持的 Excel 文件。POI 的新版本确实包括OldExcelExtractor 工具,它可以从那些古老的格式中提取一些信息。

否则,与此类型的所有例外情况一样,请尝试在 Excel 中打开文件并另存为。这将使您了解文件当前是什么(例如,保存为 .xls 的 .html、保存为 .xls 的 .csv 等),还可以让您将其重新保存为适当的 .xls 文件以供 POI 加载和一起工作。

于 2012-05-29T15:10:47.230 回答