2013-04-25 11 views
8

Kiedy czytam plik programu Excel (format .xls), wciąż otrzymuję wyjątek:java.lang.IllegalArgumentException: Twój InputStream było ani strumień OLE2, ani strumień OOXML

java.lang.IllegalArgumentException: Your Input Stream was neither an OLE 2 stream, nor an OOXML stream. 

I Go- ogled i odkrył, że jeśli strumień wejściowy nie obsługuje resetowania ani oznaczania, powinienem go opakować pushbackStream. Mój strumień wejściowy nie jest znakiem \ reset obsługiwany.

Czy użycie opcji pushbackStream jest jedyną opcją? Jak tego użyć? I jaki jest pożytek z tego?

Dzięki

+1

Czy jesteś pewien, że plik rzeczywiście jest plikiem .xls programu Excel? I nie, powiedzmy, zmieniono plik .csv lub .html z rozszerzeniem? – Gagravarr

+0

Nie, jest to plik .xls w formacie Excel. – mee

+0

Proszę podać swoją SSCCE. –

Odpowiedz

4
Your InputStream was neither an OLE2 stream, nor an OOXML stream 
java.lang.IllegalArgumentException: Your InputStream was neither an OLE2 stream, nor an OOXML stream 

Chyba używasz skoroszytu fabryki lub innego formatu pliku wejściowego i innego rodzaju plików. Ten błąd zwykle pojawia się, gdy nie jest w stanie odczytać tego typu pliku. Apache POI nie sprawdza rozszerzenia pliku. Jeśli otworzysz go w edytorze tekstowym, zobaczysz, że będzie on w innym formacie. Lub możesz zainicjować typ skoroszytu do HSSF lub XSSF, przed użyciem Workbook Factory.

Prostsze rozwiązanie jest, aby otworzyć plik za pomocą programu Microsoft Excel i zapisać go jako innego pliku (przy użyciu Plik> Zapisz Jako opcja z Microsoft Excel > Menu).

Skoroszyt Fabryka nie sprawdza rozszerzenia pliku, zamiast tego sprawdza typ MIME pliku. Zasadniczo excel działa z różnymi plikami (np. Pliki utworzone za pomocą aplikacji firm trzecich, wersja excel 2003), ale Apache POI jest bardzo specyficzny.

PushbackInputStream dodaje funkcję "wypychania" lub "nieprzeczytania" do innego strumienia wejściowego. Pozwala ci przeczytać przed sobą kilka bajtów, aby zobaczyć, co nadchodzi, zanim będziesz mógł określić, jak interpretować bieżący bajt.

Jeśli nie używasz Workbook Factory, PushbackInputStream jest jedyną alternatywą, jak sądzę.

Jeśli możesz udostępnić kod tutaj, mogę go przetestować i potwierdzić ponownie.

+0

Twoja sugestia nie pomoże mi :( –

+0

Mogę pomóc, jeśli możesz powiedzieć mi o błędzie w szczegółach. –

+0

Ty, ale nie pamiętam problemu, rozwiązałem go! :) –