Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无效的头签名;excel文档上Apache POI的IOException_Java_Apache_Excel_Apache Poi - Fatal编程技术网

Java 无效的头签名;excel文档上Apache POI的IOException

Java 无效的头签名;excel文档上Apache POI的IOException,java,apache,excel,apache-poi,Java,Apache,Excel,Apache Poi,我得到: java.io.IOException:头签名无效;阅读 0x000201060000FFFE,预期0xE11AB1A1E011CFD0 尝试使用apache POI HPSF向Excel文档添加某些自定义属性时 我完全确定这个文件是ExcelOle2(不是HTML、XML或其他Excel不会抱怨的东西) 这是我的代码的相关部分: try { final POIFSFileSystem poifs = new POIFSFileSystem(event.getStream()

我得到:

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

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

我完全确定这个文件是ExcelOle2(不是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)时,我会遇到相同的错误


我完全没有主意,因此非常感谢任何帮助/指点:)

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


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

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

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

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


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

尝试将其直接保存为csv文件,并使用opencsv进行操作。
使用以下链接了解opencsv。

Excel可以打开保存为xls的csv、xls甚至html表格

因此,您可以将该文件保存为file_name.csv,并可以使用opencsv在代码中读取该文件

或者,您可以通过另存为excel 97-2003工作簿在excel中保存该文件一次


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

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

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

我使用的是.xlsx文件而不是.xls文件。如果使用工作簿、工作表和行类,则必须使用.xls文件。
我的文件是.xlsx,它产生了这个问题,我把它改成了.xls,它成功了。

不,我不是手工创建的,我确信它是OLE2。正如我在问题中所说:)“我完全确定该文件是excel OLE2(不是HTML、XML或excel不会抱怨的其他文件)。“我有相同的错误,但只有一个文件,您是否解决了问题?如果您有相同的错误(或类似错误),请确保该文件实际上是excel文件,否则它将不会用POI打开。”。它应该是OLE2格式或DOCX格式。为了确保它是这些格式之一,请在excel中打开文件并从菜单中“另存为”某些excel格式。是否有有效标题签名的说明/值列表?这将有助于识别特定问题,因为我遇到了以下值的类似错误:-读取4503599627764233,预期为-2226271756974174256只有一个有效签名,其他所有内容都不正确。尝试使用ApacheTika来检测文件的真实内容,如果您不知道的话,是否可以进一步扩展这个答案?就目前情况而言,它似乎并没有真正回答最初提出的问题。。。