我正在尝试使用Docx4j用占位符(merge-field)替换文本。假设我提交了一个带有文字“亲爱的[firstName],......”的表格。我需要使用从表单提交的文本创建一个word文档,同时用merge-field替换“[firstName]”。
我目前正在使用正则表达式找到“[”和“]”之间的文本,并使用docx4j为其创建合并字段:
String regex = "\\[(.*?)\\]";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(eachSplit);
while(m.find()) {
ctSimple.setInstr(" MergeField "+m.group(1)+" \\* MERGEFORMAT ");
RPr RPr = factory.createRPr();
RPr.setNoProof(new BooleanDefaultTrue());
Text t = factory.createText();
t.setValue("<"+m.group(1)+">");
R run = factory.createR();
run.getContent().add(RPr);
run.getContent().add(t);
ctSimple.getContent().add(run);
}
JAXBElement<CTSimpleField> fldSimple = factory.createPFldSimple(ctSimple);
所以我现在想要的是能够用“fldSimple”合并字段替换文本“[firstName]”。
我可以在段落的末尾添加合并字段,如下所示:
P para = wordMLPackage.getMainDocumentPart().addParagraphOfText(newPara);
para.getContent().add(fldSimple);
但我不知道如何在与找到的文本相同的位置添加合并字段。我发现可能我可以使用一些xpath来执行此操作,如forum中所示,但我没有完全掌握这个概念。
我知道如果为此生成的xml看起来像:
<w:p>
<w:r>
<w:t>Dear [lastName],</w:t>
</w:r>
</w:p>
我需要将其更改为:
<w:p>
<w:r>
<w:t>Dear</w:t>
</w:r>
<w:r>
<w:t xml:space="preserve"> </w:t>
</w:r>
<w:fldSimple w:instr=" MERGEFIELD lastName \* MERGEFORMAT ">
<w:r>
<w:rPr>
<w:noProof/>
</w:rPr>
<w:t>«lastName»</w:t>
</w:r>
</w:fldSimple>
<w:r>
<w:t>,</w:t>
</w:r>
</w:p>
我怎样才能做到这一点?