Как заменить заполнители в заголовке 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(), чтобы заменить текст по всему документу, кроме верхнего и нижнего колонтитула.

Другие вопросы по тегам