Apache POI,在同一文档中创建项目符号和编号列表

时间:2017-12-07 08:44:06

标签: java apache apache-poi bulletedlist numbered-list

我正在尝试使用apache poi创建一个包含bulled point和编号列表的文档。我希望得到这样的结果。

名单:

  • List1 item 0
  • List1 item 1
  • List1 item 2

列表后的段落。

List2:

  1. List2项目0
  2. List2 item 1
  3. List2 item 2
  4. list2之后的段落。

    如果我尝试在两个不同的文档中创建两个列表,一切正常。

    但是如果它们在同一个文件中,我只会得到第一个创建的样式。

    例如,在下面的代码中,我首先创建项目符号列表,然后创建编号项列表。但生成的文档包含两个项目符号列表。

    我想问题是文档认为第一个列表仍然是打开的,并且同样的样式也适用于下一个列表。

    如何告知文档列表是“已关闭”? 有什么建议吗?

    非常感谢!

    import java.io.FileOutputStream;
    import java.math.BigInteger;
    
    import org.apache.poi.xwpf.usermodel.XWPFAbstractNum;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFNumbering;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.poi.xwpf.usermodel.XWPFRun;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNum;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTNumbering;
    
    public class QuickTest {
    
    static String cTAbstractNumBulletXML = 
            "<w:abstractNum xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:abstractNumId=\"0\">"
                    + "<w:multiLevelType w:val=\"hybridMultilevel\"/>"
                    + "<w:lvl w:ilvl=\"0\"><w:start w:val=\"1\"/><w:numFmt w:val=\"bullet\"/><w:lvlText w:val=\"\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr><w:rPr><w:rFonts w:ascii=\"Symbol\" w:hAnsi=\"Symbol\" w:hint=\"default\"/></w:rPr></w:lvl>"
                    + "<w:lvl w:ilvl=\"1\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"bullet\"/><w:lvlText w:val=\"o\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr><w:rPr><w:rFonts w:ascii=\"Courier New\" w:hAnsi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"default\"/></w:rPr></w:lvl>"
                    + "<w:lvl w:ilvl=\"2\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"bullet\"/><w:lvlText w:val=\"\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr><w:rPr><w:rFonts w:ascii=\"Wingdings\" w:hAnsi=\"Wingdings\" w:hint=\"default\"/></w:rPr></w:lvl>"
                    + "</w:abstractNum>";
    
    static String cTAbstractNumDecimalXML = 
            "<w:abstractNum xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:abstractNumId=\"0\">"
                    + "<w:multiLevelType w:val=\"hybridMultilevel\"/>"
                    + "<w:lvl w:ilvl=\"0\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr></w:lvl>"
                    + "<w:lvl w:ilvl=\"1\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1.%2\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr></w:lvl>"
                    + "<w:lvl w:ilvl=\"2\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1.%2.%3\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr></w:lvl>"
                    + "</w:abstractNum>";
    
    public static void main(String[] args) throws Exception {
    
        XWPFDocument document = new XWPFDocument();
    
        {
            XWPFParagraph paragraph = document.createParagraph();
            XWPFRun run=paragraph.createRun();  
            run.setText("The List:");
    
            CTNumbering cTNumbering = CTNumbering.Factory.parse(cTAbstractNumBulletXML);
    
            CTAbstractNum cTAbstractNum = cTNumbering.getAbstractNumArray(0);
    
            XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
    
            XWPFNumbering numbering = document.createNumbering();
    
            BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);
    
            BigInteger numID = numbering.addNum(abstractNumID);
            System.out.println("numID: " + numID);
            for (int i = 0; i < 3; i++) {
                paragraph = document.createParagraph();
                paragraph.setNumID(numID);
                run = paragraph.createRun();
                run.setText("List1 item " + i); 
                if (i < 2) paragraph.setSpacingAfter(0);
            }
    
            paragraph = document.createParagraph();
            run=paragraph.createRun();  
            run.setText("Paragraph after the list.");
        }
    
        {
            XWPFParagraph paragraph = document.createParagraph();
            XWPFRun run=paragraph.createRun();  
            run.setText("The List2:");
            CTNumbering cTNumbering = CTNumbering.Factory.parse(cTAbstractNumDecimalXML);
            CTAbstractNum cTAbstractNum = cTNumbering.getAbstractNumArray(0);
    
            XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
    
            XWPFNumbering numbering = document.createNumbering();
    
            BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);
    
            BigInteger numID = numbering.addNum(abstractNumID);
            System.out.println("numID: " + numID);
            for (int i = 0; i < 3; i++) {
                paragraph = document.createParagraph();
                paragraph.setNumID(numID);
                run = paragraph.createRun();
                run.setText("List2 item " + i); 
                if (i < 2) paragraph.setSpacingAfter(0);
            }
            paragraph = document.createParagraph();
            run=paragraph.createRun();  
            run.setText("Paragraph after the list2.");
        }
    
        FileOutputStream out = new FileOutputStream("CreateWordBulletAndDecimalList.docx");    
        document.write(out);
    
        System.out.println("CreateWordBulletOrDecimalList written successully");
    }
    }
    

0 个答案:

没有答案