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

Sim*_*eon 13 java apache excel apache-poi

我越来越:

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);
    }
Run Code Online (Sandbox Code Playgroud)

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

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

Gag*_*arr 6

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

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

就我而言,该文件是使用.xls扩展名保存的CSV文件.Excel能够毫无问题地打开它,但POI却没有.

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