5

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

4

4 回答 4

14

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

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);
        }
    }
}
于 2015-05-08T19:08:42.827 回答
4

我不知道你是否有这个问题的解决方案。但是,我尝试替换文档标题中的标记,它对我有用。

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);
        }
    }
}

希望这可以帮助。:)

于 2014-02-23T12:49:54.003 回答
0

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

于 2013-10-16T00:53:21.613 回答
0

引用的代码(编辑于 2016 年 9 月 30 日 1:19,Julio Villane)仅适用于整个文档的标题。感谢您的代码。要在 Footer 中替换,必须在 FooterList 的内部迭代中调用相同的代码。要在除页眉和页脚之外的文档中替换,您必须再次调用replaceParagraph()、replaceTable() 来替换除页眉和页脚之外的文档中的文本。

于 2019-01-17T11:23:05.307 回答