正在尝试替换docx文件中的某些文本,但是我遇到了要替换的文本的问题,这些文本可以多次运行。所以我试了这个:但它删除了文档中的所有内容:/
private void replaceText(XWPFParagraph p, String target, String replacement) {
if (p.getRuns() != null) {
String paragraph = p.getText();
for (int i = 0; i < p.getRuns().size(); i++) {
p.removeRun(i);
}
paragraph = paragraph.replace(target, replacement);
XWPFRun r = new XWPFRun(CTR.Factory.newInstance(), p);
r.setText(paragraph, 0);
}
}
它肯定会删除所有内容,因为您要删除段落中的所有运行。这里要理解的一点是,段落中的文本存储在运行中。getText() 的作用是返回段落所有运行中的所有文本。
删除所有运行并仅添加一个新运行肯定会破坏文本的字体和对齐方式
您将删除所有运行,然后添加一个具有替换文本的运行。我相信这不是你想要实现的。
只需循环运行并替换其中的文本即可。
对于我的一个项目,我选择了不同的路线,我处理底层XML数据并在那里进行搜索/替换,这通常效果很好。
有关详细信息,请参阅 https://github.com/centic9/poi-mail-merge,但基本上我通过以下方式获取 CTBody 低级项目
CTBody body = doc.getDocument().getBody();
然后阅读完整的 XML 正文文本
// read the current full Body text
String srcString = body.xmlText();
然后进行替换。
最后,我通过以下方式创建一个具有新内容的新CTBody项目
CTBody makeBody = CTBody.Factory.parse(resultStr);
有关完整的代码详细信息,请参阅 https://github.com/centic9/poi-mail-merge/blob/master/src/main/java/org/dstadler/poi/mailmerge/MailMerge.java#L81,因为还需要处理一些事情以使其正常工作。