Was ist die bessere API zum Lesen von Excel-Tabellen in Java - JXL oder Apache POI [geschlossen]

94

Welche der beiden APIs ist einfacher zu lesen, zu schreiben und zu bearbeiten? Unterstützen diese APIs keine CSV-Erweiterungen?

Wenn ich JXL für file.xls und file.xlsx verwende, erhalte ich eine Ausnahme wie:

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)

Sowohl für XLS- als auch XLSX-Erweiterungen. Die von mir verwendete Java-Version lautet: JDK1.6

Swagatika
quelle
1
Was ist mit: "Welche APIs gibt es zum Lesen / Schreiben von Microsoft Excel-Tabellen (JXL, Apache POI usw.) in Java? Was sind die besten Szenarien, um sie zu verwenden?"
Cléssio Mendes

Antworten:

258

Ich habe sowohl JXL (jetzt "JExcel") als auch Apache POI verwendet . Zuerst habe ich JXL verwendet, jetzt verwende ich Apache POI.

Hier sind die Dinge, bei denen beide APIs dieselbe Endfunktionalität haben:

  • Beide sind kostenlos
  • Zellenstil: Ausrichtung, Hintergründe (Farben und Muster), Rahmen (Typen und Farben), Schriftunterstützung (Schriftnamen, Farben, Größe, Fett, Kursiv, Strikeout, Unterstreichung)
  • Formeln
  • Hyperlinks
  • Zusammengeführte Zellregionen
  • Größe der Zeilen und Spalten
  • Datenformatierung: Zahlen und Daten
  • Textumbruch in Zellen
  • Scheiben einfrieren
  • Kopf- / Fußzeilenunterstützung
  • Vorhandene und neue Tabellen lesen / schreiben
  • Beide versuchen, vorhandene Objekte in Tabellen, die sie einlesen, so weit wie möglich intakt zu halten.

Es gibt jedoch viele Unterschiede:

  • Der vielleicht bedeutendste Unterschied besteht darin, dass Java JXL das Excel 2007+ ".xlsx" -Format nicht unterstützt. Es wird nur das alte BIFF-Format (binär) ".xls" unterstützt. Apache POI unterstützt beide mit einem gemeinsamen Design.
  • Darüber hinaus wurde der Java-Teil der JXL-API zuletzt im Jahr 2009 aktualisiert (vor 3 Jahren, 4 Monaten, als ich dies schreibe), obwohl es anscheinend eine C # -API gibt. Der Apache-POI wird aktiv gepflegt.
  • JXL unterstützt die bedingte Formatierung nicht, Apache POI jedoch, obwohl dies nicht so wichtig ist, da Sie Zellen bedingt mit Ihrem eigenen Code formatieren können.
  • JXL unterstützt keine Rich- Text- Formatierung, dh keine andere Formatierung innerhalb einer Textzeichenfolge. Apache POI unterstützt dies.
  • JXL unterstützt nur bestimmte Textdrehungen: horizontal / vertikal, +/- 45 Grad und gestapelt; Apache POI unterstützt eine beliebige Ganzzahl von Grad plus gestapelt.
  • JXL unterstützt das Zeichnen von Formen nicht. Apache POI tut.
  • JXL unterstützt die meisten Einstellungen für die Seiteneinrichtung wie Querformat / Hochformat, Ränder, Papierformat und Zoom. Apache POI unterstützt all das sowie das Wiederholen von Zeilen und Spalten.
  • JXL unterstützt keine geteilten Fenster. Apache POI tut.
  • JXL unterstützt das Erstellen oder Bearbeiten von Diagrammen nicht. Diese Unterstützung ist in Apache POI noch nicht vorhanden, aber eine API beginnt sich langsam zu bilden.
  • Apache POI verfügt über eine umfangreichere Dokumentation und Beispiele als JXL.

Darüber hinaus enthält POI nicht nur die Haupt-API "usermodel", sondern auch eine ereignisbasierte API, wenn Sie nur den Tabelleninhalt lesen möchten.

Zusammenfassend kann ich sagen, dass ich aufgrund der besseren Dokumentation, der größeren Funktionen, der aktiven Entwicklung und der Unterstützung des Excel 2007+ -Formats Apache POI verwende.

rgettman
quelle
Danke für die ausführliche Erklärung.
Swagatika
8
+1 für klar, prägnant und äußerst hilfreich
Ron
1
Die schmutzige getContents()Methode in JExcelAPI spart mir viel Zeit. Bei POI müssen Sie den Zelltyp überprüfen und dann den Wert (wenn es sich um eine numerische Zelle handelt, müssen Sie überprüfen, ob es sich um eine Datumszelle handelt) entsprechend dem Typ abrufen und ihn schließlich mit verschiedenen Methoden in einen String-Wert konvertieren. Das ist so unpraktisch. Ich kann mir nicht vorstellen, dass POI keine so schmutzige, aber bequeme Methode bietet wie JExcelAPI.
LiuYan
1
Eine sehr positive Sache, wenn POI das ereignisbasierte Lesen ist. Insbesondere auf Mobilgeräten (= Android) hilft dies sehr, wenn es um begrenzte Heap-Größen und GC geht. Das Lesen eines einfachen XLS mit JXL erreichte häufig das Speicherlimit der App und führte zum Absturz der App.
Dermatthias
2
Einer der wichtigen Faktoren, die mich zur Migration auf POI veranlasst haben, ist die Flexibilität bei der Verwendung der Steaming-API, die ein Muss ist, wenn Sie Excel mit einer großen Datenmenge lesen möchten. Sie möchten nicht, dass die gesamten Daten beim Öffnen des Excel in den Speicher geladen werden, wenn die Daten im Excel sehr groß sind. Beim Streaming wird der gesamte Inhalt Ihres Excel- / Office-Dokuments nicht sofort nach dem Parsen des Blattes in den Speicher geladen.
Ashok Koyi
12

Ich habe POI verwendet.

Wenn Sie dies verwenden, behalten Sie diese Zellenformatierer im Auge: Erstellen Sie einen und verwenden Sie ihn mehrmals, anstatt jedes Mal für eine Zelle zu erstellen. Dies ist ein großer Unterschied im Speicherverbrauch oder große Datenmengen.


quelle
5

Ich bin mit JXL nicht vertraut und wir verwenden POI. Der POI ist gut gepflegt und kann sowohl das binäre XLS-Format als auch das neue XML-basierte Format verarbeiten, das in Office 2007 eingeführt wurde.

CSV-Dateien sind keine Excel-Dateien, sondern textbasierte Dateien, sodass diese Bibliotheken sie nicht lesen. Sie müssen eine CSV-Datei selbst analysieren. Mir sind keine CSV-Dateibibliotheken bekannt, aber ich habe auch nicht nachgesehen.

Jwesley
quelle
1

Zum Lesen von "einfachen" CSV-Dateien in Java gibt es eine Bibliothek namens OpenCSV, die hier verfügbar ist: http://opencsv.sourceforge.net/

Jerry Oberle
quelle
3
Apache hat jetzt auch ein Commons-Angebot für CSV: commons.apache.org/proper/commons-csv . Es funktioniert ziemlich gut und hat diese schöne Marke.
Trognanders