2010-09-09 12 views
11

Ich erhalte:Ungültige Header-Signatur; IOException mit Apache POI auf Excel-Dokument

java.io.IOException: Ungültige Header-Signatur; 0x000201060000FFFE lesen, erwartet 0xE11AB1A1E011CFD0

wenn einige benutzerdefinierte Eigenschaften in ein Excel-Dokument hinzuzufügen versuchen, Apache POI HPSF verwenden.

Ich bin mir absolut sicher, dass die Datei Excel OLE2 ist (nicht HTML, XML oder etwas anderes, über das sich Excel nicht beschwert).

Dies ist ein relevanter Teil meines Code:

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

ich den gleichen Fehler, wenn sie mit Wort und Powerpoint-Dateien (auch OLE2) versuchen.

Ich bin völlig aus Ideen so dass jede Hilfe/Zeiger sehr geschätzt werden :)

+0

Ich habe den gleichen Fehler, aber nur mit einer Datei, haben Sie das Problem gelöst? – Fabio

+0

Wenn Sie denselben Fehler (oder einen ähnlichen Fehler) haben, stellen Sie sicher, dass die Datei tatsächlich eine Excel-Datei ist, andernfalls wird sie nicht mit POI geöffnet. Es sollte entweder OLE2-Format oder DOCX sein. Um sicher zu sein, eines seiner Formate öffnen Sie die Datei in Excel und 'Speichern unter' einige Excel-Format aus dem Menü. – Simeon

Antwort

5

Wenn Sie die Signaturnummer Runde drehen, werden Sie das Bytes des Beginns Ihrer Datei sehen:

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

Die ersten beiden Bytes aussehen eine Unicode-Stückliste, 0xFEFF bedeutet 16 Bit Little Endian. Sie haben dann einige niedrige Kontrollbytes, die Hex-Codes für 0, dann 258 und dann 2, also ist es vielleicht doch keine Textdatei.

Diese Datei ist wirklich keine OLE2-Datei, und POI ist richtig, um Ihnen den Fehler zu geben. Ich weiß nicht, was es ist, aber ich vermute, dass es vielleicht Teil einer OLE2-Datei ohne OLE2-Wrapper sein könnte? Wenn Sie es mit dem Büro öffnen können, machen Sie ein Speichern-wie und POI sollte in Ordnung sein, um das zu öffnen. So wie es aussieht, ist dieser Header kein OLE2-Dateikopf, daher kann POI ihn nicht für Sie öffnen.

+0

Gibt es eine Beschreibung/Liste von Werten für gültige Header-Signaturen? Das würde helfen, das spezifische Problem zu identifizieren, als ich einen ähnlichen Fehler mit folgenden Werten fand: - gelesen 4503599627764233, erwartet -2226271756974174256 –

+0

Es gibt nur eine gültige Unterschrift, alles andere ist falsch. Versuchen Sie, Apache Tika zu verwenden, um zu erkennen, was Ihre Datei wirklich ist, wenn Sie nicht wissen – Gagravarr

5

In meinem Fall war die Datei eine CSV-Datei mit der .xls Erweiterung gespeichert. Excel konnte es problemlos öffnen, POI jedoch nicht.

Wenn ich eine bessere/allgemeinere Lösung finde, komme ich zurück und schreibe es hier auf.

+0

Nein, ich habe es nicht von Hand erstellt und ich bin sicher, dass es OLE2 ist. Wie ich in meiner Frage gesagt habe :) "Ich bin mir absolut sicher, dass die Datei Excel OLE2 ist (nicht HTML, XML oder etwas anderes, das sich nicht auszeichnet)." – Simeon

+0

Sie können opencsv verwenden es ist großartig http://sourceforge.net/projects/opencsv/ –

1

Versuchen Sie, speichern Sie es als CSV-Datei direkt und verwenden Sie opencsv für Ihre Operationen.
Verwenden Sie den folgenden Link, um über opencsv zu wissen.
http://opencsv.sourceforge.net/#what-is-opencsv

Excel kann eine CSV-, XLS- oder sogar HTML-Tabelle öffnen, die als XLS gespeichert wird.

So können Sie die Datei als file_name.csv speichern und opencsv zum Lesen der Datei in Ihrem Code verwenden.

Oder Sie können die Datei einmal in Excel durch Speichern als Excel 97-2003 Arbeitsmappe.

Und dann, POI selbst kann die Datei :-)

+1

Können Sie diese Antwort ein wenig mehr erweitern? Wie es aussieht, scheint es die Frage, die ursprünglich gestellt wurde, nicht wirklich zu beantworten ... – Gagravarr

0

ich mit einer xls-Datei von der Software erzeugt hatte das gleiche Problem gelesen, ich bin gezwungen, Dateien mit Excel zu speichern (das gleiche Format) in der Lage sein Lesen Sie mit Apache POI.

0

weil Sie Ihre Datei von Excel 2013 gespeichert. Speichern Sie als Ihre Datei als Excel 97-2003-Format.