提问者:小点点

在Java中使用ApachePOIXWPF在同一word文档中的横向和纵向页面


我正在尝试使用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));
    }
}

谢谢!


共2个答案

匿名用户

事实证明需要一个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));
    }
}

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

匿名用户

根据OOXML规范ECMA-376,第四版,第1部分-基础知识和标记语言参考-17.6.18 sectPr(部分属性),在具有多个部分的文档中,部分属性(sectPr元素)存储为以下子元素:

  • 本节的最后一段,对于除最后一节之外的所有部分,
  • body元素,用于最后一节。

因此,要更改部分的页面方向,应该创建或定位相应的sectPr并使用以下代码:

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));
    }
}