Apache POI 3.17中HeaderFooterType.EVEN创建页眉无效问题咨询
为什么Apache POI 3.17创建的偶数页页眉不显示?
这个问题我做Word文档生成时也踩过一模一样的坑!核心原因其实是Word默认没有开启「奇偶页页眉页脚不同」的全局设置——你光创建了HeaderFooterType.EVEN类型的页眉,但文档本身没打开这个开关,Word就会默认忽略偶数页的单独配置,只加载DEFAULT类型的页眉内容。
解决步骤
要让偶数页页眉生效,得先给文档开启奇偶页分开的配置,再创建对应页眉:
- 开启奇偶页不同设置
Word的这个开关对应OOXML里的evenAndOddHeaders属性,POI 3.17里需要通过底层XML对象手动设置; - 分别创建奇数页(DEFAULT)和偶数页(EVEN)页眉
别忘了同时创建奇数页的页眉,不然奇数页会显示空白。
修改后的完整代码示例
XWPFDocument document = new XWPFDocument(); // 第一步:开启文档的奇偶页页眉不同设置 CTDocument1 ctDoc = document.getDocument(); CTBody ctBody = ctDoc.getBody(); CTSectPr sectPr = ctBody.getSectPr(); // 如果文档还没有节属性,先创建一个 if (sectPr == null) { sectPr = ctBody.addNewSectPr(); } // 开启奇偶页不同配置 sectPr.setEvenAndOddHeaders(STOnOff.ON); // 第二步:创建偶数页页眉 document.createHeader(HeaderFooterType.EVEN) .createParagraph() .createRun() .setText("even page header"); // 同时创建奇数页(默认)页眉 document.createHeader(HeaderFooterType.DEFAULT) .createParagraph() .createRun() .setText("odd page header");
原理说明
Word的页眉页脚是和文档的「节(Section)」绑定的,默认每个节的奇偶页共用一套页眉页脚。只有当你给节开启了evenAndOddHeaders后,Word才会分别加载EVEN和DEFAULT(对应奇数页)的页眉内容。POI 3.17的高层API没有直接封装这个开关,所以需要手动操作底层的CTSectPr对象来开启。
内容的提问来源于stack exchange,提问作者Laziji
相关产品推荐
相关产品推荐

