Java POI生成DOCX文档时添加页脚在WPS中不显示的解决方案调研

原创 吴就业 3 0 2025-06-19

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/5894dc49db184d72a5e0389c4dc4b2e6

作者:吴就业
链接:https://wujiuye.com/article/5894dc49db184d72a5e0389c4dc4b2e6
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

问题描述

使用poi生成docx文档时为文档添加的页脚,使用Microsoft Word打开生成的文档是能正常看到页脚的,但是使用WPS打开却看不到。

使用poi为文档添加页脚的代码:(网上所有教程写的都是这样)

default void renderFooter(XWPFDocument document, RenderConfig config) {
    XWPFFooter footer = document.createFooter(HeaderFooterType.DEFAULT);
    XWPFParagraph paragraph = footer.createParagraph();
    paragraph.setAlignment(ParagraphAlignment.CENTER);
    XWPFRun footerRun = paragraph.createRun();
    footerRun.getCTR().addNewFldChar().setFldCharType(STFldCharType.Enum.forString("begin"));
    footerRun.getCTR().addNewInstrText().setStringValue("PAGE \\* MERGEFORMAT");
    footerRun.getCTR().addNewInstrText().setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
    footerRun.getCTR().addNewFldChar().setFldCharType(STFldCharType.Enum.forString("end"));
    footerRun.setFontFamily("Times New Roman");
    footerRun.setFontSize((int) config.getFontSize());
    XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(document);
    headerFooterPolicy.createFooter(STHdrFtr.DEFAULT, new XWPFParagraph[]{paragraph});
}

问题分析

猜测:Apache poi可能是根据Microsoft Word文档格式去设计实现的一个工具包,在页眉页脚上可能WPS和Microsoft Word两家的格式不同,Apache poi并没有去兼容WPS?

根据猜测分析解决问题思路:要解决wps打开看不到页码的问题可能需要从根本上去解决,即:找出两者生成的页脚的差异,然后想办法解决掉这种差异。

那么,如何得知这两者的差异呢?

任何文件都是二进制,只是按照某种“协议”去存储内容,例如java编译后的class文件对应java的class结构,class数据结构就是这种文件的存储协议。那docx文档就是docx协议,只需要了解docx协议的存储数据结构就能对比找出差异。

WPS和Microsoft Word生成的页脚差异问题分析

参考文献:https://www.leadtools.com/help/sdk/dh/to/file-formats-microsoft-word-document-docx-doc.html,这里有句描述是“DOCX is a zipped, XML-based file format.”,即docx是一种基于xml的压缩文件格式。

页脚文件差异分析

我们将docx后缀改为”.zip”文件,并用压缩工具解压缩。

暂时无法在飞书文档外展示此内容

这是poi生成的文档解压后的目录:

img

word/footer1.xml文件就是poi生成的页脚文件。

<?xml version="1.0" encoding="UTF-8"?>
<w:ftr xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
    <w:p>
        <w:pPr>
            <w:jc w:val="center" />
        </w:pPr>
        <w:r>
            <w:rPr>
                <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman"
                    w:eastAsia="Times New Roman" />
                <w:sz w:val="30" />
            </w:rPr>
            <w:fldChar w:fldCharType="begin" />
            <w:instrText>PAGE \* MERGEFORMAT</w:instrText>
            <w:instrText xml:space="preserve" />
            <w:fldChar w:fldCharType="end" />
        </w:r>
    </w:p>
</w:ftr>

按照这个思路,不用POI生成的。分别用Microsoft Word和wps创建一个带有页脚的文档,然后分别用对方打开各自创建的文档,观测页脚是否显示正常。

用Microsoft Word生成的文档,页脚会生成3份,但只有这一份有页码设置:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:ftr xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"
    xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex"
    xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex"
    xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex"
    xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex"
    xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex"
    xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex"
    xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex"
    xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex"
    xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink"
    xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d"
    xmlns:o="urn:schemas-microsoft-com:office:office"
    xmlns:oel="http://schemas.microsoft.com/office/2019/extlst"
    xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
    xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
    xmlns:v="urn:schemas-microsoft-com:vml"
    xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing"
    xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
    xmlns:w10="urn:schemas-microsoft-com:office:word"
    xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
    xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
    xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml"
    xmlns:w16cex="http://schemas.microsoft.com/office/word/2018/wordml/cex"
    xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid"
    xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml"
    xmlns:w16du="http://schemas.microsoft.com/office/word/2023/wordml/word16du"
    xmlns:w16sdtdh="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash"
    xmlns:w16sdtfl="http://schemas.microsoft.com/office/word/2024/wordml/sdtformatlock"
    xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex"
    xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"
    xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk"
    xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml"
    xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"
    mc:Ignorable="w14 w15 w16se w16cid w16 w16cex w16sdtdh w16sdtfl w16du wp14">
    <w:p w:rsidR="0037557D" w:rsidRDefault="0037557D">
        <w:pPr>
            <w:pStyle w:val="af0" />
            <w:jc w:val="center" />
            <w:rPr>
                <w:caps />
                <w:color w:val="4472C4" w:themeColor="accent1" />
            </w:rPr>
        </w:pPr>
        <w:r>
            <w:rPr>
                <w:caps />
                <w:color w:val="4472C4" w:themeColor="accent1" />
            </w:rPr>
            <w:fldChar w:fldCharType="begin" />
        </w:r>
        <w:r>
            <w:rPr>
                <w:caps />
                <w:color w:val="4472C4" w:themeColor="accent1" />
            </w:rPr>
            <w:instrText>PAGE \* MERGEFORMAT</w:instrText>
        </w:r>
        <w:r>
            <w:rPr>
                <w:caps />
                <w:color w:val="4472C4" w:themeColor="accent1" />
            </w:rPr>
            <w:fldChar w:fldCharType="separate" />
        </w:r>
        <w:r>
            <w:rPr>
                <w:caps />
                <w:color w:val="4472C4" w:themeColor="accent1" />
                <w:lang w:val="zh-CN" />
            </w:rPr>
            <w:t>2</w:t>
        </w:r>
        <w:r>
            <w:rPr>
                <w:caps />
                <w:color w:val="4472C4" w:themeColor="accent1" />
            </w:rPr>
            <w:fldChar w:fldCharType="end" />
        </w:r>
    </w:p>
    <w:p w:rsidR="0037557D" w:rsidRDefault="0037557D">
        <w:pPr>
            <w:pStyle w:val="af0" />
        </w:pPr>
    </w:p>
</w:ftr>

这份文档用wps打开,页脚显示正常。

现在用wps创建一份一样的文档。

暂时无法在飞书文档外展示此内容

然后查看生成的页脚代码如下。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:ftr xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:o="urn:schemas-microsoft-com:office:office"
    xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
    xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
    xmlns:v="urn:schemas-microsoft-com:vml"
    xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing"
    xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
    xmlns:w10="urn:schemas-microsoft-com:office:word"
    xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
    xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
    xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml"
    xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"
    xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk"
    xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml"
    xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"
    xmlns:wpsCustomData="http://www.wps.cn/officeDocument/2013/wpsCustomData"
    mc:Ignorable="w14 w15 wp14">
    <w:p w14:paraId="6EEC5502">
        <w:pPr>
            <w:pStyle w:val="2" />
        </w:pPr>
        <w:bookmarkStart w:id="0" w:name="_GoBack" />
        <w:bookmarkEnd w:id="0" />
        <w:r>
            <w:rPr>
                <w:sz w:val="18" />
            </w:rPr>
            <mc:AlternateContent>
                <mc:Choice Requires="wps">
                    <w:drawing>
                        <wp:anchor distT="0" distB="0" distL="114300" distR="114300" simplePos="0"
                            relativeHeight="251659264" behindDoc="0" locked="0" layoutInCell="1"
                            allowOverlap="1">
                            <wp:simplePos x="0" y="0" />
                            <wp:positionH relativeFrom="margin">
                                <wp:align>center</wp:align>
                            </wp:positionH>
                            <wp:positionV relativeFrom="paragraph">
                                <wp:posOffset>0</wp:posOffset>
                            </wp:positionV>
                            <wp:extent cx="1828800" cy="1828800" />
                            <wp:effectExtent l="0" t="0" r="0" b="0" />
                            <wp:wrapNone />
                            <wp:docPr id="1" name="文本框 1" />
                            <wp:cNvGraphicFramePr />
                            <a:graphic
                                xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
                                <a:graphicData
                                    uri="http://schemas.microsoft.com/office/word/2010/wordprocessingShape">
                                    <wps:wsp>
                                        <wps:cNvSpPr txBox="1" />
                                        <wps:spPr>
                                            <a:xfrm>
                                                <a:off x="0" y="0" />
                                                <a:ext cx="1828800" cy="1828800" />
                                            </a:xfrm>
                                            <a:prstGeom prst="rect">
                                                <a:avLst />
                                            </a:prstGeom>
                                            <a:noFill />
                                            <a:ln w="6350">
                                                <a:noFill />
                                            </a:ln>
                                            <a:extLst>
                                                <a:ext uri="{909E8E84-426E-40DD-AFC4-6F175D3DCCD1}">
                                                    <a14:hiddenFill
                                                        xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main">
                                                        <a:solidFill>
                                                            <a:schemeClr val="lt1" />
                                                        </a:solidFill>
                                                    </a14:hiddenFill>
                                                </a:ext>
                                                <a:ext uri="{91240B29-F687-4F45-9708-019B960494DF}">
                                                    <a14:hiddenLine
                                                        xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main"
                                                        w="6350">
                                                        <a:solidFill>
                                                            <a:prstClr val="black" />
                                                        </a:solidFill>
                                                    </a14:hiddenLine>
                                                </a:ext>
                                            </a:extLst>
                                        </wps:spPr>
                                        <wps:style>
                                            <a:lnRef idx="0">
                                                <a:schemeClr val="accent1" />
                                            </a:lnRef>
                                            <a:fillRef idx="0">
                                                <a:schemeClr val="accent1" />
                                            </a:fillRef>
                                            <a:effectRef idx="0">
                                                <a:schemeClr val="accent1" />
                                            </a:effectRef>
                                            <a:fontRef idx="minor">
                                                <a:schemeClr val="dk1" />
                                            </a:fontRef>
                                        </wps:style>
                                        <wps:txbx>
                                            <w:txbxContent>
                                                <w:p w14:paraId="4AD458EC">
                                                    <w:pPr>
                                                        <w:pStyle w:val="2" />
                                                    </w:pPr>
                                                    <w:r>
                                                        <w:fldChar w:fldCharType="begin" />
                                                    </w:r>
                                                    <w:r>
                                                        <w:instrText xml:space="preserve"> PAGE  \* MERGEFORMAT </w:instrText>
                                                    </w:r>
                                                    <w:r>
                                                        <w:fldChar w:fldCharType="separate" />
                                                    </w:r>
                                                    <w:r>
                                                        <w:t>1</w:t>
                                                    </w:r>
                                                    <w:r>
                                                        <w:fldChar w:fldCharType="end" />
                                                    </w:r>
                                                </w:p>
                                            </w:txbxContent>
                                        </wps:txbx>
                                        <wps:bodyPr rot="0" spcFirstLastPara="0"
                                            vertOverflow="overflow" horzOverflow="overflow"
                                            vert="horz" wrap="none" lIns="0" tIns="0" rIns="0"
                                            bIns="0" numCol="1" spcCol="0" rtlCol="0"
                                            fromWordArt="0" anchor="t" anchorCtr="0" forceAA="0"
                                            upright="0" compatLnSpc="1">
                                            <a:spAutoFit />
                                        </wps:bodyPr>
                                    </wps:wsp>
                                </a:graphicData>
                            </a:graphic>
                        </wp:anchor>
                    </w:drawing>
                </mc:Choice>
                <mc:Fallback>
                    <w:pict>
                        <v:shape id="_x0000_s1026" o:spid="_x0000_s1026" o:spt="202"
                            type="#_x0000_t202"
                            style="position:absolute;left:0pt;margin-top:0pt;height:144pt;width:144pt;mso-position-horizontal:center;mso-position-horizontal-relative:margin;mso-wrap-style:none;z-index:251659264;mso-width-relative:page;mso-height-relative:page;"
                            filled="f" stroked="f" coordsize="21600,21600"
                            o:gfxdata="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&#10;AAAABgAGAFkBAABtBgAAAAA=&#10;">
                            <v:fill on="f" focussize="0,0" />
                            <v:stroke on="f" weight="0.5pt" />
                            <v:imagedata o:title="" />
                            <o:lock v:ext="edit" aspectratio="f" />
                            <v:textbox inset="0mm,0mm,0mm,0mm" style="mso-fit-shape-to-text:t;">
                                <w:txbxContent>
                                    <w:p w14:paraId="4AD458EC">
                                        <w:pPr>
                                            <w:pStyle w:val="2" />
                                        </w:pPr>
                                        <w:r>
                                            <w:fldChar w:fldCharType="begin" />
                                        </w:r>
                                        <w:r>
                                            <w:instrText xml:space="preserve"> PAGE  \* MERGEFORMAT </w:instrText>
                                        </w:r>
                                        <w:r>
                                            <w:fldChar w:fldCharType="separate" />
                                        </w:r>
                                        <w:r>
                                            <w:t>1</w:t>
                                        </w:r>
                                        <w:r>
                                            <w:fldChar w:fldCharType="end" />
                                        </w:r>
                                    </w:p>
                                </w:txbxContent>
                            </v:textbox>
                        </v:shape>
                    </w:pict>
                </mc:Fallback>
            </mc:AlternateContent>
        </w:r>
    </w:p>
</w:ftr>

这与Word生成的差别很大。

用Microsoft Word打开后,发现出现页码不连续情况,从1~9,第10页就变成1了。

img

找出Microsoft Word生成的与POI生成的最小差异

Microsoft Word不能兼容wps,但是wps能兼容Microsoft Word。

因此,就看Microsoft Word与POI生成的文档差异。试着将Microsoft Word生成的文件,删减后,重新压缩,能否用WPS打开并正常显示页码。

img

左边是删减前,右边是删减后。就是把主题、样式、多余的页头和页脚删除。

另外[Content_Types].xml文件中有这些文件的引用,也需要删除。

img

重新压缩后,使用WPS能够正常打开。

img

按照这个思路,只需要对比这份删减后的文档,和poi生成的文档,存在什么差异。

接着用AI工具Cursor对两个文档进行分析,找到了这个差异:

Microsoft Word生成的document.xml,在页脚处,会有w:pgSz、`w:pgMar等标签。

<w:sectPr w:rsidR="00F6098D">
            <w:headerReference w:type="even" r:id="rId6" />
            <w:headerReference w:type="default" r:id="rId7" />
            <w:footerReference w:type="even" r:id="rId8" />
            <w:footerReference w:type="default" r:id="rId9" />
            <w:headerReference w:type="first" r:id="rId10" />
            <w:footerReference w:type="first" r:id="rId11" />
            <w:pgSz w:w="11906" w:h="16838" />
            <w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="851"
                w:footer="992" w:gutter="0" />
            <w:cols w:space="425" />
            <w:docGrid w:type="lines" w:linePitch="312" />
        </w:sectPr>

POI生成的没有:

<w:sectPr>
    <w:footerReference w:type="default" r:id="rId21" />
</w:sectPr>

在多次尝试后,发现,只需要在页脚处添加页大小:<w:pgSz w:w="11906" w:h="16838" />,WPS打开文档就能正常显示页脚。仅有这一点区别。

解决方案

只需要在生成文档时,能让POI在document.xml的footerReference标签下面添加pgSz标签,问题就能解决。或者生成之后,自己写代码实现解压缩docx文件,找到document.xml文件,解析xml,在footerReference标签下面添加pgSz标签。

后者存在的缺陷:重新压缩后,使用Microsoft Word打开会识别到文件被修改过,会出现这个提示。

img

是否能直接让POI在生成的时候添加这个标签?

  1. 将poi版本升级到5.2.3(升级到这个版本才有需要的api)
  2. 在添加页脚后添加页大小,设置为A4纸大小
// 获取节属性
CTSectPr sectPr = document.getDocument().getBody().getSectPr();
// 设置页面大小(A4: 21cm x 29.7cm => twips: 11906 x 16838)
CTPageSz pgSz = sectPr.addNewPgSz();
pgSz.setW(BigInteger.valueOf(11906));
pgSz.setH(BigInteger.valueOf(16838));

生成的文档WPS和Microsoft Word打开都正常,并且Microsoft Word打开不会有警告。

Microsoft Word:

img

wps:

img

#后端

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

国内docker用不了了怎么办

替换掉Docker的镜像仓库,例如可以使用AWS的ECR公开的镜像仓库,常用的基础镜像都能找到替代。

df命令查看挂盘目录大小是整个文件系统的大小还是挂载的目录的大小

df命令获取的是整个nfs文件系统的磁盘空间使用情况,而不是我们挂盘的目录。统计目录的使用情况可以使用du命令。

golang如何本地开发然后在远程编译运行

有时候,我们可能会遇到go项目中依赖一些底层的lib c库,这些库是只有linux环境下才有的,而我们本地开发环境一般是windwos系统或者mac os系统,我们也懒得搞一个Linux虚拟机来专门做开发,而且在虚拟机里面开发体验也确实不好,会影响效率。

阿里云ACK(Serverless)安装APISIX网关及APISIX Ingress Controller

本篇从掘金同步过来,是作者之前将博客部署在阿里云ACK上,尝试使用APISIX网关的经验分享。

Cloudflare CDN请求body被限制问题,以及http Range请求头被移除问题

对于免费用户,单个请求的最大Body大小为100mb,对于付费企业用户,最大也只有500MB。请求经过Cloudflare CDN后,Range请求头被干掉了,Cloudflare CDN请求源站的时候并没有带上Range请求头。

Go语言有前途吗?

做后台开发,不管是java还是go,都只是一门编程语言罢了,不会说做了5年的java后端研发,换成go就不会了吧,顶多花点时间学习一门语言和一些框架,把编码习惯变一变而已,在问题排查方面,需要重新学习一些工具而已。