如何在使用Apache POI和Java创建的.docx上添加页码

时间:2018-07-19 11:57:17

标签: java apache-poi

我在这个网站上使用了一些建议,但在这一行发现了NullPointerException

policy.createFooter(XWPFHeaderFooterPolicy.DEFAULT, parsFooter);

1 个答案:

答案 0 :(得分:1)

这就是我在POI 3.14中创建页脚的方法。但从3.15开始可能需要进行一些更改。

public static XWPFFooter createFooter(XWPFDocument doc) {
    XWPFFooter ftr;
    XWPFHeaderFooterPolicy hfp = doc.createHeaderFooterPolicy();
    try {
        ftr = hfp.createFooter(XWPFHeaderFooterPolicy.DEFAULT);
    } catch (IOException e) {
        return null;
    }
    ftr.removeParagraph(0);
    return ftr;
}

请注意removeParagraph(0)末尾。 POI当前使用空白段落创建页眉和页脚(如果正确执行,则填充空白),但是我喜欢创建页脚,并在以后添加段落。它简化了我的代码,不必对第一段与其余段进行不同的处理。如果您可以在第一次创建页脚时使用空段落,那么可以删除该行,但是在以后的版本中,POI不会生成该空段落。不确定何时进行更改,但我想大约在3.16左右。

仍为3.14 :要在页脚中添加页码,您需要放入CT类中以插入字段。我用一种新方法来做到这一点。注意:仅提供CT类,因此您可以使用POI中未实现的功能,因此不应依赖于它们来实现功能。

public static XWPFRun createSimpleField(XWPFParagraph p, String instr, String dft) {
    CTP ctp = p.getCTP();
    CTSimpleField field = ctp.addNewFldSimple();
    field.setInstr(instr);
    CTR r = field.addNewR();
    CTText t = r.addNewT();
    t.setStringValue(dft);
    return new XWPFFieldRun(field, r, p);
}

现在将它们放在一起并假设MyUtilClass中包含这两个静态方法,我们可以将页码添加到页脚中,如下所示:

XWPFFooter ftr = MyUtilClass.createFooter(doc);
XWPFParagraph p = ftr.createParagraph();
XWPFRun r = p.createRun();
r.setText("Page ");
r = MyUtilClass.createSimpleField(p, "PAGE", "1");
r = p.createRun();
r.setText(" of ");
r = MyUtilClass.createSimpleField(p, "NUMPAGES", "1");