2010-09-09 25 views
11

Dostaję:Nieprawidłowy podpis nagłówka; IOException z Apache POI w dokumencie Excel

java.io.IOException: Nieprawidłowy podpis nagłówka; czytaj 0x000201060000FFFE oczekuje 0xE11AB1A1E011CFD0

gdy próbuje dodać kilka właściwości niestandardowych do dokumentu programu Excel przy użyciu Apache POI HPSF.

Jestem całkowicie pewien, że plik to Excel OLE2 (nie HTML, XML lub coś innego, na co Excel nie narzeka).

Jest to odpowiednia część mojego kodu:

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

uzyskać ten sam błąd, gdy próbuje słowem i power point plików (również OLE2).

Jestem całkowicie się pomysły więc wszelkie pomoc/wskazówki są bardzo mile widziane :)

+0

Mam ten sam błąd, ale tylko z jednym plikiem, czy rozwiązałeś problem? – Fabio

+0

Jeśli masz ten sam błąd (lub podobny), upewnij się, że plik jest rzeczywiście plikiem Excel, w przeciwnym razie nie otworzy się z POI. Powinien to być format OLE2 lub DOCX. Aby upewnić się, że jeden z tych formatów otworzy plik w programie Excel i "zapisz jako" jakiś format Excela z menu. – Simeon

Odpowiedz

5

Jeśli odwrócić liczbę sygnatur okrągłe, zobaczysz bajty na początku pliku:

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

Pierwsze dwa bajty wyglądać BOM Unicode, 0xFEFF oznacza 16-bitowy mały endian. Następnie masz trochę niskich bajtów kontrolnych, kody szesnastkowe dla 0, a następnie 258, a następnie 2, więc może to nie jest plik tekstowy.

Plik ten naprawdę nie jest plikiem OLE2, a POI ma prawo podać błąd. Nie wiem, co to jest, ale zgaduję, że być może jest to część pliku OLE2 bez jego zewnętrznego opakowania OLE2? Jeśli możesz otworzyć to z biurem, zrób save-as, a POI powinno wystarczyć, aby to otworzyć. W obecnej postaci nagłówek ten nie jest nagłówkiem pliku OLE2, więc POI nie może go otworzyć.

+0

Czy istnieje jakiś opis/lista wartości dla poprawnych podpisów nagłówka? Pomogłoby to zidentyfikować konkretny problem, ponieważ napotkałem podobny błąd z następującymi wartościami: - odczyt 4503599627764233, oczekiwany -2226271756974174256 –

+0

Jest tylko jeden prawidłowy podpis, wszystko inne jest niepoprawne. Spróbuj użyć Apache Tika, aby wykryć, czym naprawdę jest twój plik, jeśli nie wiesz, – Gagravarr

5

W moim przypadku, plik był plik CSV zapisany z rozszerzeniem .xls. Program Excel był w stanie otworzyć go bez problemu, ale POI nie było.

Jeśli znajdę lepsze/bardziej ogólne rozwiązanie, wrócę i zapiszę tutaj.

+0

Nie, nie, nie stworzyłem go ręcznie i jestem pewien, że to OLE2. Jak już powiedziałem w moim pytaniu: "Jestem całkowicie pewny, że plik jest znakomitym OLE2 (nie HTML, XML lub coś innego, na co Excel nie narzeka)." – Simeon

+0

Możesz użyć opencsv to jest świetne http://sourceforge.net/projects/opencsv/ –

1

Spróbuj zapisać jako plik csv bezpośrednio i użyj opencsv dla twoich operacji.
Użyj poniższego linku, aby dowiedzieć się więcej o opencsv.

Program Excel może otworzyć tabelę csv, xls lub nawet html zapisaną jako xls.

Możesz zapisać plik jako plik nazwa_pliku.csv i użyć opencsv do odczytu pliku w kodzie.

Albo możesz raz zrobić plik w programie excel, zapisując As excel 97-2003 skoroszyt.

A potem sama POI można odczytać pliku :-)

+1

Czy możesz rozwinąć tę odpowiedź nieco bardziej? W rzeczywistości nie wydaje się, aby odpowiedzieć na pytanie, które pierwotnie zadano ... – Gagravarr

0

miałem ten sam problem z pliku xls generowany przez oprogramowanie, jestem zmuszony do zapisywania plików z Excela (tym samym formacie), aby móc czytać z apache POI.

0

ponieważ plik został zapisany przez program Excel 2013. Zapisz Jako plik jako format Excel 97-2003.

Powiązane problemy