poi libreria library hssfworkbook descargar java apache ms-word apache-poi

java - libreria - Reemplazar un texto en Apache POI XWPF no funciona



library poi (4)

Tu lógica no es del todo correcta. Primero debe cotejar todo el texto en las ejecuciones y luego realizar la sustitución. También necesita eliminar todas las ejecuciones para el párrafo y agregar una nueva ejecución si se encuentra una coincidencia en "prueba".

Pruebe esto en su lugar:

public class testPOI { public static void main(String[] args) throws Exception{ String filepath = "F://MASTER_DOC.docx"; String outpath = "F://Test.docx"; XWPFDocument doc = new XWPFDocument(new FileInputStream(filepath)); for (XWPFParagraph p : doc.getParagraphs()){ int numberOfRuns = p.getRuns().size(); // Collate text of all runs StringBuilder sb = new StringBuilder(); for (XWPFRun r : p.getRuns()){ int pos = r.getTextPosition(); if(r.getText(pos) != null) { sb.append(r.getText(pos)); } } // Continue if there is text and contains "test" if(sb.length() > 0 && sb.toString().contains("test")) { // Remove all existing runs for(int i = 0; i < numberOfRuns; i++) { p.removeRun(i); } String text = sb.toString().replace("test", "DOG"); // Add new run with updated text XWPFRun run = p.createRun(); run.setText(text); p.addRun(run); } } doc.write(new FileOutputStream(outpath)); } }

Actualmente estoy tratando de trabajar en el código mencionado en una publicación anterior llamada Reemplazar un texto en Apache POI XWPF .

He intentado el siguiente y funciona, pero no sé si me falta algo. Cuando ejecuto el código, el texto no se reemplaza sino que se agrega al final de lo que se buscó. Por ejemplo, he creado un documento de palabras básicas e ingresé el texto "prueba". En el siguiente código, cuando lo ejecuto, obtengo el nuevo documento con el texto "testDOG".

Tuve que cambiar el código original de String text = r.getText (0) a String text = r.toString () porque seguí obteniendo un NullError mientras ejecutaba el código.

import java.io.*; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.xwpf.extractor.XWPFWordExtractor; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; public class testPOI { public static void main(String[] args) throws Exception{ String filepath = "F://MASTER_DOC.docx"; String outpath = "F://Test.docx"; XWPFDocument doc = new XWPFDocument(OPCPackage.open(filepath)); for (XWPFParagraph p : doc.getParagraphs()){ for (XWPFRun r : p.getRuns()){ String text = r.toString(); if(text.contains("test")) { text = text.replace("test", "DOG"); r.setText(text); } } } doc.write(new FileOutputStream(outpath)); }

EDITAR: Gracias por ayudar a todos. Busqué y encontré una solución en Reemplazar el valor de la columna de la tabla en Apache POI


Este método reemplaza cadenas de búsqueda en párrafos y puede trabajar con cadenas que abarcan más de una ejecución.

private long replaceInParagraphs(Map<String, String> replacements, List<XWPFParagraph> xwpfParagraphs) { long count = 0; for (XWPFParagraph paragraph : xwpfParagraphs) { List<XWPFRun> runs = paragraph.getRuns(); for (Map.Entry<String, String> replPair : replacements.entrySet()) { String find = replPair.getKey(); String repl = replPair.getValue(); TextSegement found = paragraph.searchText(find, new PositionInParagraph()); if ( found != null ) { count++; if ( found.getBeginRun() == found.getEndRun() ) { // whole search string is in one Run XWPFRun run = runs.get(found.getBeginRun()); String runText = run.getText(run.getTextPosition()); String replaced = runText.replace(find, repl); run.setText(replaced, 0); } else { // The search string spans over more than one Run // Put the Strings together StringBuilder b = new StringBuilder(); for (int runPos = found.getBeginRun(); runPos <= found.getEndRun(); runPos++) { XWPFRun run = runs.get(runPos); b.append(run.getText(run.getTextPosition())); } String connectedRuns = b.toString(); String replaced = connectedRuns.replace(find, repl); // The first Run receives the replaced String of all connected Runs XWPFRun partOne = runs.get(found.getBeginRun()); partOne.setText(replaced, 0); // Removing the text in the other Runs. for (int runPos = found.getBeginRun()+1; runPos <= found.getEndRun(); runPos++) { XWPFRun partNext = runs.get(runPos); partNext.setText("", 0); } } } } } return count; }


simplemente cambie el texto de cada ejecución en su párrafo, y luego guarde el archivo. este código funcionó para mi

XWPFDocument doc = new XWPFDocument(new FileInputStream(filepath)); for (XWPFParagraph p : doc.getParagraphs()) { StringBuilder sb = new StringBuilder(); for (XWPFRun r : p.getRuns()) { String text = r.getText(0); if (text != null && text.contains("variable1")) { text = text.replace("variable1", "valeur1"); r.setText(text, 0); } if (text != null && text.contains("variable2")) { text = text.replace("variable2", "valeur2"); r.setText(text, 0); } if (text != null && text.contains("variable3")) { text = text.replace("variable3", "valeur3"); r.setText(text, 0); } } } doc.write(new FileOutputStream(outpath));


No pierdas tu tiempo cuando puedes mantener las cosas simples:

// descargar de http://www.independentsoft.de/jword/evaluation.html import com.independentsoft.office.word.WordDocument;

clase pública JWORD {

public static void main(String[] args) { String filepath = "C://Users//setrivayne//Downloads//TEST.docx"; String outpath = "C://Users//setrivayne//Downloads//TEST.docx"; try { WordDocument doc = new WordDocument(filepath); doc.replace("FIRST NAME", "first name"); doc.replace("MIDDLE NAME", "middle name"); doc.replace("LAST NAME", "last name"); doc.save(outpath, true); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } }

}