我得到了:
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)时出现同样的错误。
我完全没有想法所以任何帮助/指针都非常感激:)
答案 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,它可以正常工作。