标头签名无效;IOException with Apache POI on excel document

2022-09-03 14:53:04

我得到:

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);
    }

我在尝试使用单词和PowerPoint文件(也是OLE2)时收到相同的错误。

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


答案 1

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

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

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

该文件确实不是 OLE2 文件,POI 是正确的,可以为您提供错误。我不知道它是什么,但我猜它可能是OLE2文件的一部分,没有它的外部OLE2包装器?如果您可以使用office打开它,请执行另存为,POI应该可以打开它。就目前而言,该标头不是OLE2文件标头,因此POI无法为您打开它。


答案 2

在我的情况下,该文件是与扩展名一起保存的CSV文件。Excel能够毫无问题地打开它,但POI不是。.xls

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


推荐