我有一个.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
方法,但是如果不可避免,那就去吧。