JAVA POI DOCX替换段落中的文本

JAVA POI DOCX替换段落中的文本,java,apache-poi,docx,Java,Apache Poi,Docx,嗨,我正在尝试替换docx文件中的一些文本,但是我遇到了一些问题,需要替换的文本可以多次运行。所以我尝试了这个:但它会删除文档中的所有内容:/ private void replaceText(XWPFParagraph p, String target, String replacement) { if (p.getRuns() != null) { String paragraph = p.getText(); for (int i = 0; i &l

嗨,我正在尝试替换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);

    }
}
private void replaceText(XWPFParagraph p,字符串目标,字符串替换){
如果(p.getRuns()!=null){
字符串段落=p.getText();
对于(int i=0;i
它肯定会删除所有内容,因为您正在删除段落中的所有段落。这里要理解的一点是,段落中的文本存储在运行中。getText()的作用是返回段落所有行中的所有文本。
删除所有运行并只添加一个新运行肯定会破坏字体和文本对齐方式

您将删除所有管路,然后添加一个带有替换文本的管路。 我相信这不是你希望达到的目标

Just loop over the runs and replace the text inside them.
只需循环运行并替换其中的文本 它肯定会删除所有内容,因为您正在删除段落中的所有段落。这里要理解的一点是,段落中的文本存储在运行中。getText()的作用是返回段落所有行中的所有文本。
删除所有运行并只添加一个新运行肯定会破坏字体和文本对齐方式

您将删除所有管路,然后添加一个带有替换文本的管路。 我相信这不是你希望达到的目标

Just loop over the runs and replace the text inside them.
只需循环运行并替换其中的文本 它肯定会删除所有内容,因为您正在删除段落中的所有段落。这里要理解的一点是,段落中的文本存储在运行中。getText()的作用是返回段落所有行中的所有文本。
删除所有运行并只添加一个新运行肯定会破坏字体和文本对齐方式

您将删除所有管路,然后添加一个带有替换文本的管路。 我相信这不是你希望达到的目标

Just loop over the runs and replace the text inside them.
只需循环运行并替换其中的文本 它肯定会删除所有内容,因为您正在删除段落中的所有段落。这里要理解的一点是,段落中的文本存储在运行中。getText()的作用是返回段落所有行中的所有文本。
删除所有运行并只添加一个新运行肯定会破坏字体和文本对齐方式

您将删除所有管路,然后添加一个带有替换文本的管路。 我相信这不是你希望达到的目标

Just loop over the runs and replace the text inside them.
只需循环运行并替换其中的文本 对于我的一个项目,我选择了另一条路线,我处理底层XML数据,并在那里进行搜索/替换,这通常非常有效

有关详细信息,请参见,但基本上我通过

CTBody body = doc.getDocument().getBody();
然后阅读完整的XML正文文本

// read the current full Body text
String srcString = body.xmlText();
然后进行替换

最后,我创建了一个新的CTBody项,通过

CTBody makeBody = CTBody.Factory.parse(resultStr);

有关完整的代码详细信息,请参阅,因为还有一些事情需要处理,以使其工作正常。

对于我的一个项目,我选择了不同的路线,处理底层XML数据,并在那里执行搜索/替换,这通常工作正常

有关详细信息,请参见,但基本上我通过

CTBody body = doc.getDocument().getBody();
然后阅读完整的XML正文文本

// read the current full Body text
String srcString = body.xmlText();
然后进行替换

最后,我创建了一个新的CTBody项,通过

CTBody makeBody = CTBody.Factory.parse(resultStr);

有关完整的代码详细信息,请参阅,因为还有一些事情需要处理,以使其工作正常。

对于我的一个项目,我选择了不同的路线,处理底层XML数据,并在那里执行搜索/替换,这通常工作正常

有关详细信息,请参见,但基本上我通过

CTBody body = doc.getDocument().getBody();
然后阅读完整的XML正文文本

// read the current full Body text
String srcString = body.xmlText();
然后进行替换

最后,我创建了一个新的CTBody项,通过

CTBody makeBody = CTBody.Factory.parse(resultStr);

有关完整的代码详细信息,请参阅,因为还有一些事情需要处理,以使其工作正常。

对于我的一个项目,我选择了不同的路线,处理底层XML数据,并在那里执行搜索/替换,这通常工作正常

有关详细信息,请参见,但基本上我通过

CTBody body = doc.getDocument().getBody();
然后阅读完整的XML正文文本

// read the current full Body text
String srcString = body.xmlText();
然后进行替换

最后,我创建了一个新的CTBody项,通过

CTBody makeBody = CTBody.Factory.parse(resultStr);

有关完整代码的详细信息,请参阅,因为还有一些事情需要处理才能使其正常工作。

我们如何才能在不同的运行中回复发送的文本?示例:文本“Date:#Date#”分为6次运行[日期],:],[日期],[日期],[日期],[日期],[日期],您如何决定何时调用
replaceText
以及何时不调用?我们如何在不同的运行中重新发送文本?示例:文本“Date:#Date#”分为6次运行[日期],:],[日期],[日期],[日期],[日期],[日期],您如何决定何时调用
replaceText
以及何时不调用?我们如何在不同的运行中重新发送文本?示例:文本“Date:#Date#”分为6次运行[日期],:],[日期],[日期],[日期],[日期],[日期],您如何决定何时调用
replaceText
以及何时不调用?我们如何在不同的运行中重新发送文本?示例:文本“Date:#Date#”分6次运行[日期],:],[日期],[日期],[日期],[日期],您如何决定何时调用
replaceText
以及何时不调用?