docx4j创建无编号/项目符号列表

时间:2013-06-13 13:35:43

标签: list docx4j

我想在我的Word文档中使用docx4j创建一个带有项目符号的未编号列表。我找到了以下代码来完成这项工作。但无论我尝试什么,生成的列表都是编号列表!我使用Word 2010,德语版和docx4j-2.8.1。

    wordMLPackage = WordprocessingMLPackage.createPackage();

    ObjectFactory factory = new org.docx4j.wml.ObjectFactory();
    P p = factory.createP();

    org.docx4j.wml.Text t = factory.createText();
    t.setValue(text);

    org.docx4j.wml.R run = factory.createR();
    run.getContent().add(t);

    p.getContent().add(run);

    org.docx4j.wml.PPr ppr = factory.createPPr();

    p.setPPr(ppr);

    // Create and add <w:numPr>
    NumPr numPr = factory.createPPrBaseNumPr();
    ppr.setNumPr(numPr);

    // The <w:ilvl> element
    Ilvl ilvlElement = factory.createPPrBaseNumPrIlvl();
    numPr.setIlvl(ilvlElement);
    ilvlElement.setVal(BigInteger.valueOf(0));

    // The <w:numId> element
    NumId numIdElement = factory.createPPrBaseNumPrNumId();
    numPr.setNumId(numIdElement);
    numIdElement.setVal(BigInteger.valueOf(1));

    wordMLPackage.getMainDocumentPart().addObject(p);

有人可以帮助我生成一个真正的无序,buletted列表吗?!

3 个答案:

答案 0 :(得分:2)

希望这会对你有所帮助。

import org.docx4j.XmlUtils;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.NumberingDefinitionsPart;
import org.docx4j.wml.*;

import javax.xml.bind.JAXBException;
import java.io.File;
import java.math.BigInteger;


public class GenerateBulletedList {

private static final String BULLET_TEMPLATE ="<w:numbering xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">" +
        "<w:abstractNum w:abstractNumId=\"0\">" +
        "<w:nsid w:val=\"12D402B7\"/>" +
        "<w:multiLevelType w:val=\"hybridMultilevel\"/>" +
        "<w:tmpl w:val=\"AECAFC2E\"/>" +
        "<w:lvl w:ilvl=\"0\" w:tplc=\"04090001\">" +
        "<w:start w:val=\"1\"/>" +
        "<w:numFmt w:val=\"bullet\"/>" +
        "<w:lvlText w:val=\"\uF0B7\"/>" +
        "<w:lvlJc w:val=\"left\"/>" +
        "<w:pPr>" +
        "<w:ind w:left=\"360\" w:hanging=\"360\"/>" +
        "</w:pPr>" +
        "<w:rPr>" +
        "<w:rFonts w:ascii=\"Symbol\" w:hAnsi=\"Symbol\" w:hint=\"default\"/>" +
        "</w:rPr>" +
        "</w:lvl>" +
        "</w:abstractNum>"+
        "<w:num w:numId=\"1\">" +
        "<w:abstractNumId w:val=\"0\"/>" +
        "</w:num>" +
        "</w:numbering>";

public static void main(String[] args) throws Exception{

    WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
    createBulletedList(wordMLPackage);
    wordMLPackage.save(new File("Output.docx"));
}

private static void createBulletedList(WordprocessingMLPackage wordMLPackage)throws Exception{
    NumberingDefinitionsPart ndp = new NumberingDefinitionsPart();
    wordMLPackage.getMainDocumentPart().addTargetPart(ndp);
    ndp.setJaxbElement((Numbering) XmlUtils.unmarshalString(BULLET_TEMPLATE));
    wordMLPackage.getMainDocumentPart().addObject(createParagraph("India"));
    wordMLPackage.getMainDocumentPart().addObject(createParagraph("United Kingdom"));
    wordMLPackage.getMainDocumentPart().addObject(createParagraph("France"));

}
private static P createParagraph(String country) throws JAXBException {

    ObjectFactory factory = new org.docx4j.wml.ObjectFactory();
    P p = factory.createP();
    String text =
            "<w:r xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">" +
                    " <w:rPr>" +
                    "<w:b/>" +
                    " <w:rFonts w:ascii=\"Arial\" w:cs=\"Arial\"/><w:sz w:val=\"16\"/>" +
                    " </w:rPr>" +
                    "<w:t>" + country + "</w:t>" +
                    "</w:r>";

    R r = (R) XmlUtils.unmarshalString(text);
    org.docx4j.wml.R run = factory.createR();
    run.getContent().add(r);

    p.getContent().add(run);
    org.docx4j.wml.PPr ppr = factory.createPPr();

    p.setPPr(ppr);
    // Create and add <w:numPr>
    PPrBase.NumPr numPr = factory.createPPrBaseNumPr();
    ppr.setNumPr(numPr);


    // The <w:numId> element
    PPrBase.NumPr.NumId numIdElement = factory.createPPrBaseNumPrNumId();
    numPr.setNumId(numIdElement);
    numIdElement.setVal(BigInteger.valueOf(1));
    return p;
}


}

答案 1 :(得分:0)

您发布的代码显示“使用列表编号1,级别0”。

显然该列表是编号列表。

查看项目符号定义部分中的项目符号列表,然后使用该列表。

如果您没有项目符号列表,则需要添加它。您可以将示例docx上传到docx4j在线演示,以便为您生成适当的内容。或者查看ListHelper以获取如何完成的示例。

答案 2 :(得分:0)

private static P getBulletedParagraph(Text text, int i) {
    ObjectFactory objCreator = Context.getWmlObjectFactory(); // Object used to 
    create other Docx4j Objects
    P paragraph = objCreator.createP(); // create Paragraph object
    PPr ppr = objCreator.createPPr(); // create ppr
    NumPr numpr = objCreator.createPPrBaseNumPr();
    PStyle style = objCreator.createPPrBasePStyle();// create Pstyle
    NumId numId = objCreator.createPPrBaseNumPrNumId();
    numId.setVal(BigInteger.valueOf(6));
    numpr.setNumId(numId);
    R run = objCreator.createR();
    Br br = objCreator.createBr();
    run.getContent().add(text);

    Ilvl iLevel = objCreator.createPPrBaseNumPrIlvl(); // create Ilvl Object
    numpr.setIlvl(iLevel);
    iLevel.setVal(BigInteger.valueOf(i)); // Set ilvl value
    ppr.setNumPr(numpr);
    style.setVal("ListParagraph"); // set value to ListParagraph
    ppr.setPStyle(style);
    paragraph.setPPr(ppr);
    paragraph.getContent().add(run);
 // paragraph.getContent().add(br); Adds line breaks
    return paragraph;
}

我相信这就是您要寻找的。此方法将返回一个带有项目符号的段落对象。如果在返回段落之前取消注释最后一行,则您的段落对象还将包含换行符。如果您不知道,“ Ilvl”或“ eye-level”表示缩进。与按常规方式键入文档时单击选项卡按钮相同。将ilvl元素设置为1与单击选项卡1次相同。将其设置为2与单击选项卡按钮两次相同,依此类推。因此,无论您给多少个数字都没有关系。尽管它将改变您得到的子弹的类型。真正重要的是麻木。将numid设置为6将使您获得项目符号而不是数字。您还需要将PPr样式设置为“ ListParagraph”。我希望这有帮助。