【问题标题】:docx4j create unnumbered / bullet listdocx4j 创建未编号/项目符号列表
【发布时间】:2013-06-09 22:07:21
【问题描述】:

我想在我的 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);

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

【问题讨论】:

    标签: list docx4j


    【解决方案1】:

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

    显然该列表是一个编号列表。

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

    如果那里没有项目符号列表,则需要添加它。您可以将示例 docx 上传到 docx4j 在线演示,让它为您生成适当的内容。或查看ListHelper 了解如何完成此操作的示例。

    【讨论】:

    【解决方案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;
    }
    
    
    }
    

    【讨论】:

    • Not my downvote。必须来自使用 Java 并认为您的答案很差的人。
    【解决方案3】:
    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 与单击 tab 1 次相同。将其设置为 2 与单击选项卡按钮 2 次相同,依此类推。所以不管你给它什么数字。虽然它会改变你得到的子弹类型。真正重要的是numid。将 numid 设置为 6 将为您提供项目符号而不是数字。您还需要将 PPr 样式设置为“ListParagraph”。我希望这有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 2015-05-17
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多