如何向 XWPFDocument 添加连续分节符? [英] How to add continuous section break to XWPFDocument?

查看:124
本文介绍了如何向 XWPFDocument 添加连续分节符?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在 XWPFDocument 的同一页面上有 2 个部分.第一部分应该只有 1 列,第二部分应该有 2 列.目前,我正在使用以下代码:

I would like to have 2 sections on the same page in XWPFDocument. First section should have only 1 column, second section should have 2 columns. Currently, I am using following code:

CTBody body = document.getDocument().getBody();

// 1-column section
section = body.addNewSectPr();
columns = CTColumns.Factory.newInstance();
columns.setNum(new BigInteger("1"));
section.setCols(columns);

paragraph = document.createParagraph();
paragraph.getCTP().addNewPPr().setSectPr(section);
run = paragraph.createRun();
run.setText(firstSectionContent);

//2-column section
section = body.addNewSectPr();
columns = CTColumns.Factory.newInstance();
columns.setNum(new BigInteger("2"));
section.setCols(columns);

paragraph = document.createParagraph();
paragraph.getCTP().addNewPPr().setSectPr(section);
run = paragraph.createRun();
run.setText(secondSectionContent);

这会生成 2 个具有正确列数的部分,但这些部分不在同一页上.如何应用连续分节符而不是下一页分节符?

This produces 2 sections with correct number of columns, but the sections are not on the same page. How to apply continuous section break instead of next page section break?

推荐答案

CTSectPr 需要是 CTSectType 连续.

示例:

import java.io.File;
import java.io.FileOutputStream;

import java.math.BigInteger;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.BreakType;
import org.apache.poi.xwpf.usermodel.Borders;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDocument1;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTColumns;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTColumn;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDocGrid;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STDocGrid;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STSectionMark;

public class Word2ColumnPage {
 public static void main(String[] args) throws Exception {

  XWPFDocument document= new XWPFDocument();

  XWPFParagraph paragraph = document.createParagraph();
  XWPFRun run=paragraph.createRun();  
  run.setText("One column on top. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.");

  paragraph = document.createParagraph();

  //paragraph with section setting for one column section above
  paragraph = document.createParagraph();
  CTSectPr ctSectPr = paragraph.getCTP().addNewPPr().addNewSectPr();
  CTColumns ctColumns = ctSectPr.addNewCols();
  ctColumns.setNum(BigInteger.valueOf(1));

  //left column

  paragraph = document.createParagraph();
  run=paragraph.createRun();  
  run.setText("The left side");
  paragraph = document.createParagraph();
  run=paragraph.createRun();  
  run.setText("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.");

  paragraph = document.createParagraph();

  // right column 

  //paragraph with column break
  paragraph = document.createParagraph();
  run=paragraph.createRun();  
  run.addBreak(BreakType.COLUMN);
  run=paragraph.createRun();  
  run.setText("The right side");
  //left border for the paragrapphs on right side
  paragraph.setBorderLeft(Borders.THREE_D_EMBOSS);
  paragraph.getCTP().getPPr().getPBdr().getLeft().setSz(BigInteger.valueOf(20));

  paragraph = document.createParagraph();
  run=paragraph.createRun();  
  run.setText("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.");
  paragraph.setBorderLeft(Borders.THREE_D_EMBOSS);
  paragraph.getCTP().getPPr().getPBdr().getLeft().setSz(BigInteger.valueOf(20));

  paragraph = document.createParagraph();
  paragraph.setBorderLeft(Borders.THREE_D_EMBOSS);
  paragraph.getCTP().getPPr().getPBdr().getLeft().setSz(BigInteger.valueOf(20));

  //paragraph with section break continuous for two column section above
  paragraph = document.createParagraph();
  ctSectPr = paragraph.getCTP().addNewPPr().addNewSectPr();
  ctSectPr.addNewType().setVal(STSectionMark.CONTINUOUS);
  ctColumns = ctSectPr.addNewCols();
  ctColumns.setNum(BigInteger.valueOf(2));
  ctColumns.setEqualWidth(STOnOff.OFF);
  ctColumns.setSep(STOnOff.ON);
  CTColumn ctColumn = ctColumns.addNewCol();
  ctColumn.setW(BigInteger.valueOf(6000));
  ctColumn.setSpace(BigInteger.valueOf(300));
  ctColumn = ctColumns.addNewCol();
  ctColumn.setW(BigInteger.valueOf(3000));
  paragraph.setBorderLeft(Borders.THREE_D_EMBOSS);
  paragraph.getCTP().getPPr().getPBdr().getLeft().setSz(BigInteger.valueOf(20));

  paragraph = document.createParagraph();
  run=paragraph.createRun();  
  run.setText("One column on bottom");

  paragraph = document.createParagraph();
  run=paragraph.createRun();  
  run.setText("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.");

  //section setting continuous for one column section above
  CTDocument1 ctDocument = document.getDocument();
  CTBody ctBody = ctDocument.getBody();
  ctSectPr = ctBody.addNewSectPr();
  ctSectPr.addNewType().setVal(STSectionMark.CONTINUOUS);
  ctColumns = ctSectPr.addNewCols();
  ctColumns.setNum(BigInteger.valueOf(1));

  FileOutputStream out = new FileOutputStream("Word2ColumnPage.docx");  
  document.write(out);
  out.close();
  document.close();

 }
}

直到 apache poi 4.1.2 此代码需要 ooxml-schemas-*.jar 中提到的所有模式的完整 jarhttps://poi.apache.org/faq.html#faq-N10025" rel="nofollow noreferrer">FAQ-N10025.

Up to apache poi 4.1.2 this code needs the full jar of all of the schemas ooxml-schemas-*.jar as mentioned in FAQ-N10025.

Word中多栏段的原理如下:

The principle of sections having multiple columns in Word are as follows:

默认情况下 - 不使用特殊设置 - Word 使用一栏部分.

Per default - using no special settings - Word uses a one column section.

如果部分设置发生变化,则需要一个包含上面部分的部分设置的段落.该段落上方的所有正文元素都使用这些设置.该段落之后的所有正文元素都在一个新的部分中,并使用具有部分设置的下一个段落的设置或使用文档正文中的部分设置.

If section settings shall change, then a paragraph with section settings for the section above is needed. All body elements above that paragraph use those settings. All body elements after that paragraph are in a new section and use settings of next paragraph having section settings or use sections settings in document body.

最后一节above的最后一节设置需要在正文设置中.

At last section settings for last section above needs to be in body settings.

使用 apache poi 5.0.0poi-ooxml-full-5.0 中删除了 org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff.0.jar.CTColumns.setEqualWidthCTColumns.setSep 现在使用 java.langObject 作为属性类型.

Using apache poi 5.0.0 the org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff was removed in poi-ooxml-full-5.0.0.jar. And CTColumns.setEqualWidth and CTColumns.setSep uses java.langObject as attribute type now.

所以一定是现在:

  //ctColumns.setEqualWidth(STOnOff.OFF);
  ctColumns.setEqualWidth("0");
  //ctColumns.setSep(STOnOff.ON);
  ctColumns.setSep("1");

这篇关于如何向 XWPFDocument 添加连续分节符?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆