用合并字段Docx4j替换文本

时间:2014-01-20 09:30:16

标签: java xpath jaxb ms-word docx4j

我正在尝试使用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>

我怎样才能做到这一点?

0 个答案:

没有答案