Java 如何将连续分节符添加到XWPFDocument?
我想在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
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
为止,此代码需要所有模式的完整jarooxml模式-*.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");