当前版本 5.2.2 ,版本不同,写法略有差异
- poi-5.2.2 操作word 【段落】
- poi-5.2.2 操作word 【表格】
- poi-5.2.2 操作word【单元格、行、列】
- poi 5.2.2 操作word【页眉页脚】
- poi 5.2.2 操作word【纸张、边距】
- poi-5.2.2 操作word【图片操作相关】
- poi 5.2.2 操作word【目录】
本文所需依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-full</artifactId>
<version>5.2.2</version>
</dependency>
- 添加目录样式,并获取
/**
* 设置目录(当前允许 三个级别的目录 )
* 使用规则: 返回值 List<String> 为各级标题的样式值,以下标取用,如:设置一级标题,取集合index=0的值
*/
public static List<String> addToc(XWPFDocument document){
List<XWPFParagraph> paragraphs = document.getParagraphs();
XWPFParagraph catalogP = null;
if(!paragraphs.isEmpty() && paragraphs.get(paragraphs.size() - 1).isPageBreak()){
catalogP = paragraphs.get(paragraphs.size() - 1);
}else{
catalogP = document.createParagraph();
}
setStyle(catalogP.createRun() , "微软雅黑" , 16 ,true ,"目 录" ,"");
catalogP.setAlignment(ParagraphAlignment.CENTER);
XWPFParagraph paragraph = document.createParagraph();
CTSimpleField ctSimpleField = paragraph.getCTP().addNewFldSimple();
ctSimpleField.setInstr("TOC \\o \"1-4\" \\h \\z \\u");
ctSimpleField.setDirty(true);
ctSimpleField.addNewR().addNewT().setStringValue("<<请");
CTR ctr = ctSimpleField.addNewR();
ctr.addNewT().setStringValue("右击");
ctr.addNewRPr().addNewColor().setVal("FF0000");
ctSimpleField.addNewR().addNewT().setStringValue("该文本,在弹出框中选择【");
CTR ctr2 = ctSimpleField.addNewR();
ctr2.addNewT().setStringValue("更新域");
ctr2.addNewRPr().addNewColor().setVal("FF0000");
ctSimpleField.addNewR().addNewT().setStringValue("】 ,方可为您生成目录>>");
String head1 = "1"; //一级标题
String head2 = "2"; //二级标题
String head3 = "3"; //三级标题
addCustomHeadingStyle(document , head1 , 1);
addCustomHeadingStyle(document , head2 , 2);
addCustomHeadingStyle(document , head3 , 3);
List<String> tocHeades = new ArrayList<>();
tocHeades.add(head1);
tocHeades.add(head2);
tocHeades.add(head3);
setPageBreak(document);
return tocHeades;
}
/**
* 增加自定义标题样式。这里用的是stackoverflow的源码
* @param docxDocument 目标文档
* @param strStyleId 样式名称
* @param headingLevel 样式级别
*/
private static void addCustomHeadingStyle(XWPFDocument docxDocument, String strStyleId, int headingLevel) {
CTStyle ctStyle = CTStyle.Factory.newInstance();
ctStyle.setStyleId(strStyleId);
CTString styleName = CTString.Factory.newInstance();
styleName.setVal(strStyleId);
ctStyle.setName(styleName);
CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance();
indentNumber.setVal(BigInteger.valueOf(headingLevel));
// lower number > style is more prominent in the formats bar
ctStyle.setUiPriority(indentNumber);
CTOnOff onoffnull = CTOnOff.Factory.newInstance();
ctStyle.setUnhideWhenUsed(onoffnull);
// style shows up in the formats bar
ctStyle.setQFormat(onoffnull);
// style defines a heading of the given level
CTPPrGeneral ctpPrGeneral = CTPPrGeneral.Factory.newInstance();
ctpPrGeneral.setOutlineLvl(indentNumber);
ctStyle.setPPr(ctpPrGeneral);
XWPFStyle style = new XWPFStyle(ctStyle);
// is a null op if already defined
XWPFStyles styles = docxDocument.createStyles();
style.setType(STStyleType.PARAGRAPH);
styles.addStyle(style);
}
- 给段落设置目录样式
/**
* 设置段落标题样式,用来生成目录
* @param headStyle 即通过 addToc 方法获取到的目录样式集合中的一个
*/
public static void setParagraphStyle(XWPFParagraph paragraph , String headStyle){
paragraph.setStyle(headStyle);
}
- 使用方法
使用 addDoc() 方法获取目录样式 集合List
使用 setParagraphStyle() 方法给某个段落设置目录样式
目录所在位置受当前 Document 上下文影响,设置完成后需手动更新目录域