如何使用Apache POI在Word文件中创建节,子节和子节?

时间:2017-01-17 15:01:39

标签: java apache-poi

我使用Apache POI在Java中阅读Word文档,但我找不到任何创建部分,子部分等的引用。在Word文件中。此外,我正在尝试使用此添加部分的数量创建目录。我粘贴了一部分代码来向您展示我所做的事情:

   public static void main(String[] args) throws FileNotFoundException, IOException {

        File out = new File("POIExamlpe.docx");

        XWPFDocument document = new XWPFDocument();
        XWPFStyles styles = document.createStyles();

        XWPFWordExtractor we = new XWPFWordExtractor(document);
        System.out.println(we.getText());

        //Create multilevel  list in word with different styles, form the next level
        CreateParagraph(document, styles, "First Level@@Second Level@@First Level@@Second Level@@Three Level@@Second Level@@Three Level@@Second Level@@First Level");

        document.createTOC();
}   
public static void CreateParagraph(XWPFDocument doc, XWPFStyles style,String content ){
    for (String value : content.split("@@")) {
        XWPFParagraph para = doc.createParagraph();
        para.setVerticalAlignment(TextAlignment.CENTER);
        para.setNumID(BigInteger.valueOf(1));
        para.setStyle(heading1);
        if (value.contains("Second")) {   para.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(1));
            para.setStyle(heading2);
        }
        if(value.contains("Three")){     para.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(2));
            para.setStyle(heading4);
        }
        XWPFRun run = para.createRun(); 

}

我生成了这个document

但我希望生成类似this的内容。

1 个答案:

答案 0 :(得分:1)

这是否有效取决于您的pip install textblob --user。这必须包含POIExamlpe.docx内的编号定义。例如:

\word\numberings.xml

您的代码行

<w:abstractNum w:abstractNumId="0">
 <w:multiLevelType w:val="multilevel"/>
 <w:lvl w:ilvl="0">
  <w:start w:val="1"/>
  <w:numFmt w:val="decimal"/>
  <w:pStyle w:val="Heading1"/>
  <w:lvlText w:val="%1"/>
  <w:lvlJc w:val="left"/>
  <w:pPr>
   <w:ind w:hanging="432" w:left="432"/>
  </w:pPr>
 </w:lvl>

 <w:lvl w:ilvl="1">
  <w:start w:val="1"/>
  <w:numFmt w:val="decimal"/>
  <w:pStyle w:val="Heading2"/>
  <w:lvlText w:val="%1.%2"/>
  <w:lvlJc w:val="left"/>
  <w:pPr>
   <w:ind w:hanging="576" w:left="576"/>
  </w:pPr>
 </w:lvl>

 <w:lvl w:ilvl="2">
  <w:start w:val="1"/>
  <w:numFmt w:val="decimal"/>
  <w:pStyle w:val="Heading3"/>
  <w:lvlText w:val="%1.%2.%3"/>
  <w:lvlJc w:val="left"/>
  <w:pPr>
   <w:ind w:hanging="720" w:left="720"/>
  </w:pPr>
 </w:lvl>

</w:abstractNum>

<w:num w:numId="1">
 <w:abstractNumId w:val="0"/>
</w:num>

是指para.setNumID(BigInteger.valueOf(1)); 1,它引用定义编号的numID 0。

您的代码行

abstractNumId

指的是para.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(1)); 1,它定义了编号级别的样式。例如,在此级别ilvl

你怎么检查这个? <w:lvlText w:val="%1.%2"/>文件只是一个*.docx存档,包含ZIP个文件和特殊目录结构中的其他文件。因此,您可以解压缩此XML文件,并查看它。

要创建适当的模板,请创建一个新的*.docx文档,使用其中所有需要的标题并对其进行编号。将文件另存为Word。现在您可以删除内容并再次保存。现在解压缩此POIExamlpe.docx文件并查看*.docx