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

时间:2010-09-09 15:14:49

标签: 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);
    }

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

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

6 个答案:

答案 0 :(得分: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无法为您打开它。

答案 1 :(得分:5)

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

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

答案 2 :(得分:1)

尝试直接将其另存为csv文件,并使用 opencsv 进行操作 使用以下链接了解opencsv http://opencsv.sourceforge.net/#what-is-opencsv

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

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我使用的是.xlsx文件而不是.xls。如果我们使用Workbook,Sheet和Row类,则必须使用.xls文件。 我的文件是.xlsx,创建了这个问题,然后将其更改为.xls,它可以正常工作。