如何使用poi 3.8替换java中docx头中的占位符

NKB*_*NKB 3 header apache-poi xwpf

我想在docx文件的标题中替换标记.我已经在段落和表格中处理了令牌替换,但它没有选择标题数据.我使用apache poi 3.8并使用eclipse ID在java中编码.感谢名单

小智 10

此方法将替换整个文档中的表,标题和段落中的所有选定文本.

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个涵盖了很多用例,干得好!唯一的缺点是,它没有涵盖跨多个单词和句子的情况。但是,如果我们将/sf/answers/2011846161/中的实现替换为“ replaceParagraph”的实现,则它将适当地处理多次运行情况。 (2认同)

小智 0

您可以利用 MS Word 中的“内容控件”。然后您可以使用 openxml 库访问内容控件。内容控件充当 Word 文档中的占位符/输入部分。我不是 Java 人员,但只是让你知道这是另一种方法