Lire et écrire des fichiers Doc Word en utilisant POI
Le module HWPF d'Apache POI est spécialement utilisé pour lire et écrire des fichiers Doc Word. Dans HWPF, nous utilisons HWPFDocument pour représenter un document Doc Word. Il existe plusieurs concepts dans HWPFDocument:
Plage : Il représente une plage, qui peut être le document complet, une certaine section, un paragraphe (paragraphe) ou un paragraphe (caractères) avec des attributs communs.
Section : une sous-section d'un document Word. Un document Word peut être composé de plusieurs sous-sections.
Paragraphe : paragraphe d'un document Word, une sous-section peut être composée de plusieurs paragraphes.
Caractorrun : un paragraphe de texte avec les mêmes propriétés, et un paragraphe peut être composé de plusieurs caractéristiques.
Tableau : une table.
TableRow : la ligne correspondant à la table.
Tablecell : la cellule correspondant au tableau.
La section, le paragraphe, le personnageRun et le tableau sont tous hérités de la plage.
1 Lire Word Doc Fichier
Dans les applications quotidiennes, il est très rare pour nous de lire les informations à partir de fichiers Word, et nous écrivons plus souvent du contenu dans les fichiers Word. Il existe deux façons principales de lire les données des fichiers Word Doc à l'aide de POI: lire WordExtractor et lire HWPFDocument . Lors de la lecture d'informations à l'intérieur de WordExtractor, il est toujours obtenu via HWPFDocument.
1.1 Lire des fichiers via WordExtractor
Lors de la lecture d'un fichier à l'aide de WordExtractor, nous ne pouvons lire que le contenu texte du fichier et certaines propriétés basées sur le document. Quant aux propriétés du contenu du document, nous ne pouvons pas le lire. Si vous souhaitez lire les propriétés du contenu du document, vous devez utiliser HWPFDocument pour le lire. Voici un exemple d'utilisation de WordExtractor pour lire les fichiers:
classe publique hwpftest {@SuppressWarnings ("Deprécation") @Test public void testReadByExtractor () lève une exception {InputStream is = new FileInputStream ("d: //test.doc"); WordExtractor Extracteur = new WordExtractor (IS); // Sortie du texte de Word Document System.out.println (extracteur.getText ()); System.out.println (extracteur.getTextFropieces ()); // Sortie du contenu de l'en-tête System.out.println ("En-tête:" + extracteur.getheaderText ()); // Sortie du contenu du pied de page System.out.println ("Footer:" + extracteur.getFooterText ()); // Sortie des informations sur les métadonnées du document Word actuel, y compris l'auteur, le temps de modification du document, etc. System.out.println (extracteur.getMetAdatatexTextractor (). GetText ()); // Obtenez le texte de chaque paragraphe String paratexts [] = extracteur.getParagraphText (); pour (int i = 0; i <paratexts.length; i ++) {System.out.println ("paragraphe" + (i + 1) + ":" + paratexts [i]); } // Sortie des informations sur le mot actuel printInfo (extracteur.getsummaryInformation ()); // Sortie des informations sur le mot actuel this.printInfo (extracteur.getDocsummaryInformation ()); this.closeStream (IS); } / ** * Sortie SummaryInfomation * @param info * / private void printInfo (sommaryInformation info) {// auteur system.out.println (info.getAuthor ()); // Caractère Statistics System.out.println (info.getCarcount ()); // Nombre de pages System.out.println (info.getPageCount ()); // title System.out.println (info.getTitle ()); // thème System.out.println (info.getSubject ()); } / ** * Sortie DocumentsAmMaryInfoMation * @param info * / private void printInfo (documentsUmMaryInformation info) {// category system.out.println (info.getCategory ()); // Company System.out.println (info.getCompany ()); } / ** * Fermer le flux d'entrée * @param est * / private void closestream (inputStream is) {if (is! = Null) {try {is.close (); } catch (ioException e) {e.printStackTrace (); }}}}1.2 Lire des fichiers via HWPFDocument
HWPFDocument est un représentant des documents de mots actuels et ses fonctions sont plus fortes que WordExtractor. À travers elle, nous pouvons lire des tables, des listes, etc. dans le document, et nous pouvons également ajouter, modifier et supprimer le contenu du document. C'est juste qu'après terminer ces nouveaux ajouts, modifications et suppressions, les informations pertinentes sont enregistrées dans le HWPFDocument, ce qui signifie que ce que nous avons changé est le HWPFDocument, pas les fichiers sur le disque. Si nous voulons que ces modifications prennent effet, nous pouvons appeler la méthode d'écriture de HWPFDocument pour sortir le HWPFDocument modifié au flux de sortie spécifié. Il peut s'agir du flux de sortie du fichier d'origine, ou du flux de sortie du nouveau fichier (équivalent pour enregistrer en AS) ou d'autres flux de sortie. Voici un exemple de lecture d'un fichier via HWPFDocument:
classe publique hwpftest {@Test public void TestReadByDoc () lève une exception {InputStream is = new FileInputStream ("d: //test.doc"); HwpfDocument doc = new HWPFDocument (IS); // Sortie des informations sur les signets this.printinfo (doc.getBookmarks ()); // sortie text system.out.println (doc.getDocumentText ()); Plage range = doc.getRange (); // this.insertinfo (plage); this.printInfo (gamme); // Lire le tableau this.readable (plage); // Lire la liste this.readlist (plage); // supprimer la plage de plage r = nouvelle plage (2, 5, doc); R.Delete (); // Supprimer en mémoire, si vous devez l'enregistrer dans un fichier, vous devez le réécrire dans le fichier // Écrivez le HWPFDocument actuel sur le flux de sortie Doc.Write (nouveau FileOutputStream ("d: //test.doc")); this.closeStream (IS); } / ** * Fermez le flux d'entrée * @param est * / private void closeStream (inputStream is) {if (is! = Null) {try {is.close (); } catch (ioException e) {e.printStackTrace (); }}} / ** * Informations sur les signets de sortie * @param Bookmarks * / private void printInfo (bookmarks bookmarks) {int count = bookmarks.getBookmarksCount (); System.out.println ("Nombre de signets:" + Count); Bookmark Bookmark; pour (int i = 0; i <count; i ++) {bookmark = bookmarks.getBookmark (i); System.out.println ("Bookmark" + (i + 1) + "Le nom est:" + Bookmark.getName ()); System.out.println ("Position de démarrage:" + Bookmark.GetStart ()); System.out.println ("Position finale:" + Bookmark.gettend ()); }} / ** * Lire le tableau * Chaque retour de chariot représente un paragraphe, donc pour une table, chaque cellule contient au moins un paragraphe, et chaque ligne se termine par un paragraphe. * @Param Range * / private void readTable (plage plage) {// transférez le tableau dans la plage de plage. Tableiterator TableIter = new TableIterator (plage); Table de table; TableRow Row; Cellule de tablecell; while (tableiter.hasnext ()) {table = tableiter.next (); int rownum = table.numrows (); pour (int j = 0; j <rownum; j ++) {row = table.getRow (j); int cellnum = row.numcells (); pour (int k = 0; k <cellnum; k ++) {cell = row.getCell (k); // Sortie du texte de la cellule System.out.println (Cell.Text (). Trim ()); }}}}} / ** * LISTE LISTE * @param range * / private void readlist (range range) {int num = range.numparagraphs (); Paragraphe para; pour (int i = 0; i <num; i ++) {para = range.getParagraph (i); if (para.isinlist ()) {System.out.println ("list:" + para.text ()); }}} / ** * Plage de sortie * @param range * / private void printInfo (range range) {// Obtenez le nombre de paragraphes int paranum = range.numparagraphs (); System.out.println (paranum); for (int i = 0; i <paranum; i ++) {// this.insertinfo (range.getParagraph (i)); System.out.println ("paragraphe" + (i + 1) + ":" + range.getParagraph (i) .text ()); if (i == (paranum-1)) {this.insertinfo (range.getParagraph (i)); }} int secnum = range.numsEction (); System.out.println (secnum); Section Section; pour (int i = 0; i <secnum; i ++) {section = range.getSection (i); System.out.println (section.getMarginleft ()); System.out.println (section.getMarginRight ()); System.out.println (section.getMarginRight ()); System.out.println (section.getMargIntop ()); System.out.println (section.getMarginBottom ()); System.out.println (section.getPageHeight ()); System.out.println (section.Text ()); }} / ** * Insérer du contenu dans la plage, il ne sera écrit que dans la mémoire * @param range * / private void insertInfo (range range) {range.insertafter ("bonjour"); }}2 Écrivez le fichier Doc Word
Lors de la rédaction de fichiers Doc Word à l'aide de POI, nous devons d'abord avoir un fichier DOC, car lorsque nous écrivons des fichiers DOC, nous l'écrivons via HWPFDocument et HWPFDocument doit être joint à un fichier DOC. Ainsi, le moyen habituel consiste à préparer d'abord un fichier DOC avec du contenu vierge sur le disque dur, puis à créer un HWPFDocument basé sur le fichier vide. Après cela, nous pouvons ajouter un nouveau contenu au HWPFDocument, puis l'écrire dans un autre fichier DOC. Cela équivaut à utiliser POI pour générer un fichier Word Doc.
Dans les applications réelles, lorsque nous générons des fichiers Word, nous générons un certain type de fichier. Le format de ce type de fichier est fixé, mais certains champs sont différents. Donc, dans les applications pratiques, nous n'avons pas à générer le contenu de l'ensemble du fichier Word via HWPFDocument. Au lieu de cela, créez un nouveau document Word sur le disque, et son contenu est le contenu du fichier Word que nous devons générer, puis utiliser une méthode similaire à "$ {paramname}" pour remplacer certains des contenus appartenant aux variables. De cette façon, lorsque nous générons un fichier Word basé sur certaines informations, nous devons seulement obtenir le HWPFDocument basé sur le fichier Word, puis appeler la méthode de plage RemplaceText () pour remplacer la variable correspondante par la valeur correspondante, puis écrire le HWPFDocument actuel au flux de sortie. Cette méthode est utilisée plus fréquemment dans les applications pratiques car elle peut non seulement réduire notre charge de travail, mais aussi rendre le format de texte plus clair. Faisons un exemple basé sur cette méthode.
Supposons que nous ayons maintenant des informations changeantes, puis nous devons générer un fichier Word Doc dans le format suivant via ces informations:
Ainsi, selon la description ci-dessus, la première étape consiste à créer un fichier doc dans le format correspondant en tant que modèle, et son contenu est le suivant:
Avec un tel modèle, nous pouvons créer le HWPFDocument correspondant, puis remplacer la variable correspondante par la valeur correspondante, puis sortir le HWPFDocument au flux de sortie correspondant. Vous trouverez ci-dessous le code correspondant.
classe publique hwpftest {@test public void testwrite () lève l'exception {string templatePath = "d: //word//template.doc"; InputStream est = new FileInputStream (templatePath); HwpfDocument doc = new HWPFDocument (IS); Plage plage = doc.getRange (); // remplacer $ {reportDate} dans la plage de plage par la plage de dates actuelle.ReplaceText ("$ {reportDate}", new SimpledateFormat ("yyyy-mm-dd"). Format (new Date ())); range.ReplaceText ("$ {appleMt}", "100.00"); range.replaceText ("$ {bananaamt}", "200.00"); range.replaceText ("$ {totalamt}", "300.00"); OutputStream os = new FileOutputStream ("d: //word//write.doc"); // Exporter Doc vers le flux de sortie Doc.Write (OS); this.closeStream (OS); this.closeStream (IS); } / ** * Fermer le flux d'entrée * @param est * / private void closestream (inputStream is) {if (is! = Null) {try {is.close (); } catch (ioException e) {e.printStackTrace (); }}} / ** * Stream de sortie de fermeture * @param os * / private void closeStream (outputStream os) {if (os! = Null) {try {os.close (); } catch (ioException e) {e.printStackTrace (); }}}}}(Remarque: cet article est basé sur POI3.9)
Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!