gpt4 book ai didi

java - 如何使用 Apache POI 查找/替换 .docx 文件中的占位符?

转载 作者:行者123 更新时间:2023-11-30 09:07:11 26 4
gpt4 key购买 nike

我有一个文件“template.docx”,我希望它有可以用字符串或表格替换的占位符(即[序列号])。我正在使用 Apache POI,不,我不能使用 docx4j。

有没有办法让程序遍历所有出现的“[序列号]”并将它们替换为字符串?许多这些标签将位于一个大表内,那么是否有一些 Apache POI 的等效命令仅在 word 中按 ctrl+f 并使用全部替换?

如有任何建议,我们将不胜感激

最佳答案

XWPFDocument (docx)有不同种类的子元素,如 XWPFParagraph小号,XWPFTable小号,XWPFNumbering

创建 XWPFDocument 后对象通过:

document = new XWPFDocument(inputStream);

您可以遍历所有段落:

document.getParagraphsIterator();

当您遍历段落时,对于每个段落,您将获得多个 XWPFRun s 是具有相同样式的多个文本 block ,有时相同样式的文本 block 将被拆分为多个 XWPFRun在这种情况下,您应该查看 this question为避免拆分您的 Run,这样做将有助于识别您的 placeHolders,而无需在同一段落中合并多个 Run。在这一点上,您应该期望您的 placeHolder 不会在多次运行中被拆分,如果是这种情况,那么您可以继续并为每个段落迭代“XWPFRun”并查找与您的 placeHolder 匹配的文本,这样的事情会有所帮助:

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

在哪里expressionMatcher是基于特定 PlaceHolder 的 RegularExpression 的匹配器。尝试让正则表达式匹配您的 PlaceHolder 之前和之后的可选内容,例如 \([]*)(PlaceHolderGroup)([]*)^ ,相信我,它效果最好。

一旦找到合适的 XWPFRun提取您感兴趣的文本并创建一个应该足够简单的替换文本,然后您应该在这个特定的运行中用以前的文本替换新文本:

run.setText(text, 0);

如果你要更换整个XWPFRun全新的 XWPFRun或者在拥有此运行的段落之后插入一个新的段落/表格,您可能会遇到一些问题,例如 A。ConcurrentModificationException这意味着你不能修改你正在迭代的这个(XWPFRuns 的)列表,并且 B. 找到新的 Element 的位置插入。要解决这些问题,您应该有一个 List<XWPFParagraph>XWPFParagarph s 可以保存要插入新元素的参数。一旦你有了替换列表,你就可以迭代它,对于每个替换段落,你只需得到一个光标并在该光标处插入新元素:

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 , 阅读 this .

希望这对某人有帮助。

关于java - 如何使用 Apache POI 查找/替换 .docx 文件中的占位符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24085366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com