96 votes

Quelle est la meilleure API pour lire des feuilles Excel en Java - JXL ou Apache POI ?

Laquelle de ces deux API est la plus simple pour lire/écrire/modifier des feuilles Excel ? Ces API ne supportent-elles pas les extensions CSV ?

En utilisant JXL pour file.xls et file.xlsx, j'obtiens une exception comme :

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)

Tant pour les extensions .xls que .xlsx. La version de Java que j'utilise est : JDK1.6

261voto

rgettman Points 74908

J'ai utilisé les deux JXL (désormais "JExcel") et POI Apache . Au début, j'ai utilisé JXL, mais maintenant j'utilise Apache POI.

Tout d'abord, voici les éléments pour lesquels les deux API ont la même fonctionnalité finale :

  • Les deux sont gratuits
  • Style des cellules : alignement, arrière-plans (couleurs et motifs), bordures (types et couleurs), support des polices (noms de police, couleurs, taille, gras, italique, barré, souligné)
  • Formules
  • Hyperliens
  • Régions cellulaires fusionnées
  • Taille des lignes et des colonnes
  • Formatage des données : Nombres et dates
  • Habillage du texte dans les cellules
  • Panneaux de congélation
  • Prise en charge des en-têtes et des pieds de page
  • Lecture/écriture de feuilles de calcul existantes et nouvelles
  • Tous deux tentent de garder intacts, dans la mesure du possible, les objets existants dans les feuilles de calcul qu'ils lisent.

Cependant, il existe de nombreuses différences :

  • La différence la plus importante est peut-être que Java JXL ne prend pas en charge le format ".xlsx" d'Excel 2007+ ; il ne prend en charge que l'ancien format BIFF (binaire) ".xls". Apache POI supporte les deux avec une conception commune.
  • En outre, la partie Java de l'API JXL a été mise à jour pour la dernière fois en 2009 (il y a 3 ans et 4 mois au moment où j'écris ces lignes), mais il semble qu'il existe une API C#. Apache POI est activement maintenu.
  • JXL ne supporte pas le formatage conditionnel, Apache POI le fait, bien que cela ne soit pas très significatif, car vous pouvez formater les cellules de manière conditionnelle avec votre propre code.
  • JXL ne supporte pas riche texte le formatage, c'est-à-dire la mise en forme différente d'une chaîne de texte ; Apache POI le prend en charge.
  • JXL ne supporte que certaines rotations de texte : horizontale/verticale, +/- 45 degrés, et empilée ; Apache POI supporte tout nombre entier de degrés plus empilée.
  • JXL ne supporte pas le dessin de formes ; Apache POI le fait.
  • JXL supporte la plupart des paramètres de mise en page tels que Paysage/Portrait, Marges, Taille du papier, et Zoom. Apache POI supporte tous ces paramètres ainsi que la répétition des lignes et des colonnes.
  • JXL ne supporte pas les panneaux divisés ; Apache POI le fait.
  • JXL ne prend pas en charge la création ou la manipulation de graphiques ; cette prise en charge n'existe pas encore dans Apache POI, mais une API commence lentement à se former.
  • Apache POI dispose d'une documentation et d'exemples plus complets que JXL.

En outre, POI contient non seulement l'API principale "usermodel", mais aussi une API basée sur les événements si tout ce que vous voulez faire est de lire le contenu de la feuille de calcul.

En conclusion, en raison de la meilleure documentation, du plus grand nombre de fonctionnalités, du développement actif et du support du format Excel 2007+, j'utilise Apache POI.

13voto

J'ai utilisé le POI.

Si vous utilisez cela, gardez à l'œil ces formateurs de cellules : créez-en un et utilisez-le plusieurs fois au lieu de créer chaque fois une cellule, c'est une énorme différence de consommation de mémoire ou de grandes données.

5voto

jwesley Points 61

Je ne connais pas JXL, mais nous utilisons POI. POI est bien entretenu et peut gérer à la fois le format binaire .xls et le nouveau format xml qui a été introduit dans Office 2007.

Les fichiers CSV ne sont pas des fichiers Excel, mais des fichiers texte, et ces bibliothèques ne les lisent donc pas. Vous devrez analyser vous-même un fichier CSV. Je ne connais pas de bibliothèques de fichiers CSV, mais je n'ai pas cherché non plus.

5voto

Dele Taylor Points 101

Si vous recherchez une API simple, voici un exemple qui utilise mon moteur de migration de données au dessus de Apache POI ou JExcel. Vous pouvez décider du fournisseur à utiliser en passant soit POI, POI_XSSF ou JXL à ExcelDocument avant d'ouvrir le fichier. La valeur par défaut est POI_XSSF (Excel 2007 et supérieur).

http://northconcepts.com/data-pipeline/examples/read-from-an-excel-file/

ExcelDocument document = new ExcelDocument()
  .open(new File("example/data/input/credit-balance-01.xlsx"));

DataReader reader = new ExcelReader(document)
    .setSheetName("credit-balance")
    .setFieldNamesInFirstRow(true);

reader.open();
try {
    Record record;
    while ((record = reader.read()) != null) {
        log.info(record);
    }
} finally {
    reader.close();
}

Pour lire les fichiers .xlsx (Excel 2007+) en utilisant POI :

ExcelDocument document = new ExcelDocument(ProviderType.POI_XSSF)

Pour lire les fichiers .xls (Excel 2003) à l'aide de POI :

ExcelDocument document = new ExcelDocument(ProviderType.POI)

Pour les fichiers .xls utilisant JExcel/JXL :

ExcelDocument document = new ExcelDocument(ProviderType.JXL)

J'espère que cela vous aidera.

1voto

Jerry Oberle Points 43

Pour lire des fichiers CSV "ordinaires" en Java, il existe une bibliothèque appelée OpenCSV, disponible ici : http://opencsv.sourceforge.net/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X