如何从XWPFDocument可靠地获取所有邮件合并字段的列表?

时间:2019-04-25 16:59:00

标签: java apache-poi xwpf

我有一个.docx文件,其中包含许多邮件合并字段,我正在尝试使用Apache POI以可靠的方式获取它们的集合。

使用下面的代码,我可以获得CTSimpleField对象的列表:

private void doStuff(final XWPFParagraph paragraph) {
    final List<CTSimpleField> fields = paragraph.getCTP().getFldSimpleList();
    // Code to manipulate the fields goes here...
}

但是,仅当基础XML文档中的字段声明遵循以下特定格式时,才查找字段:

<w:fldSimple w:instr=" MERGEFIELD  \* MERGEFORMAT ">
  <w:r>
    <w:rPr>
      <w:b />
      <w:bCs />
      <w:noProof />
      <w:lang w:val="en-GB" />
    </w:rPr>
    <w:t>Some Text</w:t>
  </w:r>
</w:fldSimple>

这意味着根本不会检测到以下格式的任何邮件合并字段:

<w:r>
  <w:fldChar w:fldCharType="begin" />
</w:r>
<w:r>
  <w:instrText xml:space="preserve"> MERGEFIELD  \* MERGEFORMAT </w:instrText>
</w:r>
<w:r>
  <w:fldChar w:fldCharType="separate" />
</w:r>
<w:r w:rsidR="00441006">
  <w:rPr>
    <w:b />
    <w:bCs />
    <w:noProof />
    <w:lang w:val="en-GB" />
  </w:rPr>
  <w:t>#DATE2#</w:t>
</w:r>
<w:r>
 <w:rPr>
   <w:b />
   <w:bCs />
   <w:noProof />
   <w:lang w:val="en-GB" />
 </w:rPr>
 <w:fldChar w:fldCharType="end" />
</w:r>

此外,XWPFParagraph#getCTP()方法用@Internal注释,它指出:

  

注释为@Internal的程序元素仅用于POI内部使用。在将来的POI版本中,此类元素不是按设计公开的,可能会被删除,更改其签名或将访问级别从公共降低为受保护,打包或私有,恕不另行通知。 @Internal元素可以立即进行修改或删除,并且不受POI项目政策的限制,即在删除两个主要版本之前不建议使用该元素。

我真正需要的是能够可靠地检测到邮件合并字段的变化,以便我可以对其进行操作。我该怎么办?

注意:理想情况下,如果可以帮助,我想避免使用@Internal方法,但是如果不可避免,那就去吧。

0 个答案:

没有答案