Quelle est la meilleure API pour lire des feuilles Excel en java - JXL ou Apache POI [fermé]

94

Laquelle des 2 API est la plus simple à lire / écrire / modifier des feuilles Excel? Ces API ne prennent-elles pas en charge 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)

À la fois pour les extensions .xls et .xlsx. La version de Java que j'utilise est: JDK1.6

Swagatika
la source
1
Qu'en est-il: "Quelles API sont disponibles pour lire / écrire des feuilles de calcul Microsoft Excel (JXL, Apache POI, etc.) en Java? Quels sont les meilleurs scénarios pour utiliser chacun d'eux?"
Cléssio Mendes

Réponses:

258

J'ai utilisé à la fois JXL (maintenant "JExcel") et Apache POI . Au début, j'utilisais JXL, mais maintenant j'utilise Apache POI.

Tout d'abord, voici les choses où les deux API ont la même fonctionnalité finale:

  • Les deux sont gratuits
  • Style de cellule: alignement, arrière-plans (couleurs et motifs), bordures (types et couleurs), prise en charge des polices (noms de police, couleurs, taille, gras, italique, barré, souligné)
  • Formules
  • Hyperliens
  • Régions de cellules fusionnées
  • Taille des lignes et des colonnes
  • Formatage des données: nombres et dates
  • Habillage du texte dans les cellules
  • Figer les volets
  • Prise en charge des en-têtes / pieds de page
  • Lire / écrire des feuilles de calcul existantes et nouvelles
  • Les deux tentent de conserver les objets existants dans des feuilles de calcul qu'ils lisent autant que possible.

Cependant, il existe de nombreuses différences:

  • La différence la plus significative est peut-être que Java JXL ne prend pas en charge le format Excel 2007+ ".xlsx"; il ne supporte que l'ancien format BIFF (binaire) ".xls". Apache POI prend en charge les deux avec une conception commune.
  • De plus, la partie Java de l'API JXL a été mise à jour pour la dernière fois en 2009 (il y a 3 ans, 4 mois au moment où j'écris ceci), bien qu'il semble qu'il y ait une API C #. Apache POI est activement maintenu.
  • JXL ne prend pas en charge le formatage conditionnel, contrairement à Apache POI, bien que ce ne soit pas si important, car vous pouvez formater les cellules de manière conditionnelle avec votre propre code.
  • JXL ne prend pas en charge le formatage de texte enrichi , c'est-à-dire un formatage différent dans une chaîne de texte; Apache POI le prend en charge.
  • JXL ne prend en charge que certaines rotations de texte: horizontale / verticale, +/- 45 degrés et empilées; Apache POI prend en charge n'importe quel nombre entier de degrés plus empilés.
  • JXL ne prend pas en charge le dessin de formes; Apache POI le fait.
  • JXL prend en charge la plupart des paramètres de mise en page tels que Paysage / Portrait, Marges, Format papier et Zoom. Apache POI prend en charge tout cela, ainsi que des lignes et des colonnes répétées.
  • JXL ne prend pas en charge les volets séparés; Apache POI le fait.
  • JXL ne prend pas en charge la création ou la manipulation de graphiques; ce support n'est pas encore là dans Apache POI, mais une API commence lentement à se former.
  • Apache POI a un ensemble plus complet de documentation et d'exemples disponibles que JXL.

De plus, POI contient non seulement l'API principale "usermodel", mais également une API basée sur les événements si vous ne voulez que lire le contenu de la feuille de calcul.

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

rgettman
la source
Merci pour l'explication élaborée.
Swagatika
8
+1 pour clair, concis et extrêmement utile
Ron
1
la getContents()méthode sale dans JExcelAPI me fait gagner beaucoup de temps. Avec POI, vous devez vérifier son type de cellule, puis obtenir sa valeur (s'il s'agit d'une cellule numérique, vous devez vérifier si c'est une cellule Date) en fonction de son type, et enfin la convertir en valeur String avec différentes méthodes, c'est tellement gênant. Je ne peux pas imaginer que POI ne propose pas une méthode aussi sale mais pratique que JExcelAPI.
LiuYan 刘 研
1
Une chose très positive si POI est la lecture événementielle. Surtout sur les appareils mobiles (= Android), cela aide beaucoup lorsqu'il s'agit de tailles de tas limitées et de GC. La lecture d'un simple XLS avec JXL atteignait souvent la limite de mémoire de l'application, ce qui provoquait le blocage de l'application.
dermatthias
2
L'un des facteurs importants qui m'a amené à migrer vers POI est la flexibilité d'utiliser l'API Steaming, ce qui est indispensable lorsque vous souhaitez lire Excel avec une énorme quantité de données. Vous ne voudriez pas que les données globales soient chargées en mémoire lorsque vous ouvrez Excel, si les données dans Excel sont énormes. Avec la diffusion en continu, tout le contenu de votre Excel / n'importe quel document Office ne sera pas chargé en mémoire immédiatement après l'analyse de la feuille.
Ashok Koyi
12

J'ai utilisé POI.

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


la source
5

Je ne suis pas familier avec JXL et mais nous utilisons POI. POI est bien entretenu et peut gérer à la fois le format binaire .xls et le nouveau format xml introduit dans Office 2007.

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

Jwesley
la source