在Java中使用Apache POI XWPF在同一word文档中创建横向和纵向页面

在Java中使用Apache POI XWPF在同一word文档中创建横向和纵向页面,java,ms-word,apache-poi,orientation,xwpf,Java,Ms Word,Apache Poi,Orientation,Xwpf,我试图使用Java和ApachePOI库创建一个word文档,其中包含一些横向页面和一些纵向页面。我可以改变所有页面的方向,但是有没有办法只改变其中一些页面的方向?我试过使用不同的部分和身体,但没有用 目前,我已经编写了一个函数,它将XWPFDocument作为输入,并更改新实体的方向。我曾希望更改新正文的方向不会影响前几页,但会影响整个文档 private void changeOrientation(XWPFDocument document, String orientation){

我试图使用Java和ApachePOI库创建一个word文档,其中包含一些横向页面和一些纵向页面。我可以改变所有页面的方向,但是有没有办法只改变其中一些页面的方向?我试过使用不同的部分和身体,但没有用

目前,我已经编写了一个函数,它将XWPFDocument作为输入,并更改新实体的方向。我曾希望更改新正文的方向不会影响前几页,但会影响整个文档

private void changeOrientation(XWPFDocument document, String orientation){
    CTDocument1 doc = document.getDocument();
    CTBody body = doc.addNewBody();
    body.addNewSectPr();
    CTSectPr section = body.getSectPr();
    if(!section.isSetPgSz()) {
        section.addNewPgSz();
    }
    CTPageSz pageSize = section.getPgSz();
    if(orientation.equals("landscape")){
        pageSize.setOrient(STPageOrientation.LANDSCAPE);
        pageSize.setW(BigInteger.valueOf(842 * 20));
        pageSize.setH(BigInteger.valueOf(595 * 20));
    }
    else{
        pageSize.setOrient(STPageOrientation.PORTRAIT);
        pageSize.setH(BigInteger.valueOf(842 * 20));
        pageSize.setW(BigInteger.valueOf(595 * 20));
    }
}
谢谢

结果表明需要一个CTPPr(分段),这可以通过以下代码完成:

private void changeOrientation(XWPFDocument document, String orientation){
    CTDocument1 doc = document.getDocument();
    CTBody body = doc.getBody();
    CTSectPr section = body.addNewSectPr();
    XWPFParagraph para = document.createParagraph();
    CTP ctp = para.getCTP();
    CTPPr br = ctp.addNewPPr();
    br.setSectPr(section);
    CTPageSz pageSize = section.getPgSz();
    if(orientation.equals("landscape")){
        pageSize.setOrient(STPageOrientation.LANDSCAPE);
        pageSize.setW(BigInteger.valueOf(842 * 20));
        pageSize.setH(BigInteger.valueOf(595 * 20));
    }
    else{
        pageSize.setOrient(STPageOrientation.PORTRAIT);
        pageSize.setH(BigInteger.valueOf(842 * 20));
        pageSize.setW(BigInteger.valueOf(595 * 20));
    }
}
private void changeOrientation(CTSectPr section, String orientation) {
    CTPageSz pageSize = section.isSetPgSz? section.getPgSz() : section.addNewPgSz();
    if (orientation.equals("landscape")) {
        pageSize.setOrient(STPageOrientation.LANDSCAPE);
        pageSize.setW(BigInteger.valueOf(842 * 20));
        pageSize.setH(BigInteger.valueOf(595 * 20));
    } else {
        pageSize.setOrient(STPageOrientation.PORTRAIT);
        pageSize.setH(BigInteger.valueOf(842 * 20));
        pageSize.setW(BigInteger.valueOf(595 * 20));
    }
}
但是,这只工作一次,因此页面不能交替方向。首先必须是所有横向页面,最后是纵向页面,反之亦然。

结果表明需要一个CTPPr(分节符),这可以通过以下代码完成:

private void changeOrientation(XWPFDocument document, String orientation){
    CTDocument1 doc = document.getDocument();
    CTBody body = doc.getBody();
    CTSectPr section = body.addNewSectPr();
    XWPFParagraph para = document.createParagraph();
    CTP ctp = para.getCTP();
    CTPPr br = ctp.addNewPPr();
    br.setSectPr(section);
    CTPageSz pageSize = section.getPgSz();
    if(orientation.equals("landscape")){
        pageSize.setOrient(STPageOrientation.LANDSCAPE);
        pageSize.setW(BigInteger.valueOf(842 * 20));
        pageSize.setH(BigInteger.valueOf(595 * 20));
    }
    else{
        pageSize.setOrient(STPageOrientation.PORTRAIT);
        pageSize.setH(BigInteger.valueOf(842 * 20));
        pageSize.setW(BigInteger.valueOf(595 * 20));
    }
}
private void changeOrientation(CTSectPr section, String orientation) {
    CTPageSz pageSize = section.isSetPgSz? section.getPgSz() : section.addNewPgSz();
    if (orientation.equals("landscape")) {
        pageSize.setOrient(STPageOrientation.LANDSCAPE);
        pageSize.setW(BigInteger.valueOf(842 * 20));
        pageSize.setH(BigInteger.valueOf(595 * 20));
    } else {
        pageSize.setOrient(STPageOrientation.PORTRAIT);
        pageSize.setH(BigInteger.valueOf(842 * 20));
        pageSize.setW(BigInteger.valueOf(595 * 20));
    }
}
但是,这只工作一次,因此页面不能交替方向。首先必须是所有横向页面,最后是纵向页面,反之亦然。

结果表明需要一个CTPPr(分节符),这可以通过以下代码完成:

private void changeOrientation(XWPFDocument document, String orientation){
    CTDocument1 doc = document.getDocument();
    CTBody body = doc.getBody();
    CTSectPr section = body.addNewSectPr();
    XWPFParagraph para = document.createParagraph();
    CTP ctp = para.getCTP();
    CTPPr br = ctp.addNewPPr();
    br.setSectPr(section);
    CTPageSz pageSize = section.getPgSz();
    if(orientation.equals("landscape")){
        pageSize.setOrient(STPageOrientation.LANDSCAPE);
        pageSize.setW(BigInteger.valueOf(842 * 20));
        pageSize.setH(BigInteger.valueOf(595 * 20));
    }
    else{
        pageSize.setOrient(STPageOrientation.PORTRAIT);
        pageSize.setH(BigInteger.valueOf(842 * 20));
        pageSize.setW(BigInteger.valueOf(595 * 20));
    }
}
private void changeOrientation(CTSectPr section, String orientation) {
    CTPageSz pageSize = section.isSetPgSz? section.getPgSz() : section.addNewPgSz();
    if (orientation.equals("landscape")) {
        pageSize.setOrient(STPageOrientation.LANDSCAPE);
        pageSize.setW(BigInteger.valueOf(842 * 20));
        pageSize.setH(BigInteger.valueOf(595 * 20));
    } else {
        pageSize.setOrient(STPageOrientation.PORTRAIT);
        pageSize.setH(BigInteger.valueOf(842 * 20));
        pageSize.setW(BigInteger.valueOf(595 * 20));
    }
}
但是,这只工作一次,因此页面不能交替方向。首先必须是所有横向页面,最后是纵向页面,反之亦然。

结果表明需要一个CTPPr(分节符),这可以通过以下代码完成:

private void changeOrientation(XWPFDocument document, String orientation){
    CTDocument1 doc = document.getDocument();
    CTBody body = doc.getBody();
    CTSectPr section = body.addNewSectPr();
    XWPFParagraph para = document.createParagraph();
    CTP ctp = para.getCTP();
    CTPPr br = ctp.addNewPPr();
    br.setSectPr(section);
    CTPageSz pageSize = section.getPgSz();
    if(orientation.equals("landscape")){
        pageSize.setOrient(STPageOrientation.LANDSCAPE);
        pageSize.setW(BigInteger.valueOf(842 * 20));
        pageSize.setH(BigInteger.valueOf(595 * 20));
    }
    else{
        pageSize.setOrient(STPageOrientation.PORTRAIT);
        pageSize.setH(BigInteger.valueOf(842 * 20));
        pageSize.setW(BigInteger.valueOf(595 * 20));
    }
}
private void changeOrientation(CTSectPr section, String orientation) {
    CTPageSz pageSize = section.isSetPgSz? section.getPgSz() : section.addNewPgSz();
    if (orientation.equals("landscape")) {
        pageSize.setOrient(STPageOrientation.LANDSCAPE);
        pageSize.setW(BigInteger.valueOf(842 * 20));
        pageSize.setH(BigInteger.valueOf(595 * 20));
    } else {
        pageSize.setOrient(STPageOrientation.PORTRAIT);
        pageSize.setH(BigInteger.valueOf(842 * 20));
        pageSize.setW(BigInteger.valueOf(595 * 20));
    }
}

但是,这只工作一次,因此页面不能交替方向。必须首先是所有横向页面,然后是纵向页面,反之亦然。

根据OOXML规范-17.6.18 sectPr(Section Properties),在具有多个节的文档中,节属性(sectPr元素)存储为以下内容的子元素:

  • 本节最后一段,适用于除最后一段以外的所有章节 第节
  • 主体元素,用于最后一节
因此,要更改节的页面方向,应创建或定位相应的sectPr,并使用以下代码:

private void changeOrientation(XWPFDocument document, String orientation){
    CTDocument1 doc = document.getDocument();
    CTBody body = doc.getBody();
    CTSectPr section = body.addNewSectPr();
    XWPFParagraph para = document.createParagraph();
    CTP ctp = para.getCTP();
    CTPPr br = ctp.addNewPPr();
    br.setSectPr(section);
    CTPageSz pageSize = section.getPgSz();
    if(orientation.equals("landscape")){
        pageSize.setOrient(STPageOrientation.LANDSCAPE);
        pageSize.setW(BigInteger.valueOf(842 * 20));
        pageSize.setH(BigInteger.valueOf(595 * 20));
    }
    else{
        pageSize.setOrient(STPageOrientation.PORTRAIT);
        pageSize.setH(BigInteger.valueOf(842 * 20));
        pageSize.setW(BigInteger.valueOf(595 * 20));
    }
}
private void changeOrientation(CTSectPr section, String orientation) {
    CTPageSz pageSize = section.isSetPgSz? section.getPgSz() : section.addNewPgSz();
    if (orientation.equals("landscape")) {
        pageSize.setOrient(STPageOrientation.LANDSCAPE);
        pageSize.setW(BigInteger.valueOf(842 * 20));
        pageSize.setH(BigInteger.valueOf(595 * 20));
    } else {
        pageSize.setOrient(STPageOrientation.PORTRAIT);
        pageSize.setH(BigInteger.valueOf(842 * 20));
        pageSize.setW(BigInteger.valueOf(595 * 20));
    }
}

根据OOXML规范-17.6.18 sectPr(Section Properties),在具有多个节的文档中,节属性(sectPr元素)存储为以下内容的子元素:

  • 本节最后一段,适用于除最后一段以外的所有章节 第节
  • 主体元素,用于最后一节
因此,要更改节的页面方向,应创建或定位相应的sectPr,并使用以下代码:

private void changeOrientation(XWPFDocument document, String orientation){
    CTDocument1 doc = document.getDocument();
    CTBody body = doc.getBody();
    CTSectPr section = body.addNewSectPr();
    XWPFParagraph para = document.createParagraph();
    CTP ctp = para.getCTP();
    CTPPr br = ctp.addNewPPr();
    br.setSectPr(section);
    CTPageSz pageSize = section.getPgSz();
    if(orientation.equals("landscape")){
        pageSize.setOrient(STPageOrientation.LANDSCAPE);
        pageSize.setW(BigInteger.valueOf(842 * 20));
        pageSize.setH(BigInteger.valueOf(595 * 20));
    }
    else{
        pageSize.setOrient(STPageOrientation.PORTRAIT);
        pageSize.setH(BigInteger.valueOf(842 * 20));
        pageSize.setW(BigInteger.valueOf(595 * 20));
    }
}
private void changeOrientation(CTSectPr section, String orientation) {
    CTPageSz pageSize = section.isSetPgSz? section.getPgSz() : section.addNewPgSz();
    if (orientation.equals("landscape")) {
        pageSize.setOrient(STPageOrientation.LANDSCAPE);
        pageSize.setW(BigInteger.valueOf(842 * 20));
        pageSize.setH(BigInteger.valueOf(595 * 20));
    } else {
        pageSize.setOrient(STPageOrientation.PORTRAIT);
        pageSize.setH(BigInteger.valueOf(842 * 20));
        pageSize.setW(BigInteger.valueOf(595 * 20));
    }
}

根据OOXML规范-17.6.18 sectPr(Section Properties),在具有多个节的文档中,节属性(sectPr元素)存储为以下内容的子元素:

  • 本节最后一段,适用于除最后一段以外的所有章节 第节
  • 主体元素,用于最后一节
因此,要更改节的页面方向,应创建或定位相应的sectPr,并使用以下代码:

private void changeOrientation(XWPFDocument document, String orientation){
    CTDocument1 doc = document.getDocument();
    CTBody body = doc.getBody();
    CTSectPr section = body.addNewSectPr();
    XWPFParagraph para = document.createParagraph();
    CTP ctp = para.getCTP();
    CTPPr br = ctp.addNewPPr();
    br.setSectPr(section);
    CTPageSz pageSize = section.getPgSz();
    if(orientation.equals("landscape")){
        pageSize.setOrient(STPageOrientation.LANDSCAPE);
        pageSize.setW(BigInteger.valueOf(842 * 20));
        pageSize.setH(BigInteger.valueOf(595 * 20));
    }
    else{
        pageSize.setOrient(STPageOrientation.PORTRAIT);
        pageSize.setH(BigInteger.valueOf(842 * 20));
        pageSize.setW(BigInteger.valueOf(595 * 20));
    }
}
private void changeOrientation(CTSectPr section, String orientation) {
    CTPageSz pageSize = section.isSetPgSz? section.getPgSz() : section.addNewPgSz();
    if (orientation.equals("landscape")) {
        pageSize.setOrient(STPageOrientation.LANDSCAPE);
        pageSize.setW(BigInteger.valueOf(842 * 20));
        pageSize.setH(BigInteger.valueOf(595 * 20));
    } else {
        pageSize.setOrient(STPageOrientation.PORTRAIT);
        pageSize.setH(BigInteger.valueOf(842 * 20));
        pageSize.setW(BigInteger.valueOf(595 * 20));
    }
}

根据OOXML规范-17.6.18 sectPr(Section Properties),在具有多个节的文档中,节属性(sectPr元素)存储为以下内容的子元素:

  • 本节最后一段,适用于除最后一段以外的所有章节 第节
  • 主体元素,用于最后一节
因此,要更改节的页面方向,应创建或定位相应的sectPr,并使用以下代码:

private void changeOrientation(XWPFDocument document, String orientation){
    CTDocument1 doc = document.getDocument();
    CTBody body = doc.getBody();
    CTSectPr section = body.addNewSectPr();
    XWPFParagraph para = document.createParagraph();
    CTP ctp = para.getCTP();
    CTPPr br = ctp.addNewPPr();
    br.setSectPr(section);
    CTPageSz pageSize = section.getPgSz();
    if(orientation.equals("landscape")){
        pageSize.setOrient(STPageOrientation.LANDSCAPE);
        pageSize.setW(BigInteger.valueOf(842 * 20));
        pageSize.setH(BigInteger.valueOf(595 * 20));
    }
    else{
        pageSize.setOrient(STPageOrientation.PORTRAIT);
        pageSize.setH(BigInteger.valueOf(842 * 20));
        pageSize.setW(BigInteger.valueOf(595 * 20));
    }
}
private void changeOrientation(CTSectPr section, String orientation) {
    CTPageSz pageSize = section.isSetPgSz? section.getPgSz() : section.addNewPgSz();
    if (orientation.equals("landscape")) {
        pageSize.setOrient(STPageOrientation.LANDSCAPE);
        pageSize.setW(BigInteger.valueOf(842 * 20));
        pageSize.setH(BigInteger.valueOf(595 * 20));
    } else {
        pageSize.setOrient(STPageOrientation.PORTRAIT);
        pageSize.setH(BigInteger.valueOf(842 * 20));
        pageSize.setW(BigInteger.valueOf(595 * 20));
    }
}


您如何更改一个部分的方向?(代码应该可以帮助我们发现问题)如果您在Word中创建一个简单的两页文档,其中有一个横向和一个纵向,然后在Apache POI中阅读,POI如何查看页面大小?如果您解压缩.docx文件(它是xml文件的压缩),它会将其视为上一页的方向,你能看到word用什么xml结构来编码方向的改变吗?我认为它添加了一个我的代码没有做的标记,这与分节符有关。你如何只改变一个节的方向?(代码应该可以帮助我们发现问题)如果您在Word中创建一个简单的两页文档,其中有一个横向和一个纵向,然后在Apache POI中阅读,POI如何查看页面大小?如果您解压缩.docx文件(它是xml文件的压缩),它会将其视为上一页的方向,你能看到word用什么xml结构来编码方向的改变吗?我认为它添加了一个我的代码没有做的标记,这与分节符有关。你如何只改变一个节的方向?(代码应该可以帮助我们发现问题)如果您在Word中创建一个简单的两页文档,其中有一个横向和一个纵向,然后在Apache POI中阅读,POI如何查看页面大小?如果您解压缩.docx文件(它是xml文件的压缩),它会将其视为上一页的方向,你能看到word用什么xml结构来编码方向的改变吗?我认为它添加了一个我的代码没有做的标记,这与分节符有关。你如何只改变一个节的方向?(代码应该可以帮助我们发现问题)如果您在Word中创建一个简单的两页文档,其中有一个横向和一个纵向,然后在Apache POI中阅读,POI如何查看页面大小?如果您解压缩.docx文件(它是xml文件的压缩),它会将其视为上一页的方向,你能看到word用什么xml结构来编码方向的变化吗?我想它添加了一个我的代码没有做的标记,这与分节符有关。在横向标题不起作用的情况下,有什么解决方案吗@bbharIn横向标头不工作,有解决方案吗@bbharIn横向标头不工作,有解决方案吗@bbharIn横向标头不工作,有解决方案吗@比哈尔