Apache POI Word - 页眉页脚

Last Modified: 2023/11/12

概述

本文介绍如何使用 XWPFHeaderFooterPolicy 和 XWPFHeaderFooterPolicy 给文档创建页眉和页脚。

页眉

import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFHeader;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.FileOutputStream;
import java.io.IOException;

public class HeaderFooterDoc {

    public static void main(String[] args) throws IOException {
        try (XWPFDocument doc = new XWPFDocument()) {
            try (FileOutputStream out = new FileOutputStream("D:\\tmp\\header.docx")) {
                // 页眉策略
                XWPFHeaderFooterPolicy headerFooterPolicy = doc.createHeaderFooterPolicy();
                // 创建页眉
                XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);
                // 往页面添加内容
                XWPFParagraph headerParagraph = header.createParagraph();
                XWPFRun headerRun = headerParagraph.createRun();
                headerRun.setText("这是页眉内容");
                doc.write(out);
            }
        }
    }
}

在创建页眉之前,先需要一个页眉策略,页眉策略总共有三种:

  • XWPFHeaderFooterPolicy.DEFAULT
  • XWPFHeaderFooterPolicy.EVEN
  • XWPFHeaderFooterPolicy.FIRST

创建页眉对象之后,通过 header.createParagraph() 创建一个段落,之后的操作大家应该都很熟悉了,如果还不知道怎么操作段落,可以参考我之前的文章。

页眉的内容并不局限于文字,可以往页眉里添加图片。

页脚

import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFFooter;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.FileOutputStream;
import java.io.IOException;

public class HeaderFooterDoc {

    public static void main(String[] args) throws IOException {
        try (XWPFDocument doc = new XWPFDocument()) {
            try (FileOutputStream out = new FileOutputStream("D:\\tmp\\footer.docx")) {
                XWPFHeaderFooterPolicy headerFooterPolicy = doc.createHeaderFooterPolicy();
                XWPFFooter footer = headerFooterPolicy.createFooter(XWPFHeaderFooterPolicy.DEFAULT);
                XWPFParagraph footerParagraph = footer.createParagraph();
                XWPFRun run = footerParagraph.createRun();
                run.setText("这是页脚内容");
                doc.write(out);
            }
        }
    }
}

页脚的操作和页眉操作步骤几乎一模一样,这里不再赘述。

兼容性说明

以上代码在 WPS 中不能正常显示页眉和页脚。

这个问题暂时有两种解决方案,一种是利用其他的工具,例如:Aspose.Words,但该工具是收费的,如果费用不是问题,完全可以考虑使用 Aspose.Words;另外一种可以考虑使用一个模板文档,在这个模板文档中设置好页眉,然后读取该文档,并在此基础上替换页眉中的内容(如果有需要的话),然后继续生成其他内容。

try (InputStream in = new FileInputStream("D:\\tmp\\header-template-wps.docx")) {
    try (XWPFDocument doc = new XWPFDocument(in)) {
        try (FileOutputStream out = new FileOutputStream("D:\\tmp\\myDoc.docx")) {
            // 页眉一般是每一页都有,因此是个 List      
            List<XWPFHeader> headerList = doc.getHeaderList();
            for (XWPFHeader hd : headerList) {
                XWPFRun run = hd.getParagraphs().get(0).getRuns().get(0);
                // 替换页眉中的文字
                run.setText("this is override header");
            }
            doc.write(out);
        }
    }

}

这段代码中,header-template-wps.docx 便是模板。可以使用 WPS Office 制作这个模板,然后添加一个页眉,然后再页眉中添加文字,具体什么文字不重要,这个文字就是一个占位符,后面会替换掉这段文字。 当然如果页眉是固定的,那么替换都不需要了。

有问题吗?点此反馈!

温馨提示:反馈需要登录