Как заменить заполнители в заголовке DOCX в Java с помощью POI 3.8
Я пытаюсь заменить токены в заголовке файла docx. Я занимался заменой токенов в параграфах и таблицах, но не выбирал данные заголовка. Я использую apache poi 3.8 и кодирую в java, используя ID затмения. Thanx
3 ответа
Эти методы заменят весь выделенный текст в таблицах, заголовках и абзацах во всем документе.
public XWPFDocument replacePOI(XWPFDocument doc, String placeHolder, String replaceText){
// REPLACE ALL HEADERS
for (XWPFHeader header : doc.getHeaderList())
replaceAllBodyElements(header.getBodyElements(), placeHolder, replaceText);
// REPLACE BODY
replaceAllBodyElements(doc.getBodyElements(), placeHolder, replaceText);
return doc;
}
private void replaceAllBodyElements(List<IBodyElement> bodyElements, String placeHolder, String replaceText){
for (IBodyElement bodyElement : bodyElements) {
if (bodyElement.getElementType().compareTo(BodyElementType.PARAGRAPH) == 0)
replaceParagraph((XWPFParagraph) bodyElement, placeHolder, replaceText);
if (bodyElement.getElementType().compareTo(BodyElementType.TABLE) == 0)
replaceTable((XWPFTable) bodyElement, placeHolder, replaceText);
}
}
private void replaceTable(XWPFTable table, String placeHolder, String replaceText) {
for (XWPFTableRow row : table.getRows()) {
for (XWPFTableCell cell : row.getTableCells()) {
for (IBodyElement bodyElement : cell.getBodyElements()) {
if (bodyElement.getElementType().compareTo(BodyElementType.PARAGRAPH) == 0) {
replaceParagraph((XWPFParagraph) bodyElement, placeHolder, replaceText);
}
if (bodyElement.getElementType().compareTo(BodyElementType.TABLE) == 0) {
replaceTable((XWPFTable) bodyElement, placeHolder, replaceText);
}
}
}
}
}
private void replaceParagraph(XWPFParagraph paragraph, String placeHolder, String replaceText) {
for (XWPFRun r : paragraph.getRuns()) {
String text = r.getText(r.getTextPosition());
if (text != null && text.contains(placeHolder)) {
text = text.replace(placeHolder, replaceText);
r.setText(text, 0);
}
}
}
Я не знаю, есть ли у вас решение для этого вопроса. Но я попытался заменить токены в заголовке документа, и это сработало для меня.
public XWPFDocument setHeader(XWPFDocument document, String token, String textToReplace){
XWPFHeaderFooterPolicy policy= document.getHeaderFooterPolicy();
XWPFHeader header = policy.getHeader(0);
replaceInParagraphs(header.getParagraphs(), token, textToReplace);
return document;
}
private void replaceInParagraphs(List<XWPFParagraph> paragraphs, String placeHolder, String replaceText){
for (XWPFParagraph xwpfParagraph : paragraphs) {
List<XWPFRun> runs = xwpfParagraph.getRuns();
for (XWPFRun run : runs) {
String runText = run.getText(run.getTextPosition());
if(placeHolder !="" && !placeHolder.isEmpty()){
if(runText != null &&
Pattern.compile(placeHolder, Pattern.CASE_INSENSITIVE).matcher(runText).find()){
runText = replaceText;
}
}
run.setText(runText, 0);
}
}
}
Надеюсь это поможет.:)
Вы можете использовать "контроль содержимого" в MS Word. Затем вы можете получить доступ к элементам управления контентом, используя библиотеку openxml. Элементы управления содержимым действуют как заполнители / разделы ввода в документах Word. Я не Java-парень, но просто хочу сказать, что это еще один метод
Код, на который ссылается (отредактировано 30 сентября '16 в 1:19, Хулио Виллан), работает только для заголовков документа. Спасибо за код. Чтобы заменить в нижнем колонтитуле, тот же код должен вызываться внутри итерации FooterList. Для замены по всему документу, отличному от верхнего и нижнего колонтитула, необходимо снова вызвать replaceParagraph(), replaceTable(), чтобы заменить текст по всему документу, кроме верхнего и нижнего колонтитула.