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

标签 java apache-poi

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

policy.createFooter(XWPFHeaderFooterPolicy.DEFAULT, parsFooter);

最佳答案

这就是我在 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");

关于java - 如何在使用 Apache POI 和 java 创建的 .docx 上添加页码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51422109/

相关文章:

java - 为什么运行jsp文件时我的所有bean属性都为空

java - 通过改造发布到 Google Cloud Messaging

java - 直播主题

java - header 签名无效

java - 使用 java 无法在 Word 文档中获取页数

java - 评估表达式程序在接受用户输入时遇到的问题

java - 在 PostgreSQL 中加入两个查询

android - 在 Android 上使用 Apache POI

Java将csv字符串写入Excel

java - 获取Word文档数和PPT中幻灯片数