Jaki jest lepszy interfejs API do czytania arkuszy Excela w java - JXL lub Apache POI [zamknięte]

94

Który z 2 interfejsów API jest prostszy do odczytu, zapisu i edycji arkuszy programu Excel? Czy te interfejsy API nie obsługują rozszerzeń CSV?

Używając JXL dla file.xls i file.xlsx, otrzymuję wyjątek, taki jak:

jxl.read.biff.BiffException: Unable to recognize OLE stream
    at jxl.read.biff.CompoundFile.<init>(CompoundFile.java:116)
    at jxl.read.biff.File.<init>(File.java:127)
    at jxl.Workbook.getWorkbook(Workbook.java:268)
    at core.ReadXLSheet.contentReading(ReadXLSheet.java:46)
    at core.ReadXLSheet.init(ReadXLSheet.java:22)
    at core.ReadXLSheet.main(ReadXLSheet.java:72)

Zarówno dla rozszerzeń .xls, jak i .xlsx. Używana przeze mnie wersja Java to: JDK1.6

Swagatika
źródło
1
A co z: „Które interfejsy API są dostępne do odczytu / zapisu arkuszy kalkulacyjnych Microsoft Excel (JXL, Apache POI itp.) W Javie? Jakie są najlepsze scenariusze wykorzystania każdego z nich?”
Cléssio Mendes

Odpowiedzi:

258

Użyłem zarówno JXL (teraz „JExcel”), jak i Apache POI . Na początku korzystałem z JXL, ale teraz używam Apache POI.

Po pierwsze, oto rzeczy, w których oba interfejsy API mają tę samą funkcjonalność końcową:

  • Oba są bezpłatne
  • Stylizacja komórek: wyrównanie, tła (kolory i wzory), obramowania (typy i kolory), obsługa czcionek (nazwy czcionek, kolory, rozmiar, pogrubienie, kursywa, przekreślenie, podkreślenie)
  • Formuły
  • Hiperłącza
  • Połączone regiony komórkowe
  • Rozmiar wierszy i kolumn
  • Formatowanie danych: liczby i daty
  • Zawijanie tekstu w komórkach
  • Zablokuj okienka
  • Obsługa nagłówków / stopek
  • Odczytywanie / zapisywanie istniejących i nowych arkuszy kalkulacyjnych
  • Obaj starają się zachować istniejące obiekty w czytanych arkuszach kalkulacyjnych w jak największym stopniu nienaruszone.

Istnieje jednak wiele różnic:

  • Być może najbardziej znaczącą różnicą jest to, że Java JXL nie obsługuje formatu „.xlsx” programu Excel 2007+; obsługuje tylko stary format BIFF (binarny) „.xls”. Apache POI obsługuje oba te elementy w ramach wspólnego projektu.
  • Dodatkowo część Java JXL API została ostatnio zaktualizowana w 2009 roku (3 lata, 4 miesiące temu, kiedy to piszę), chociaż wygląda na to, że istnieje C # API. Apache POI jest aktywnie utrzymywany.
  • JXL nie obsługuje formatowania warunkowego, Apache POI tak, chociaż nie jest to aż tak istotne, ponieważ można warunkowo formatować komórki własnym kodem.
  • JXL nie obsługuje bogaty tekst formatowania, tj innego formatowania w ciągu tekstowym; Apache POI to obsługuje.
  • JXL obsługuje tylko niektóre obroty tekstu: poziome / pionowe, +/- 45 stopni i ułożone; Apache POI obsługuje dowolną liczbę całkowitą stopni oraz stos.
  • JXL nie obsługuje rysowania kształtów; Apache POI tak.
  • JXL obsługuje większość ustawień strony, takich jak pozioma / pionowa, marginesy, rozmiar papieru i powiększenie. Apache POI obsługuje to wszystko plus powtarzające się wiersze i kolumny.
  • JXL nie obsługuje Split Panes; Apache POI tak.
  • JXL nie obsługuje tworzenia ani manipulacji wykresami; tego wsparcia jeszcze nie ma w Apache POI, ale API powoli zaczyna się tworzyć.
  • Apache POI ma szerszy zestaw dokumentacji i przykładów niż JXL.

Ponadto POI zawiera nie tylko główny interfejs API „model użytkownika”, ale także interfejs API oparty na zdarzeniach, jeśli wszystko, co chcesz zrobić, to przeczytać zawartość arkusza kalkulacyjnego.

Podsumowując, ze względu na lepszą dokumentację, więcej funkcji, aktywny rozwój i obsługę formatu Excel 2007+, używam Apache POI.

rgettman
źródło
Dzięki za szczegółowe wyjaśnienie.
Swagatika,
8
+1 za jasne, zwięzłe i niezwykle pomocne
Ron
1
brudna getContents()metoda w JExcelAPI oszczędza mi dużo czasu. W przypadku POI musisz sprawdzić typ komórki, a następnie pobrać jej wartość (jeśli jest to komórka numeryczna, musisz sprawdzić, czy jest to komórka typu Date) zgodnie z jej typem, a na koniec przekonwertować ją na wartość String różnymi metodami, to jest tak niewygodne. Nie mogę sobie wyobrazić, że POI nie zapewnia tak brudnej, ale wygodnej metody, jak robi to JExcelAPI.
LiuYan 刘 研
1
Bardzo pozytywna rzecz, jeśli POI jest czytaniem opartym na wydarzeniach. Szczególnie na urządzeniach mobilnych (= Android), jest to bardzo pomocne w przypadku ograniczonych rozmiarów sterty i GC. Czytanie prostego XLS z JXL często osiągało limit pamięci aplikacji, powodując awarię aplikacji.
dermatthias
2
Jednym z ważnych czynników, który skłonił mnie do migracji do POI, jest elastyczność korzystania z parowego interfejsu API, co jest koniecznością, gdy chcesz czytać Excel z ogromną ilością danych. Nie chciałbyś, aby dane wole były ładowane do pamięci po otwarciu programu Excel, jeśli dane w programie Excel są ogromne. Dzięki przesyłaniu strumieniowemu cała zawartość Twojego programu Excel / dowolnego dokumentu biurowego nie zostanie załadowana do pamięci natychmiast po przeanalizowaniu arkusza.
Ashok Koyi
12

Użyłem POI.

Jeśli używasz tego, miej oko na te elementy formatujące komórki: utwórz jeden i używaj go kilka razy, zamiast tworzyć za każdym razem dla komórki, jest to ogromna różnica w zużyciu pamięci lub duże dane.


źródło
5

Nie znam JXL, ale używamy POI. Punkt POI jest dobrze utrzymany i może obsługiwać zarówno binarny format xls, jak i nowy format oparty na XML, który został wprowadzony w pakiecie Office 2007.

Pliki CSV nie są plikami programu Excel, są to pliki tekstowe, więc te biblioteki ich nie czytają. Będziesz musiał samodzielnie przeanalizować plik CSV. Nie znam żadnych bibliotek plików CSV, ale też nie szukałem.

jwesley
źródło