2012-05-28 259 views
2

使用下面的代码,而在一个.xls文件,其中s是文件目录阅读:的Apache POI HSSF XLS读数误差

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

创建'input'或'wbs'变量时发生异常? –

回答

1

如果文件是xlsx格式而不是xls,则可能会出现此错误。我会尝试使用通用工作簿对象(也称为SS Usermodel)

检查出Workbook interfaceWorkbookFactory object。工厂应该能够为xlsx或xls创建一个通用工作簿。

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

编辑

我发现this little tiny snippet从Apache的网站的阅读与使用SS的usermodel改写。

我希望这有助于!

+1

如果您将.xlsx文件提供给HSSF,则至少在最近的版本中不会出现此错误,您将得到一个特定的通知,告知您您的错误。这是POI不知道的一般错误... – Gagravarr

+0

@Gagravarr Ahh我怀疑这个唯一原因是因为问题的最后部分,他说当他使用XSSF时没有问题。他们还要求一种方式来访问xlsx和xls,所以我认为这对他们来说仍然是一个很好的信息,但我不会期待任何upvotes。 – Shaded

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 
} 
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 tool,它可以从这些古代格式中提取一些信息。

否则,与此类型的所有例外情况一样,请尝试在Excel中打开文件并执行另存为。这会让你知道目前的文件是什么(例如,.html保存为.xls,.csv保存为.xls等),并且还可以让你重新保存为一个正确的.xls文件,以便POI加载和与...合作。

相关问题