Remplacer un texte dans Apache POI XWPF
Je viens de trouver Apache POI bibliothèque très utile pour modifier des fichiers Word à l'aide de Java. Plus précisément, je veux éditer un DOCX fichier à l'aide d'Apache POI XWPF classes. Je n'ai pas trouvé la bonne méthode et de la documentation à la suite de laquelle j'ai pu faire. Quelqu'un peut-il expliquer en étapes, comment remplacer du texte dans un fichier DOCX.
** Le texte peut être en ligne /paragraphe ou dans une ligne de table/colonne
Merci d'Avance 🙂
- J'ai un problème avec remplacement (stackoverflow.com/q/49678959/8030651), peut-être que vous avez une réponse...
Vous devez vous connecter pour publier un commentaire.
La méthode que vous avez besoin est XWPFRun.setText(String). Simplement de travailler votre chemin à travers le fichier jusqu'à ce que vous trouver la XWPFRun d'intérêt, le travail hors de ce que vous voulez que le nouveau texte, et de le remplacer. (Une course est une séquence de texte avec la même mise en forme)
Vous devriez être en mesure de faire quelque chose comme:
getCells()
surXWPFTableRow
est maintenantgetTableCells()
.tbl.getRow()
devrait êtretbl.getRows()
etrow.getCells()
devrait êtrerow.getTableCells()
.{10}
à la partie correspondante du texte dans un tableau, mais les mots qui ne sont pas dans la même XWPFRun.Voici ce que nous avons fait pour le texte de remplacement à l'aide d'Apache POI. Nous avons constaté qu'il n'était pas en valeur la dispute et la plus simple de remplacer le texte de toute une XWPFParagraph au lieu de courir. Une série peut être au hasard divisé au moyen d'un mot que Microsoft Word est en charge de la où les pistes sont créés dans le paragraphe d'un document. C'est pourquoi le texte que vous pourriez être à la recherche pourrait être la moitié à un run et l'autre moitié dans l'autre. À l'aide de l'intégralité du texte d'un paragraphe, retrait de ses pistes, et l'ajout d'un nouveau courir avec le ajustée texte semble résoudre le problème de remplacement de texte.
Il y a cependant un coût, le remplacement, au paragraphe niveau; on perd la mise en forme des pistes dans ce paragraphe. Par exemple, si dans le milieu de votre paragraphe, vous avez eu en gras le mot "bits", et ensuite lors de l'analyse du fichier que vous avez remplacé le mot "bits" avec "octets", le mot "octets" ne serait plus être en caractères gras. Parce que les caractères gras ont été enregistrés avec une course qui a été supprimé lorsque le point de l'ensemble du corps de texte a été remplacé. Le code joint a commenté l'article, qui travaillait pour le remplacement de texte au niveau d'exécution si vous en avez besoin.
Il convient également de noter que la ci-dessous fonctionne si le texte que vous insérez contient \n caractères de retour. Nous ne pouvions pas trouver un moyen d'insérer des retours sans créer une course pour chaque section avant le retour et le marquage de l'exécuter addCarriageReturn(). Cheers
ma tâche consistait à remplacer les textes de la forme ${key} avec les valeurs d'une carte à l'intérieur d'un mot document docx.
Les solutions ci-dessus sont un bon point de départ, mais ne prennent pas en compte tous les cas: ${key} peut se propager non seulement à travers de multiples pistes, mais aussi à travers de multiples textes dans une course. J'ai donc terminé avec le code suivant:
Si quelqu'un a besoin aussi de garder la mise en forme du texte, ce code fonctionne mieux.
exécuter.getText(int position) - à partir de la documentation:
Retourne:
le texte de ce passage de texte ou null s'il n'est pas
Il suffit de vérifier si elle n'est pas null avant d'appeler contient() sur celui-ci
Et btw, si vous souhaitez remplacer le texte, vous devez le régler en position à partir de laquelle vous obtenez, dans ce cas r.setText(texte, 0);. Sinon le texte sera ajouté pas remplacé
La réponse acceptée ici a besoin d'une autre mise à jour avec Justin Skiles mise à jour.
r.setText(texte, 0);
Raison: Si pas de mise à jour setText avec pos variable, le résultat sera la combinaison de la vieille chaîne et de la chaîne de remplacement.
run.setText( new_text, 0 )
fonctionne OK pour moi, en fait, maisrun.setText( new_text )
, en effet, ajouternew_text
pour le texte existant de laXWPFRun
. Un bug, sûrement? PS à l'aide de Jython.À compter de la date de la rédaction, aucune des réponses remplacer correctement.
Gagravars réponse ne comprennent pas les cas où les mots à remplacer sont divisés en pistes; Thierry Boduins solution parfois à gauche des mots pour remplacer le vide quand ils étaient après d'autres mots pour remplacer, aussi il ne vérifie pas les tables.
À l'aide de Gagtavars réponse que de base j'ai aussi vérifié la course avant d'exécution en cours si le texte de pistes contiennent le mot à remplacer, l'ajout de bloc else. Ma plus dans kotlin:
il s'agit de la liste de courses en un paragraphe.
Même avec le bloc de recherche dans la table.
Avec cette solution, je n'ai pas de problèmes encore. Le formatage est intact.
Edit: j'ai fait une java lib pour le remplacement, check it out: https://github.com/deividasstr/docx-word-replacer
Il est le
replaceParagraph
de mise en œuvre qui remplace${key}
avecvalue
(lefieldsForReport
paramètre) et les enregistre au format par la fusionruns
contenu${key}
.La mise en œuvre replaceParagraph
Unité de test
Je suggère ma solution pour le remplacement de texte entre #, par exemple: Ce #signet# doit être remplacé.
Il est de remplacer dans l':
Aussi, il prend en compte les situations, lorsque le symbole # et signet dans la séparation de pistes (remplacer variable entre les différentes pistes).
Ici le lien pour le code: https://gist.github.com/aerobium/bf02e443c079c5caec7568e167849dda