Header 如何使用poi 3.8在java中替换docx标题中的占位符

Header 如何使用poi 3.8在java中替换docx标题中的占位符,header,apache-poi,xwpf,Header,Apache Poi,Xwpf,我打算替换docx文件头中的令牌。我已经在段落和表格中处理了令牌替换,但它没有拾取头数据。Im使用ApachePOI3.8,并使用EclipseID在java中编码。 Thanx您可以利用MS Word中的“内容控制”。然后可以使用openxml库访问内容控件。内容控件在Word文档中充当占位符/输入部分。我不是Java爱好者,但我只是告诉你这是另一种方法,我不知道你是否有这个问题的解决方案。但是,我试着替换文档头中的标记,这对我很有效 public XWPFDocument setHeader

我打算替换docx文件头中的令牌。我已经在段落和表格中处理了令牌替换,但它没有拾取头数据。Im使用ApachePOI3.8,并使用EclipseID在java中编码。
Thanx

您可以利用MS Word中的“内容控制”。然后可以使用openxml库访问内容控件。内容控件在Word文档中充当占位符/输入部分。我不是Java爱好者,但我只是告诉你这是另一种方法,我不知道你是否有这个问题的解决方案。但是,我试着替换文档头中的标记,这对我很有效

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);
        }
    }
}
public XWPFDocument setHeader(XWPFDocument文档、字符串标记、字符串textToReplace){
XWPFHeaderFooterPolicy=document.getHeaderFooterPolicy();
XWPFHeader header=policy.getHeader(0);
replaceInParagraphs(header.getParagraphs(),token,textToReplace);
归还文件;
}
私有void replaceInParagraphs(列出段落、字符串占位符、字符串替换文本){
对于(XWPFParagraph XWPFParagraph:段落){
List runs=xwpfParagraph.getRuns();
对于(XWPFRun运行:运行){
字符串runText=run.getText(run.getTextPosition());
if(占位符!=“”&&!占位符.isEmpty()){
if(runText!=null&&
Pattern.compile(占位符,Pattern.CASE\u不区分大小写).matcher(runText.find()){
runText=replaceText;
}
}
setText(runText,0);
}
}
}

希望这有帮助。:)

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

public XWPFDocument replacePOI(XWPFDocument doc,字符串占位符,字符串replaceText){
//替换所有标题
对于(XWPFHeader头:doc.getHeaderList())
replaceAllBodyElements(header.getBodyElements(),占位符,replaceText);
//更换车身
replaceAllBodyElements(doc.getBodyElements(),占位符,replaceText);
退货单;
}
私有void replaceAllBodyElements(列出bodyElements、字符串占位符、字符串replaceText){
用于(IBodyElement bodyElement:bodyElements){
如果(bodyElement.getElementType().compareTo(BodyElementType.Parague)==0)
替换段落((XWPFParagraph)body元素、占位符、替换文本);
if(bodyElement.getElementType().compareTo(BodyElementType.TABLE)==0)
replaceTable((XWPFTable)bodyElement、占位符、replaceText);
}
}
私有void replaceTable(XWPFTable表、字符串占位符、字符串replaceText){
对于(XWPFTableRow:table.getRows()){
对于(XWPFTableCell单元格:row.getTableCells()){
对于(IBodyElement bodyElement:cell.getBodyElements()){
如果(bodyElement.getElementType().compareTo(BodyElementType.Parague)==0){
替换段落((XWPFParagraph)body元素、占位符、替换文本);
}
if(bodyElement.getElementType().compareTo(BodyElementType.TABLE)==0){
replaceTable((XWPFTable)bodyElement、占位符、replaceText);
}
}
}
}  
}
私有void replaceParagraph段落(XWPFParagraph段落、字符串占位符、字符串replaceText){
对于(XWPFRun r:paragration.getRuns()){
字符串text=r.getText(r.getTextPosition());
if(text!=null&&text.contains(占位符)){
text=text.replace(占位符,replaceText);
r、 setText(text,0);
}
}
}
代码引用人(2016年9月30日1:19,Julio Villane编辑) 仅适用于整个文档的标题。 谢谢你的密码。 要在页脚中替换, 在FooterList的迭代中必须调用相同的代码。 要在文档中替换页眉和页脚以外的内容,
您必须再次调用replaceParagation(),replaceTable(),以替换文档中的文本,而不是页眉和页脚。

我使用xml库,因为在发布我的问题后,我尝试了更多,并且能够获得页眉数据,但它只提供第二页页眉数据,该行位于中间。我使用以下代码:XWPFHeaderFooterPolicy headerFooterPolicy=document.getHeaderFooterPolicy();xwpfheaderDefaultHeader=headerFooterPolicy.getDefaultHeader();System.out.println(“头值为:“+defaultHeader.getText());List paraList=null;List runList=null;XWPFRun=null;迭代器runIter=null;迭代器并行程序=null;XWPFParagraph paragraph=null;paraList=defaultHeader.getListParagation();paraIter=paraList.iterator();看起来您只获得了默认的标题。您确定每个页面都使用默认标题吗?不,它还返回我放在该位置的标题中的数据。如果我实现XWPFHeader defaultHeader=document.getHeaderList().get(1);它只给我第一页的数据,在段落中处理。我没有注意到,在我的用户给定的模板中,标题中有一个表。代码不是替换表值,而是替换其他值。第二,页面标题有标签,比如第一个标题和标题。所以我用两个不同的函数来处理它。谢谢你,丹尼斯这本书涵盖了一系列用例,干得好!唯一的缺点是,它不包括跨多个运行的单词和句子的情况。但是,如果我们将“replace段落”的实现替换为来自的实现,它将适当地处理多个运行案例。