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

如何用Apache POI查找/替换。docx文件中的占位符?

霍永年
2023-03-14

有没有办法让程序迭代所有出现的“[序列号]”并用字符串替换它们?这些标记中的许多将在一个大表中,那么Apache POI中是否有一些等效的命令来只在word中按Ctrl+F并使用replace All?

如有任何建议,不胜感激,谢谢

共有1个答案

习洲
2023-03-14

xwpfdocument(docx)有不同类型的子元素,如xwpfparages、xwpftables、xwpfnumbering等。

通过以下方式创建XWPFDocument对象后:

document = new XWPFDocument(inputStream);

您可以遍历所有段落:

document.getParagraphsIterator();
XWPFParagraph para = (XWPFParagraph) xwpfParagraphElement;
for (XWPFRun run : para.getRuns()) {
    if (run.getText(0) != null) {
        String text = run.getText(0);
        Matcher expressionMatcher = expression.matcher(text);
        if (expressionMatcher.find() && expressionMatcher.groupCount() > 0) {
            System.out.println("Expression Found...");
        }
    }
}
run.setText(text, 0);

如果要用一个全新的xwpfrun替换整个xwpfrun,或者在拥有此运行的段落之后插入一个新的段落/表,则可能会遇到一些问题,比如a.ConcurrentModificationException,这意味着您不能修改正在迭代的列表(XWPFRuns)和b.查找要插入的新元素的位置。要解决这些问题,应该有一个XWPFParagarph 列表 中的 列表。一旦有了替换列表,就可以对其进行迭代,对于每个替换段落,只需获得一个光标,并在该光标处插入新元素:

for (XWPFParagraph para: paras) {
    XmlCursor cursor = (XmlCursor) para.getCTP().newCursor();
    XWPFTable newTable = para.getBody().insertNewTbl(cursor);
    //Generate your XWPF table based on what's inside para with your own logic
}

要创建XWPFTABLE,请阅读以下内容。

希望这能帮到别人。

 类似资料:
  • 我一直在尝试通过FieldMailMerge和VariableReplace示例,但似乎无法运行本地测试用例。我基本上试图从一个docx模板文档开始,并让它从一个模板创建x个docx文档,替换变量。 在下面的代码中,试图替换单个变量,但失败了。模板文件中的${}值作为处理的一部分被移除,因此我认为它正在查找它们,而不是出于某种原因替换它们。我明白这可能是由于格式问题,正如示例代码的注释中所解释的那

  • 问题内容: 对于我的项目,我需要将有向图转换为图的张量流实现,就好像它是神经网络一样。在tensorflow版本1中,我可以将所有输入定义为占位符,然后使用广度优先搜索图为输出生成数据流图。然后,我只需使用feed_dict来输入我的输入。但是,在TensorFlow v2.0中,他们决定完全放弃占位符。 如何在不使用占位符的情况下为每个接受可变数量的输入并返回可变数量的输出的图制作tf.func

  • 我知道有很多关于这个话题的帖子,但似乎没有一篇是专门针对这个问题的。我正在尝试制作一个小型通用文档生成器POC。我使用的是开放式XML。 代码是这样的: 代码按预期工作。问题如下: StreamReader. ReadToend()在标记之间分割我的占位符,所以我的替换方法只替换不会被分割的单词。 在这种情况下,我的代码将搜索单词“Firstname”,但会找到“irstname”,因此不会替换它

  • 问题内容: 我正在运行Python 2.7。 我有三个文本文件:,,和。现在,包含我要搜索的几行并将该部分替换为中的内容。这是一个简单的示例: data.txt find.txt replace.txt 所以,在上面的例子中,我要搜索的所有出现,以及在数据和更换这些线路。 我在使用正确的方法时遇到了一些麻烦,因为我的内存大约为1MB,所以我想尽可能地提高效率。一种愚蠢的方法是将所有内容连接成一个长

  • 您不需要理解内容,只需查看我的占位符和。有10页与这些占位符,现在我应该取代他们与其他内容。黑色和黄色的盒子是公司的照片,我不会分享。 现在,我开始阅读整个docx4j文档,并在一段时间后生成以下代码: 一些解释: 是上图中文件的路径 是应该替换的值 是应该替换的值 但是当我运行这个方法时,什么也没有发生,我的控制台只是打印一些信息。如果它们很重要,我会编辑帖子,但我不这么认为。 那么我的错在哪里

  • 我正在尝试创建一个包含多列的word文档。这样做(而不是使用表)的原因是,数据将跨越多个页面,在添加到新页面之前,我只能用列填充整个页面。 可以用ApachePOI实现吗?谢谢