当前位置: 首页 > 知识库问答 >
问题:

替换Apache POI XWPF中的文本不起作用

司马宏茂
2023-03-14

我目前正在尝试处理前一篇名为替换Apache POI XWPF中的文本的文章中提到的代码。

我已经尝试了下面的工作,但我不知道我是否错过了任何东西。当我运行代码时,文本不会被替换,而是添加到搜索内容的末尾。例如,我已经创建了一个基本的word文档,并输入了文本“test”。在下面的代码中,当我运行它时,我最终得到了文本为“TestDog”的新文档。

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));
}

共有1个答案

鄢承运
2023-03-14

此方法替换段落中的搜索字符串,并且能够处理跨越一次以上运行的字符串。

  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;
  }
 类似资料:
  • 问题内容: 我执行以下查询,由于某种原因,它没有替换数据库中的换行符。它说Rows匹配1,但没有变化。有什么问题吗? 问题答案: 您可以使用而不是匹配换行符。 代码:

  • 我已经根据Atlassian提供的基本/中级/高级教程创建了一个汇流蓝图插件。现在,我想更新页面模板,以包含一个带有嵌入CDATA的宏,其中CDATA中的URL包含要用用户输入的数据替换的部分。 尽管有反对解决方案的证据,但我希望有创意的人能知道我如何实现这一目标? 阿特拉斯SDK:6.2.14

  • 本文向大家介绍Python替换文件中的文本,包括了Python替换文件中的文本的使用技巧和注意事项,需要的朋友参考一下 例子            

  • 问题内容: 我最初尝试使用运算符分配值,但返回了错误,然后尝试使用 : 和 但是它正在返回原始价值。 提供有关如何正确使用替换API以获得正确结果的帮助。还有其他任何可用的API可以代替 。 在正在从用户采取的 是由用户的频率串被输入。这个问题几乎不涉及我想知道我是否使用了错误的API变量,因为它为我提供了不变的输出, 我们是否可以使用 从字符串中返回一个字符 来定义API的子字符串。我使用 最大

  • 我有一条短信。在这篇文章中是一张图片。我想把每个单词柏林都换成一个链接。现在我有问题,这站在图片的旧部分也是柏林,这也被取代。 有没有可能照片中的柏林没有被取代?注意,代码只是一个示例。我通常从wordpress获取内容。但这与此无关。我想。

  • 问题内容: 我有一个名为FormatString.java的文本文件。它包含一些单词。在所有这些单词中,我想将单词oldstring替换为newstring,并将最终结果重命名为t.txt。我已经编写了代码。从技术上讲,它应该起作用。问题是我不知道在哪里保存FormatString.java文件。我是否将其保存在保存了ReplacingText程序的同一类文件夹中,还是将其保存在其他地方。我转到命