问题 标头签名无效;在excel文档上使用Apache POI的IOException


我越来越:

java.io.IOException:标头签名无效;读   0x000201060000FFFE,预期为0xE11AB1A1E011CFD0

尝试使用apache POI HPSF向Excel文档添加一些自定义属性时。

我完全确定该文件是Excel OLE2(不是HTML,XML或Excel不会抱怨的其他内容)。

这是我的代码的相关部分:

try {
     final POIFSFileSystem poifs = new POIFSFileSystem(event.getStream());
     final DirectoryEntry dir = poifs.getRoot();
     final DocumentEntry dsiEntry = (DocumentEntry)
             dir.getEntry(DocumentSummaryInformation.DEFAULT_STREAM_NAME);

     final DocumentInputStream dis = new DocumentInputStream(dsiEntry);
     final PropertySet props = new PropertySet(dis);
     dis.close();
     dsi = new DocumentSummaryInformation(props);
    }
    catch (Exception ex) {
        throw new RuntimeException
            ("Cannot create POI SummaryInformation for event: " + event +
              ", path:" + event.getPath() + 
              ", name:" + event.getPath() +
              ", cause:" + ex);
    }

尝试使用word和power point文件(也是OLE2)时出现同样的错误。

我完全没有想法所以任何帮助/指针都非常感谢:)


12558
2017-09-09 15:14


起源

我有同样的错误,但只有一个文件,你解决了这个问题吗? - Fabio
如果您有相同的错误(或类似),请确保该文件实际上是一个Excel文件,否则它将无法打开POI。它应该是OLE2格式或DOCX。为了确保其中一种格式在excel中打开文件,并从菜单中“另存为”一些excel格式。 - Simeon


答案:


如果您翻转签名号码,您将看到文件开头的字节:

0x000201060000FFFE - > 0xFE 0xFF 0x00 0x00 0x06 0x01 0x02 00

前两个字节看起来像Unicode BOM,0xFEFF表示16位小端。然后你有一些低控制字节,十六进制代码为0然后258然后是2,所以也许它毕竟不是一个文本文件。

该文件确实不是OLE2文件,POI是正确的给你错误。我不知道它是什么,但我猜它也许它可能是OLE2文件的一部分没有它的外部OLE2包装?如果您可以在办公室打开它,请执行save-as和POI应该可以打开它。就目前而言,该标头不是OLE2文件头,因此POI无法为您打开它。


5
2017-08-17 23:32



是否有任何有效标题签名的描述/值列表?这将有助于确定具体问题,因为我遇到了类似的错误,其中包含以下值: - 读取4503599627764233,预计-2226271756974174256 - s khan
只有一个有效签名,其他一切都不正确。如果您不知道,尝试使用Apache Tika来检测您的文件是什么 - Gagravarr


就我而言,该文件是一个保存的CSV文件 .xls 延期。 Excel能够毫无问题地打开它,但POI却没有。

如果我找到更好/更通用的解决方案,我会回来在这里写一下。


5
2017-11-21 20:04



不,我不是手工创建它,我敢肯定它的OLE2。正如我在我的问题中所说:)“我完全确定该文件是excel OLE2(不是HTML,XML或其他不擅长的东西)。” - Simeon
你可以使用opencsv它很棒 sourceforge.net/projects/opencsv - shady sherif


尝试直接将其保存为csv文件并使用 opencsv 为您的运营。
使用以下链接了解opencsv。
http://opencsv.sourceforge.net/#what-is-opencsv

Excel可以打开保存为xls的csv,xls甚至html表。

因此,您可以将文件另存为file_name.csv,并可以使用opencsv读取代码中的文件。

或者你可以通过另存为excel 97-2003工作簿excel文件。

然后,POI本身可以读取文件:-)


1
2018-01-21 07:34



你能再多一点扩展这个答案吗?就目前而言,它似乎并没有回答最初提出的问题...... - Gagravarr


因为您通过Excel 2013保存了文件。另存为excel 97-2003格式的文件。


1
2017-08-14 11:19





我有一个由软件生成的xls文件同样的问题,我被迫用Excel(相同的格式)保存文件,以便能够用apache POI读取。


0
2018-02-04 15:27