Overview Présentation

There are two good choices for reading & writing Microsoft Excel Spreadsheet files from Java, in a platform independent way, - jexcelapi and Jakarta POI (HSSF) . Il ya deux bons choix pour la lecture et l'écriture Feuille de calcul Microsoft Excel fichiers de Java, dans une plate-forme de manière indépendante, - jexcelapi et Jakarta POI (HSSF). Both of them provide nice interface to access Excel data structure and even generate new spreadsheet. Deux d'entre eux fournir jolie interface pour accéder à la structure de données Excel et même de générer de nouvelles feuille de calcul. I have done extensive tests with both of them for a high-profile project for a Fortune 500 company. J'ai effectué des tests avec deux d'entre eux pour un profil de haut-projet pour une société Fortune 500. Previously also I had successfully used HSSF for another high profile client. Auparavant, j'avais aussi utilisé avec succès HSSF pour un autre client de haut niveau. In the paragraphs below I present my conclusions and sample code for reading Excel spreadsheet from Java using both the libraries. Dans les paragraphes qui suivent je présente mes conclusions et des exemples de code pour la lecture de feuille de calcul Excel de Java en utilisant à la fois les bibliothèques.

Comparison of JExcelAPI with Jakarta-POI (HSSF) Comparaison des JExcelAPI avec Jakarta-POI (HSSF)

1. JExcelAPI is clearly not suitable for important data. est de toute évidence ne convient pas pour les données importantes. It fails to read several files. Il ne parvient pas à lire plusieurs fichiers. Even when it reads it fails on cells for unknown reasons. Même quand il lit, il ne parvient pas sur les cellules pour des raisons inconnues. In short JExcelAPI isn’t suitable for enterprise use. En bref JExcelAPI n'est pas adapté pour les entreprises.

2. HSSF is the POI Project’s pure Java implementation of the Excel ‘97(-2002) file format. est le POI du projet pur Java application de la Excel'97 (-2002) format de fichier. It is a mature product and was able to correctly and effortlessly read excel data generated from various sources, including non-MS Excel products like Open Office, and for various versions of Excel. Il s'agit d'un produit mûr et a pu correctement et sans effort lire exceller données provenant de diverses sources, y compris les non-MS Excel produits tels que Open Office, et pour différentes versions d'Excel. It is very robust and well featured. Il est très robuste et bien décrite. Highly recommended. Highly recommended.

3. Performance was never a consideration in our tests because a) data integrity is the single most important factor and b) there didn’t appear to be any significant performance difference while running the tests; both of them were very fast. Performance n'a jamais été pris en considération pour nos tests parce que a) l'intégrité des données est le facteur le plus important et b) il ne semblait pas y avoir de différence de performance significative lors de l'exécution des essais, tous deux d'entre eux ont été très rapide. We didn’t bother to time it for the above reasons. Nous n'avons pas pris la peine de temps pour les raisons ci-dessus.

How to read Excel Excel Spreadsheet from Java using Jakarta POI (HSSF) Comment lire la feuille de calcul Excel Excel de Java en utilisant Jakarta POI (HSSF)

 try {     POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream( file ));     HSSFWorkbook wb = new HSSFWorkbook(fs);     HSSFSheet sheet = wb.getSheetAt(0);     HSSFRow row;     HSSFCell cell;      int rows; // No of rows     rows = sheet.getPhysicalNumberOfRows();      int cols = 0; // No of columns     int tmp = 0;      // This trick ensures that we get the data properly even if it doesn’t start from first few rows     for(int i = 0; i < 10 || i < rows; i++) {         row = sheet.getRow(i);         if(row != null) {             tmp = sheet.getRow(i).getPhysicalNumberOfCells();             if(tmp > cols) cols = tmp;         }     }      for(int r = 0; r < rows; r++) {         row = sheet.getRow(r);         if(row != null) {             for(int c = 0; c < cols; c++) {                 cell = row.getCell((short)c);                 if(cell != null) {                     // Your code here                 }             }         }     } } catch(Exception ioe) {     ioe.printStackTrace(); } try (POIFSFileSystem fs = new POIFSFileSystem (nouveau FileInputStream (fichier)); HSSFWorkbook wb = new HSSFWorkbook (fs); HSSFSheet fiche = wb.getSheetAt (0); HSSFRow ligne; HSSFCell cellule; int lignes / / n ° de lignes lignes = sheet.getPhysicalNumberOfRows (); int cols = 0; / / n ° de colonnes int tmp = 0; / / Cette astuce assure que nous obtenons les données correctement, même si elle ne démarre pas de la première quelques lignes for (int i = 0; i <10 | | i <rows; i + +) (row = sheet.getRow (i); if (row! = null) (tmp = sheet.getRow (i). getPhysicalNumberOfCells (); if (tmp> cols) cols = tmp;)) for (int r = 0; r <lignes; r + +) (row = sheet.getRow (r); if (row! = null) (for (int c = 0, c <cols, c + +) (cellule Row.getCell = ((courte) c), si (cellulaire! = Null) (/ / Votre code ici))))) catch (Exception OIE) (ioe.printStackTrace ();) 

This sample should get you started. Cet échantillon devrait vous aider à démarrer. Don’t forget to import appropriately. Ne pas oublier d'importer de façon appropriée.

Gotchas while using Jakarta POI (HSSF) Pièges courants lors de l'utilisation de Jakarta POI (HSSF)

  • getPhysicalNumberOfRows() returns the physical number of rows which may be more than the actual (logical) number of rows. getPhysicalNumberOfRows () retourne le nombre physique de lignes qui mai être plus de la réalité (logique) le nombre de lignes. The same goes for getPhysicalNumberOfCells(). Il en va de même pour getPhysicalNumberOfCells ().
  • You should check for nulls when fetching the HSSFRow and HSSFCell objects as shown. Vous devriez vérifier pour NULL lors de la récupération et la HSSFRow objets HSSFCell comme illustré.
  • Remember that Excel tables are often sparsely populated. Souvenez-vous que les tableaux Excel sont souvent à faible densité de population. So choose your data structures accordingly. Ainsi, choisir la structure de vos données en conséquence.
  • POI accesses the data by sheet. POI accède à la fiche de données. In JExcelAPI you can directly access the data in any row and column. En JExcelAPI vous pouvez directement accéder aux données en ligne et une colonne.

How to access Excel Spreadsheet using JExcelAPI Comment accéder à la feuille de calcul Excel en utilisant JExcelAPI

 File fp = new File(file); try {     Workbook wb = Workbook.getWorkbook(fp);     Sheet sheet = wb.getSheet(0);     int columns = sheet.getColumns();     int rows = sheet.getRows();      String data;     for(int col = 0;col < columns;col++) {         for(int row = 0;row < rows;row++) {             data = sheet.getCell(col, row).getContents();             // Your code here         }     } } catch(Exception ioe) {     System.out.println("Error: " + ioe); } Dossier fp = new File (fichier); try (Workbook wb = Workbook.getWorkbook (fp); Fiche fiche = wb.getSheet (0); int colonnes = sheet.getColumns (); int rows = sheet.getRows (); String données for (int col = 0; col <colonnes; col + +) (for (int row = 0; ligne <lignes; ligne + +) (data = sheet.getCell (col, ligne). getContents () / / Votre code ici ))) Catch (Exception OIE) (System.out.println ( "Erreur:" + OIE);) 

Gotchas while using JExcelAPI Pièges en utilisant JExcelAPI

  • JExcelAPI may often fail to fetch the data from certain cells or even the whole sheet. JExcelAPI mai souvent ne parviennent pas à récupérer les données de certaines cellules ou même l'ensemble fiche. Unfortunately it gives a warning instead of an error to indicate the problem. Malheureusement, il donne un avertissement au lieu d'une erreur d'indiquer le problème.
  • JExcelAPI doesn’t expose the full meta-data of the spreadsheet like POI does. JExcelAPI ne pas exposer la pleine méta-données de la feuille de calcul comme POI ne.
  • JExcelAPI doesn’t properly recognize the data type in cells. JExcelAPI ne pas reconnaître le type de données dans les cellules. In all cases it indicated String data in our tests even when there were numeric or date fields. Dans tous les cas, il a indiqué String données dans nos essais, même quand il y avait numérique ou les champs de date.

Concluding thoughts on accessing Excel spreadsheets from Java Conclusions réflexions sur l'accès aux feuilles de calcul Excel de Java

Both JExcelAPI and Jakarta POI (HSSF) are open source software to read & write data from / to Excel spreadsheet even on non-Microsoft platforms. Les deux JExcelAPI et Jakarta POI (HSSF) sont open source logiciel pour lire et écrire des données depuis / vers Excel même feuille de calcul sur la non-plates-formes de Microsoft. In my tests HSSF came out to be the clear leader and recommended solution because of robustness and features. Dans mes tests HSSF est venu à être le leader et la solution recommandée en raison de la robustesse et ses caractéristiques.