У меня есть файл .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
, если могу помочь, но если это неизбежно, пусть будет так.