Java Apache POI 生成Word文件的页码

1、引用Apache POI

使用Apache POI操作Word文件,需要在项目中包含了Apache POI的依赖。如使用Maven,可以在pom.xml文件中添加以下依赖,如下,

<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.1.2</version>
    </dependency>
</dependencies>

2、使用Apache POI生成页码

 参考文档:Java Apache POI 生成Word文件的页码-CJavaPy

使用Apache POI在Word文档的页脚中添加页码,代码如下,

try (XWPFDocument document = new XWPFDocument()) {
    // 创建一个段落
    XWPFParagraph paragraphMain = document.createParagraph();
    XWPFRun runMain = paragraphMain.createRun();
    runMain.setText("Sample paragraph text.");
    // 创建页脚并添加页码
    //设置XWPFFooter类型脚标对象
    XWPFFooter footer = document.createFooter(HeaderFooterType.DEFAULT);//创建一个新的XWPFFooter对象
    XWPFParagraph paragraph = footer.createParagraph();//创建新的XWPFParagraph对象
    paragraph.setAlignment(ParagraphAlignment.CENTER);//设置样式居中
    //设置段落对象
    XWPFRun runPre = paragraph.createRun();//新的段落对象
    runPre.setText("- ");
    //setXWPFRunStyle(runPre,"宋体",14);
    XWPFRun run = paragraph.createRun();//新的段落对象
    CTFldChar fldChar = run.getCTR().addNewFldChar();//新的CTFldChar对象
    fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
    CTText ctText = run.getCTR().addNewInstrText();
    ctText.setStringValue("PAGE  \\* MERGEFORMAT");
    ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
    //setXWPFRunStyle(run,"宋体",14);
    fldChar = run.getCTR().addNewFldChar();
    fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
    //设置段落对象
    XWPFRun runSuf = paragraph.createRun();//新的段落对象
    runSuf.setText(" -");
    //setXWPFRunStyle(runSuf,"宋体",14);
    // 将页脚添加到所有的页面
    XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(document);
    headerFooterPolicy.createFooter(STHdrFtr.DEFAULT, new XWPFParagraph[]{paragraph});

    // 保存文档
    try (FileOutputStream out = new FileOutputStream("WordWithPageNumbers.docx")) {
        document.write(out);
    }
} catch (IOException e) {
    e.printStackTrace();
}

3、设置页脚的字体样式

Word中生成的页码的页脚样式如需要调整,可以参考代码如下,

/**
 * 设置页脚的字体样式
 * @param xr 段落元素
 * @param font 段落元素
 * @param fontSize 的大小
 */
static void setXWPFRunStyle(XWPFRun xr, String font, int fontSize) {
    sr.setFontSize(fontSize);
    CTRPr rpr = xr.getCTR().isSetRPr() ? xr.getCTR().getRPr() : xr.getCTR().addNewRPr();
    CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
    fonts.setAscii(font);
    fonts.setEastAsia(font);
    fonts.setHAnsi(font);
}

4、奇偶页格式

如奇数和偶数页的样式不同,可以先设置所有面的页码样式,之后在设置偶数页的样式。

1)设置所有页码

设置所有页码靠左显示。

XWPFFooter footer = document.createFooter(HeaderFooterType.DEFAULT);//创建一个新的XWPFFooter对象,HeaderFooterType.DEFAULT表示所有页
XWPFParagraph paragraph = footer.createParagraph();//创建新的XWPFParagraph对象
paragraph.setAlignment(ParagraphAlignment.LEFT);//设置页码靠左
//设置段落对象
XWPFRun runPre = paragraph.createRun();//新的段落对象
runPre.setText("- ");
//setXWPFRunStyle(runPre,"宋体",14);
XWPFRun run = paragraph.createRun();//新的段落对象
CTFldChar fldChar = run.getCTR().addNewFldChar();//新的CTFldChar对象
fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
CTText ctText = run.getCTR().addNewInstrText();
ctText.setStringValue("PAGE  \\* MERGEFORMAT");
ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
//setXWPFRunStyle(run,"宋体",14);
fldChar = run.getCTR().addNewFldChar();
fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
//设置段落对象
XWPFRun runSuf = paragraph.createRun();//新的段落对象
runSuf.setText(" -");

2)设置偶数页码

设置偶数的页码靠右显示。

XWPFFooter footer = document.createFooter(HeaderFooterType.EVEN);//创建一个新的XWPFFooter对象,HeaderFooterType.EVEN 表示偶数页
XWPFParagraph paragraph = footer.createParagraph();//创建新的XWPFParagraph对象
paragraph.setAlignment(ParagraphAlignment.RIGHT);//设置页码靠右
//设置段落对象
XWPFRun runPre = paragraph.createRun();//新的段落对象
runPre.setText("- ");
//setXWPFRunStyle(runPre,"宋体",14);
XWPFRun run = paragraph.createRun();//新的段落对象
CTFldChar fldChar = run.getCTR().addNewFldChar();//新的CTFldChar对象
fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
CTText ctText = run.getCTR().addNewInstrText();
ctText.setStringValue("PAGE  \\* MERGEFORMAT");
ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
//setXWPFRunStyle(run,"宋体",14);
fldChar = run.getCTR().addNewFldChar();
fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
//设置段落对象
XWPFRun runSuf = paragraph.createRun();//新的段落对象
runSuf.setText(" -");

5、页码和总页数

如显示页码时,需要添加总页数的显示。

参考文档:Java Apache POI 生成Word文件的页码-CJavaPy
明白了,您想要用 Apache POI 生成 Word 文档,并在其中添加页码。您可以通过以下代码来实现: ``` // 创建一个新的Word文档对象 XWPFDocument document = new XWPFDocument(); // 添加一个新的段落 XWPFParagraph para = document.createParagraph(); // 设置段落对齐方式为居中 para.setAlignment(ParagraphAlignment.CENTER); // 添加一个新的页眉 CTSectPr sectPr = document.getDocument().getBody().addNewSectPr(); XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(document, sectPr); XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT); // 在页眉中添加页码 CTP ctP = CTP.Factory.newInstance(); CTSimpleField simpleField = ctP.addNewFldSimple(); simpleField.setInstr("PAGE"); simpleField.setDirty(STOnOff.TRUE); XWPFParagraph headerParagraph = new XWPFParagraph(ctP, header); headerParagraph.setAlignment(ParagraphAlignment.RIGHT); header.getParagraphs().add(headerParagraph); // 添加正文内容 XWPFRun run = para.createRun(); run.setText("这是一段测试内容"); // 保存文档 FileOutputStream out = new FileOutputStream("example.docx"); document.write(out); out.close(); ``` 上述代码中,我们使用了 `XWPFDocument` 类创建了一个新的 Word 文档对象,并使用 `XWPFParagraph` 类添加了一个新的段落。接着,我们使用 `XWPFHeaderFooterPolicy` 类创建了一个新的页眉,并在其中使用 `CTSimpleField` 类添加了页码。最后,我们使用 `FileOutputStream` 类将文档保存到本地。您可以根据自己的需求修改代码中的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值