Apache POI HSSF XLS读取错误

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文件。


еҲӣе»ә input жҲ– wbs еҸҳйҮҸж—¶еҮәзҺ°дәҶејӮеёёеҗ—пјҹ - Luiggi Mendoza
3个回答

3
你收到的异常提示表明你提供的文件不是有效的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中打开文件并另存为。这将让你了解文件当前的格式(例如.html保存为.xls,.csv保存为.xls等),并且还可以让你将其重新保存为POI可以加载和处理的正确的.xls文件。

2
如果文件是 xlsx 格式而不是 xls,则可能会出现此错误。我建议尝试使用通用 Workbook 对象(也称为 SS Usermodel)。
请查看 Workbook 接口WorkbookFactory 对象。工厂应该能够根据 xlsx 或 xls 为您创建通用的 Workbook。
我以为我有一个关于这个问题的好教程,但是我好像找不到了。不过我会继续寻找的。 编辑 我从 Apache 的网站上找到了 这个微小的代码片段,其中介绍了如何使用 SS Usermodel 进行读取和重写。
希望这可以帮到您!

1
如果您将 .xlsx 文件提供给 HSSF,至少在最近的版本中,您将不会收到此错误,而是会收到一个特定的错误提示您的错误。这是 POI 完全不知道的一般性错误... - Gagravarr
@Gagravarr 啊,我怀疑的唯一原因是问题的最后一部分,说明当他使用XSSF时没有问题。他们还要求一种访问xlsx和xls的方法,所以我认为这对他们来说仍然是有用的信息,但我不指望会有任何点赞。 - Shaded

1
无效的头部签名;读取0x342E312D46445025,期望0xE11AB1A1E011CFD0。
当我上传损坏的xls/xlsx文件时(为了上传损坏的文件,我将样本.pdf重命名为样本.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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接