0

我正在尝试使用 apache poi 创建一个包含圆点和编号列表的文档。我想要这样的结果。

名单:

  • 列表 1 项目 0
  • 清单 1 项目 1
  • 清单 1 项目 2

列表后的段落。

清单 2:

  1. 清单 2 项目 0
  2. 清单 2 项目 1
  3. List2 项目 2

清单 2 之后的段落。

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

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

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

我猜问题是文档认为第一个列表仍然打开,并且对下一个列表也应用了相同的样式。

我如何告诉文档一个列表是“关闭的”?有什么建议吗?

非常感谢!

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");
}
}
4

0 回答 0