Java 用合并字段Docx4j替换文本
我正在尝试使用Docx4j用占位符(合并字段)替换文本。假设我提交了一个带有文本“亲爱的[名字],…”的表单。我需要使用表单中提交的文本创建word文档,同时用合并字段替换“[firstName]” 我目前正在使用正则表达式查找“[”和“]”之间的文本,并使用docx4j为其创建一个合并字段:Java 用合并字段Docx4j替换文本,java,xpath,jaxb,ms-word,docx4j,Java,Xpath,Jaxb,Ms Word,Docx4j,我正在尝试使用Docx4j用占位符(合并字段)替换文本。假设我提交了一个带有文本“亲爱的[名字],…”的表单。我需要使用表单中提交的文本创建word文档,同时用合并字段替换“[firstName]” 我目前正在使用正则表达式查找“[”和“]”之间的文本,并使用docx4j为其创建一个合并字段: String regex = "\\[(.*?)\\]"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(ea
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);
但我不知道如何将合并字段添加到与找到的文本相同的位置。我发现可能我可以使用一些xpath来实现这一点,如中所示,但我没有完全理解这个概念
我知道,如果为此生成的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>
亲爱的
«姓氏»
,
我怎样才能做到这一点
<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>