繁体   English   中英

Apache POI HSSF XLS读取错误

[英]Apache POI HSSF XLS reading error

在.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,则可能会出现此错误。 我会尝试使用通用的Workbook对象(也称为SS Usermodel)

查看Workbook界面WorkbookFactory对象 工厂应该能够从xlsx或xls中为您创建通用工作簿。

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

编辑

我在Apache的网站上发现了一个关于使用SS Usermodel进行阅读和重写的小小片段

我希望这有帮助!

标头签名无效; 读取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
}

您获得的异常是告诉您,您提供的文件不是有效的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等),并且还允许您将其重新保存为正确的.xls文件以供POI加载和与...合作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM