【问题标题】:JAVA POI DOCX replace text in paragraphJAVA POI DOCX 替换段落中的文本
【发布时间】:2017-06-09 12:11:37
【问题描述】:

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

    }
}

【问题讨论】:

  • 我们如何设法替换发送的大量不同运行的文本?示例:文本“日期:#Date#”在 6 次运行 [Date],[:],[#],[Date],[#]
  • 您如何决定何时致电replaceText 何时不致电?

标签: java apache-poi docx


【解决方案1】:

它肯定会删除所有内容,因为您正在删除段落中的所有运行。这里要理解的是段落中的文本存储在运行中。 getText() 的作用是返回段落的所有运行中的所有文本。
删除所有运行并仅添加一个新运行肯定会破坏文本的字体和对齐方式

您将删除所有运行,然后添加一个带有替换文本的运行。 我相信这不是你想要达到的。

只需循环运行并替换其中的文本。

【讨论】:

    【解决方案2】:

    对于我的一个项目,我选择了不同的路线,我处理底层 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 了解完整的代码详细信息,因为要处理更多事情以使其正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      相关资源
      最近更新 更多