Database
 sql >> Base de données >  >> RDS >> Database

Comment créer un document Excel à partir d'un programme Java à l'aide d'Apache POI

Le point d'intérêt Apache est une bibliothèque open source populaire utilisée pour lire, écrire et manipuler des fichiers MS Office et Open Office à l'aide de code Java. La bibliothèque est l'un des nombreux produits open source gérés par Apache Software Foundation (ASF) a contribué à la communauté Java. La bibliothèque contient des classes et des méthodes pour décoder les formats de fichiers basés sur les standards Open Office XML et Microsoft OLE2. Bien que la bibliothèque soit capable de manipuler des fichiers Word, des feuilles de calcul Excel et des fichiers PowerPoint, cet article se concentre principalement sur les feuilles de calcul, uniquement pour être bref.

Apprenez JAVA et commencez votre essai gratuit dès aujourd'hui !

La bibliothèque de points d'intérêt Apache

Curieusement, dans le nom Apache POI, le POI signifie "Poor Obfuscation Implementation" et l'objectif de la bibliothèque est de fournir des API Java pour manipuler divers formats de fichiers basés sur les normes Office Open XML (OOXML) et le format de document composé OLE 2 de Microsoft. (OLE2). En bref, cela permet de lire et d'écrire des fichiers MS Excel, MS Word et MS PowerPoint en utilisant du code Java. La plupart des fichiers Microsoft Office, tels que les formats de fichier basés sur l'API de sérialisation XLS, DOC, PPT et MFC, sont basés sur la norme OLE2. L'OLE, en gros, est une technique propriétaire développée par Microsoft et fournit le format pour lier des objets et incorporer des objets dans des documents conteneurs. Le premier format est appelé format OLE1.0 dans lequel l'objet lié et les données de l'objet incorporé sont disposés sous la forme d'une séquence d'octets dans le document conteneur. La deuxième version, le format OLE2.0, exploite la technologie de fichiers composés OLE (MS-CFB) où l'objet lié ou les données d'objets incorporés sont contenus dans ce stockage sous la forme d'objets OLE Compound File Stream. Reportez-vous aux formats OLE1.0 et OLE2.0 pour plus de détails à ce sujet. La bibliothèque Apache POI fournit des API de bibliothèque pour le système de fichiers OLE2 appelé POIFS et des propriétés de document OLE2 appelées HPSF.

Composants de points d'intérêt Apache

La bibliothèque Apache POI fournit des classes et des méthodes pour travailler avec les documents composés OLE2 de MS Office. Voici un bref aperçu des plus couramment utilisés :

  • POIFS pour les documents OLE2 :POIFS signifie Poor Obfuscation Implementation File System . Il s'agit de l'élément POI de base implémenté dans la bibliothèque pour porter le document composé OLE2. Il prend en charge les fonctionnalités de lecture et d'écriture pour le format Microsoft Office binaire non XML. Toutes les API de la bibliothèque POI sont construites sur cela.
  • HSSF et XSSF :HSSF signifie Horrible Spread Sheet Format . Il s'agit d'un port d'implémentation Java pour le format de fichier Excel 97 ou pour les fichiers .xls. XSSF signifie format de feuille de calcul XML et c'est un port pour le format de fichier OOXML ou le format de fichier .xlsx.
  • HWPF et XWPF :HWPF signifie Horrible Word Processor Format . Il s'agit d'un port en lecture seule limité pour l'ancien format de fichier Word 6 ou Word 95. Le XWPF signifie format de traitement de texte XML . Il s'agit d'un port d'implémentation Java pour le format de fichier Word 2007 .docx. Les deux mises en œuvre prennent en charge des fonctionnalités limitées.
  • HSLF et XSLF :HSLF signifie Horrible Slide Layout Format . Le XSLF signifie Format de mise en page des diapositives XML . Ces deux éléments offrent des capacités de lecture, d'écriture, de création et de modification des présentations PowerPoint, tandis que HSLF prend en charge le format PowerPoint 97 et XSLF prend en charge les versions ultérieures.
  • HPSF  : HPSF signifie Horrible Property Set Format . Il est particulièrement utilisé pour travailler avec des propriétés de document telles que la définition du titre, de la catégorie, de l'auteur, de la date de modification, etc. d'un document
  • HDGF et XDGF :HDGF signifie Horrible Diagram Format . Ce composant contient des classes pour travailler avec le format de fichier binaire Visio. Il fournit des API de bas niveau en lecture seule pour accéder aux documents Visio et aux fichiers VSD. Le XDGF signifie format de diagramme XML . C'est pour le format de fichier Visio XML ou les fichiers VSDX.
  • HPBF  : HPBF signifie Horrible Publisher Format . Il s'agit d'un port Java limité pour travailler avec le format de fichier MS Publisher.

Les acronymes semblent humoristiques car ces systèmes de fichiers étaient censés être fermés et Microsoft a fait de son mieux pour obscurcir le code afin qu'ils soient non seulement difficiles à comprendre mais aussi difficiles à désosser. Mais les développeurs d'Apache l'ont facilement piraté et l'ont rétro-conçu avec succès. Peut-être, en signe de réjouissance ou de condamnation totale du système fermé, les ont-ils nommés en plaisantant comme tels.

Travailler avec les fichiers HSSF et XSSF

Les composants HSSF et XSSF de la bibliothèque Apache fournissent trois modèles d'accès à un document de feuille de calcul conformément à la documentation HSSF et XSSF. Ce sont :

  • Structures de bas niveau pour besoins spéciaux
  • Les API eventmodel pour un accès en lecture seule aux documents Excel
  • Les API usermodel pour créer, lire et modifier des fichiers Excel

Les API de modèle d'événement limitées peuvent être utilisées uniquement pour lire les données de la feuille de calcul. Ces API sont situées dans le org.apache.poi.hssf.eventusermodel package et org.apache.poi.xssf.eventusermodel package, où le premier est utilisé pour lire les données du .xls format de fichier et le second est utilisé pour lire les données du .xlsx format de fichier.

Le modèle utilisateur est beaucoup plus flexible et plus facile à utiliser ; il peut lire, écrire, créer et modifier un document de feuille de calcul Excel. Mais, il a une empreinte mémoire beaucoup plus élevée que le modèle d'événement de bas niveau.

De plus, l'accès et la manipulation du nouveau format de fichier basé sur OOXML avec XSSF ont une empreinte mémoire beaucoup plus élevée que les anciens fichiers binaires pris en charge par HSSF.

À partir de POI 3.5, le modèle HSSF et XSSF a été intégré au modèle SS, plutôt modifié pour fonctionner avec les deux modèles. Il s'agit plus d'un changement de nom que d'un vrai changement. D'une certaine manière, on peut dire que SS=HSSF+XSSF.

Migration des données d'un tableau de base de données vers une feuille de calcul Excel

Ici, nous allons créer un programme utilitaire simple pour migrer certaines données de base de données dans une feuille Excel. Cela peut également être modifié pour fonctionner avec d'autres méthodes, telles que la migration de données Excel vers une table de base de données. Ceci est laissé en exercice au lecteur. Le programme est simple et explicite. Visitez la documentation Apache POI pour des informations détaillées sur toutes les classes ou méthodes. Pour essayer l'exemple suivant, ce que nous avons utilisé est le suivant :

  • JDK 8
  • MS Excel 2007
  • Intellij IDEA IDE
  • Point d'intérêt Apache 3.17
  • Apache Derby 10.14

Visitez les documents appropriés et les fichiers d'aide pour la mise en place du projet. Voici le contenu du fichier Maven pom.xml que nous avons utilisé.

<projet  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org /xsd/maven-4.0.0.xsd"> <modèleVersion>4.0.0Version du modèle> <identifiant de groupe>com.mano.examplesID de groupe> <ID d'artefact>apache-poi-demoartifactId> <version>Version 1.0-SNAPSHOT> <emballage>bocalemballage> <nom>apache-poi-demonom> <URL>http://maven.apache.orgurl> <propriétés> <project.build.sourceEncoding> UTF-8 project.build.sourceEncoding> propriétés> <construire> <plugins> <plugin> <ID d'artefact> maven-compiler-plugin artifactId> <version>3.7.0version> <configuration> <source>1.8source> <cible>1,8cible> paramétrage> plugin> plugins> construire> <dépendances> <dépendance> <identifiant de groupe>junitgroupId> <ID d'artefact>junitID d'artefact> <version>3.8.1version> <portée>testerportée> dépendance>  <dépendance> <identifiant de groupe>org.apache.maven.pluginsID de groupe> <ID d'artefact>maven-compiler-pluginartifactId> <version>3.7.0version> dépendance>  <dépendance> <identifiant de groupe>org.apache.poiID de groupe> <ID d'artefact>poiID d'artefact> <version>3.17version> dépendance>  <dépendance> <identifiant de groupe>org.apache.poiID de groupe> <ID d'artefact>poi-ooxmlID d'artefact> <version>3.17version> dépendance>  <dépendance> <identifiant de groupe>org.apache.derbyID de groupe> <ID d'artefact>derbyartifactId> <version>10.14.1.0version> <portée>testerportée> dépendance>  <dépendance> <identifiant de groupe>org.apache.derbyID de groupe> <ID d'artefact>derbyclientID d'artefact> <version>10.14.1.0version> dépendance> dépendances>projet> 

Liste 1 : pom.xml

Une table de base de données est créée avec des enregistrements factices avant l'exécution du programme utilitaire. Voici le code de ce fichier.

forfait com.mano.examples ;importer java.sql.*;classe publique DummyDatabase { public static void createDummyDatabase() lance SQLException { Connection con=DriverManager.getConnection ("jdbc:derby:D:/temp/dummy;create=true" ); Instruction stmt=con.createStatement(); stmt.executeUpdate("drop table semestre2" ); stmt.executeUpdate("CREATE TABLE semestre2(STUDENT_ID int, CARCH INT, DCE INT, WEBTECH INT, JAVA INT, SAD_MIS INT, CLÉ PRIMAIRE (STUDENT_ID))" ); // Insérer 2 lignes stmt.executeUpdate("insérer dans semestre2 valeurs (23567932,56,78,97,58,85)" ); stmt.executeUpdate("insérer dans semestre2 valeurs (47250001,96,34,75,68,12)" ); stmt.executeUpdate("insérer dans semestre2 valeurs (99568955,45,68,69,78,29)" ); stmt.executeUpdate("insérer dans semestre2 valeurs (89376473,75,23,56,89,47)" ); stmt.executeUpdate("insérer dans semestre2 valeurs (29917740,85,78,55,15,48)" ); stmt.executeUpdate("insérer dans semestre2 valeurs (85776649,23,56,78,25,69)" ); stmt.executeUpdate("insérer dans semestre2 valeurs (38846455,68,95,78,53,48)" ); stmt.executeUpdate("insérer dans semestre2 valeurs (40028826,63,56,48,59,75)" ); stmt.executeUpdate("insérer dans semestre2 valeurs (83947759,85,54,69,36,89)" ); stmt.executeUpdate("insérer dans semestre2 valeurs (92884775,78,59,25,48,69)" ); stmt.executeUpdate("insérer dans semestre2 valeurs (24947389,12,10,14,54,68)" ); stmt.executeUpdate("insérer dans semestre2 valeurs (77399465,44,33,26,88,77)" ); // Requête ResultSet rs =stmt.executeQuery ("SELECT * FROM semestre2" ); // Imprimer le résultat de la requête pendant (rs.next()) { System.sortie  .printf ("%dt%dt%dt%dt%dt%dn" , rs.getLong("STUDENT_ID" ), rs.getInt("CARCH" ), rs.getInt("DCE" ), rs.getInt("WEBTECH" ), rs.getInt("JAVA" ), rs.getInt("SAD_MIS" )); } stmt.close(); con.close(); }}

Liste 2 : DummyDatabase.java.

C'est le programme utilitaire dont nous parlons. Le code a été écrit à la va-vite et la structure pas très élégante. Cependant, cela fonctionne. Restructurez-le ou modifiez-le comme bon vous semble.

forfait com.mano.examples ;importer org.apache.poi.hssf.usermodel.HSSFWorkbook ;importer org.apache.poi.ss.usermodel.* ;importer org.apache.poi.xssf.usermodel.XSSFWorkbook ;importer java.io.File;importer java.io.FileOutputStream ;importer java.io.IOException ;importer java.sql.*;classe publique  SSFile { statique privé  Chaîne[] en-tête ={"STUDENT_ID" , "CARCH" , "DCE" , "WEBTECH" , "JAVA" , "SAD_MIS" , "TOTAL" , "MOYENNE" } ; vide statique public  databaseToExcel(Fichier fichier) lance IOException, SQLException { Workbook workbook =null; si (file.getName().endsWith(".xls" )) classeur =nouveau HSSFWorkbook(); sinon si (file.getName().endsWith(".xlsx" )) classeur =nouveau XSSFWorkbook(); autrement { System.sortie  .println("Nom de fichier invalide !" ); retour; } Feuille feuille =classeur.createSheet(); Connexion con =DriverManager.getConnection ("jdbc:derby:D:/temp/dummy;create=true" ); Instruction stmt =con.createStatement(); ResultSet rs =stmt.executeQuery("SELECT * FROM semestre2" ); Ligne rr =feuille.createRow(0); pour (int  i=0;i<en-tête .longueur;i++){ createHeaderCell (rr, (court ) je, en-tête [je]); } entier je =1 ; pendant (rs.next()) { rr =feuille.createRow(i++); pour (int  j=0;jen-tête .longueur -2;j++){ createDataCell (rr, (court ) j, rs.getLong(en-tête [j])); } } rr =feuille.getRow(1); Total cellule =rr.createCell(6); total.setCellType(CellType.FORMULE  ); total.setCellFormula("SUM(B2:F2)" ); Cellule moyenne =rr.createCell(7); avg.setCellType(CellType.FORMULE  ); avg.setCellFormula("AVERAGE(B2:F2)" ); FileOutputStream outFile =nouveau FileOutputStream(fichier); classeur.write(outFile); outFile.flush(); outFile.close(); stmt.close(); con.close(); } vide statique privé createHeaderCell(Row row, short col, String cellValue) { Cellule c =row.createCell(col); c.setCellValue(cellValue); } vide statique privé createDataCell(Row row, short col, Number cellValue) { Cellule c =row.createCell(col); c.setCellType(CellType.NUMERIC  ); c.setCellValue(cellValue.doubleValue()); }}

Liste 3 : SSFile.java

C'est le panneau de contrôle à partir duquel le programme utilitaire est appelé.

forfait com.mano.examples ;importer java.io.File;importer java.io.IOException ;importer java.sql.SQLException ;classe publique Application{ public static void main( String[] args ) lance IOException,SQLException{ // DummyDatabase.createDummyDatabase(); SSFile.databaseToExcel (nouveau Fichier("d://temp//test1.xls" )); }}

Liste 4 :App.java

Avant de courir…

Assurez-vous que le test1.xls ou test1.xlsx les fichiers n'existent pas dans le d://temp répertoire avant d'exécuter le programme car le programme n'écrase ni ne vérifie le fichier portant le même nom dans le répertoire où le fichier est censé être créé. Assurez-vous de cela à chaque fois que le programme est exécuté; sinon, le code donne un message d'erreur désagréable. Cependant, vous pouvez modifier le code pour mettre quelques vérifications.

Conclusion

Il existe une autre alternative au travail avec des feuilles de calcul, comme le suggère la documentation Apache POI via le sérialiseur Cocoon, bien qu'il utilise toujours HSSF indirectement. Cocoon peut sérialiser n'importe quelle source de données XML en appliquant la feuille de style et en désignant le sérialiseur. Le modèle HSSF et XSSF est assez puissant et fournit un certain nombre de classes et de méthodes pour traiter différents aspects d'un document Excel. Cet article a essayé de donner un aperçu de ce que nous pouvons faire avec Apache POI. Nous avons souvent besoin d'écrire un programme utilitaire pour faire le pont entre un système ouvert et fermé. Apache POI peut certainement servir notre objectif en tant qu'unique en son genre.

Références

  • Apache POI – l'API Java pour les documents Microsoft
  • POI-HSSF et POI-XSSF – API Java pour accéder aux fichiers au format Microsoft Excel