我在这个网站上使用了一些建议,但在这一行发现了NullPointerException
:
policy.createFooter(XWPFHeaderFooterPolicy.DEFAULT, parsFooter);
答案 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");