java.lang.IllegalArgumentException: 您的InputStream既不是OLE2流也不是OOXML流。

9
当我读取Excel文件(.xls格式)时,我不断收到一个异常:
java.lang.IllegalArgumentException: Your Input Stream was neither an OLE 2 stream, nor an OOXML stream.

我通过谷歌搜索发现,如果输入流不支持重置或标记,则应使用pushbackStream进行包装。我的输入流不支持标记\重置。
因此,使用pushbackStream是唯一的选择?如何使用它?它有什么用处?
谢谢。

1
你确定你的文件真的是一个Excel .xls文件吗?而不是说,一个扩展名被更改的.csv或.html文件? - Gagravarr
不是,它是一个Excel .xls文件。 - mee
请提供您的SSCCE。 - Michael 'Maik' Ardan
文件也可能为空,就像从InputStream读取失败或所有数据已经被先前读取一样。 - golimar
1个回答

6
Your InputStream was neither an OLE2 stream, nor an OOXML stream
java.lang.IllegalArgumentException: Your InputStream was neither an OLE2 stream, nor an OOXML stream

我猜您正在使用Workbook Factory或不同格式的输入文件和不同类型的工作簿。当无法读取文件类型时,通常会出现此错误。Apache POI不检查文件扩展名。如果您在文本编辑器中打开它,您会发现它实际上是以不同的格式存在的。或者在使用Workbook Factory之前,您可能已将工作簿类型初始化为HSSF或XSSF。
更简单的解决方案是使用Microsoft Excel打开文件,并另存为其他文件(使用Microsoft Excel>菜单中的“文件>保存”选项)。
Workbook Factory不检查文件扩展名,而是检查文件MIME类型。基本上,Excel可以处理不同类型的文件(例如:使用第三方应用程序创建的文件、Excel 2003版本等),但Apache POI则非常特定。
PushbackInputStream向另一个输入流添加了“推回”或“未读取”的功能。这允许您提前几个字节来查看接下来的内容,然后再确定如何解释当前字节。
如果您没有使用Workbook Factory,则我想PushbackInputStream是唯一的选择。
如果您可以在此处共享代码,我可以测试并重新确认。

你的建议对我没有帮助 :( - Andrey E
如果您能详细告诉我错误的情况,我可以帮助您。 - Tejus Prasad
谢谢,但我不记得问题了。我已经解决了! :) - Andrey E
你能提供解决方案吗,@Andrey E? - Labeo
@Labeo 很遗憾,我不记得那个问题以及我是如何解决它的了。如果这个答案没有帮到你,我认为你应该创建一个单独的问题。 或者详细说明你的问题并分享一些代码。 - Andrey E
http://stackoverflow.com/questions/33175608/unable-to-read-excel-files-in-java-getting-2-below-error-in-java - Labeo

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