Java 如何将连续分节符添加到XWPFDocument?

Java 如何将连续分节符添加到XWPFDocument?,java,apache-poi,Java,Apache Poi,我想在XWPFDocument的同一页上有两个部分。第一节应该只有一列,第二节应该有两列。目前,我正在使用以下代码: CTBody body = document.getDocument().getBody(); // 1-column section section = body.addNewSectPr(); columns = CTColumns.Factory.newInstance(); columns.setNum(new BigInteger("1")); section.set

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

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);
这将生成两个列数正确的节,但这些节不在同一页上如何应用连续分节符而不是下一页分节符?

需要注意

例如:

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

 }
}
直到
apachepoi4.1.2
为止,此代码需要所有模式的完整jar
ooxml模式-*.jar
,如中所述


Word中多栏章节的原则如下:

默认情况下-不使用特殊设置-Word使用单列部分

如果章节设置需要更改,则需要为上述章节设置章节设置的段落。该段落上面的所有正文元素均使用这些设置。该段落之后的所有正文元素都位于一个新的段落中,并使用下一个段落的设置(具有段落设置)或使用文档正文中的段落设置

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


使用ApachePOI5.0.0在
poi-ooxml-full-5.0.0.jar
中删除了
org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff
。和
CTColumns.setEqualWidth
CTColumns.setep
现在使用
java.langObject
作为属性类型

因此,现在必须:

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