poi给Word添加“下一页”

如何在Word中插入下一页

在Word操作中,如果想插入不同的页眉,就必须要将【链接到前一条页眉】取消勾选,而只有插入一个“下一页”分隔符时才能做到这个效果。
在这里插入图片描述
在这里插入图片描述
所以我们要做的就是插入“下一页”分隔符(不是别的分隔符),然后再插入页眉。

操作之前的介绍

Word文档可以先将扩展名修改为“zip”然后解压,解压后的目录结构是这样的:
├── [Content_Types].xml
├── _rels
├── docProps
├── word
├──├── _rels
├──├── document.xml

别的文件和目录省略吧,主要是“document.xml”文件,建议研究Word的同窗们先研究这个,这里基本都是正文。
在这里插入图片描述

如何插入下一页分隔符

其实分隔符分开的就是sectPr,俗称section,就是说我们只要在上面在插入一个sectPr元素,这个文档就会是两个section也就是成为了两个不同的部分,这是插入不同页眉的基础。

/**
     * 给 {@link XWPFDocument} 设置下一页
     * <br />
     * 也只有设置下一页形式的分页符才可以分隔不同页面的表头
     *
     * @param document {@link XWPFDocument} 对象
     */
    public static void insertNextPageChar(XWPFDocument document) {
        // 首先获取 document 的 Section 信息
        CTBody body = document.getDocument().getBody();
        // 放心, 这个 body 肯定不为空, 否则这个文档就有问题了
        XWPFParagraph paragraph = document.createParagraph();
        // 新创建的段落肯定没有 PPr, 所以需要新创建一个
        CTPPr ctpPr = paragraph.getCTP().addNewPPr();
        // 这一句其实就是设置下一页的分页符了
        CTSectPr sectPr = ctpPr.addNewSectPr();
        // 先加入到 document 的 List 中
        Document parent = Document.getParentDocument(document);
        if (parent != null) {
            parent.addSectPr(sectPr);
        }
        if (!body.isSetSectPr()) {
            // 文档没设置了 sectPr
            return;
        }
        // 把文档上的 sectPr 中的某些属性赋值给新创建的段落的 sectPr
        CTSectPr bodySectPr = body.getSectPr();
        sectPr.setPgSz(bodySectPr.getPgSz());
        sectPr.setPgMar(bodySectPr.getPgMar());
        sectPr.setCols(bodySectPr.getCols());
        sectPr.setDocGrid(bodySectPr.getDocGrid());
    }

看代码,其实是新创建了一个段落(XWPFParagraph),然后在段落的pPr里建了一个sectPr元素并赋值
在这里插入图片描述
后续会加上插入页眉。

### 使用POI-TL库在Java中手动添加分节符 为了在Java项目中利用POI-TL库向Word文档中添加分页符或分节符,可以按照如下方法操作。需要注意的是,在实际应用过程中应当确保已经正确引入了Apache POI以及POI-TL的相关依赖。 ```xml <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.9.0</version> </dependency> ``` 下面是一个简单的例子展示如何创建一个新的Word文档并向其中插入分节符: ```java import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.data.TextRenderData; import com.deepoove.poi.render.RenderPolicy; import org.apache.xmlbeans.XmlCursor; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr; import java.io.FileOutputStream; import java.io.IOException; public class AddSectionBreakExample { public static void main(String[] args) throws IOException { XWPFTemplate template = XWPFTemplate.compile(null).render(null); CTBody body = template.getXWPFDocument().getDocument().getBody(); XmlCursor cursor = body.newCursor(); // 添加一些文本内容 TextRenderData textRenderData = new TextRenderData("black", "这是第一节的内容"); RenderPolicy.createParagraph(cursor, null, textRenderData); // 插入分节符 CTSectPr sectPr = body.addNewSectPr(); // 创建新的分节属性对象 // 设置分节符类型为下一页(new page),其他可选值还有连续(continuous), 奇数页(odd page), 和偶数页(even page) sectPr.setPgSz(body.get SectPr().addNewType()).setVal(STSectionMark.NEXT_PAGE); // 继续添加更多文本到下一节 textRenderData = new TextRenderData("red", "这是第二节的内容"); RenderPolicy.createParagraph(cursor, null, textRenderData); try (FileOutputStream out = new FileOutputStream("output.docx")) { template.write(out); } } } ``` 上述代码片段展示了怎样通过`CTBody`类获取当前文档体,并借助游标(`XmlCursor`)定位要插入的位置;接着定义了一个新的分节设置实例`CTSectPr`并通过调用其成员函数指定具体的分隔样式(这里选择了换新页面)。最后再次追加一段文字表示进入到了下一个章节。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值