使用docx4j重新启动多个表中的计算

时间:2017-02-08 14:38:31

标签: docx4j

我需要使用docx4j创建一个.docx文件,其中包含许多基于模板的表。

表必须包含具有自动编号的行。

从模板中复制表后,在连续表中继续计算,如下所示:

表1

  1. 列表项
  2. 列表项
  3. 表2

    1. 列表项
    2. 列表项
    3. 如何为每个表重新启动计数以获得此值:

      表1

      1. 列表项
      2. 列表项
      3. 表2

        1. 列表项
        2. 列表项
        3. 我发现存在可能有用的NumberingDefinitionPart.restart()方法但是如何在每个表上应用它?

          你能用java代码举例吗?

1 个答案:

答案 0 :(得分:0)

对于第一个之后的每个表,您需要创建/添加列表级别覆盖到编号定义部分,然后在numPr中使用它(即在您的"列表项")。

您提到的方法是这样的:

/**
 * For the given list numId, restart the numbering on the specified
 * level at value val.  This is done by creating a new list (ie <w:num>)
 * which uses the existing w:abstractNum.
 * @param numId
 * @param ilvl
 * @param val
 * @return 
 */
public long restart(long numId, long ilvl, long val) 
    throws InvalidOperationException {

    // Find the abstractNumId

    // (Ensure maps are initialised)
    if (em == null ) { 
        getEmulator();
    }
    ListNumberingDefinition existingLnd = instanceListDefinitions.get( Long.toString(numId) );
    if (existingLnd==null) {
        throw new InvalidOperationException("List " + numId + " does not exist");
    }
    BigInteger abstractNumIdVal = existingLnd.getNumNode().getAbstractNumId().getVal();

    // Generate the new <w:num
    long newNumId = instanceListDefinitions.size() + 1;

    org.docx4j.wml.ObjectFactory factory = Context.getWmlObjectFactory();

    Num newNum = factory.createNumberingNum();
    newNum.setNumId( BigInteger.valueOf(newNumId) );
    AbstractNumId abstractNumId = factory.createNumberingNumAbstractNumId();
    abstractNumId.setVal(abstractNumIdVal);
    newNum.setAbstractNumId(abstractNumId);

    LvlOverride lvlOverride = factory.createNumberingNumLvlOverride();
    lvlOverride.setIlvl(BigInteger.valueOf(ilvl));
    newNum.getLvlOverride().add(lvlOverride);

    StartOverride start = factory.createNumberingNumLvlOverrideStartOverride();
    start.setVal(BigInteger.valueOf(val));
    lvlOverride.setStartOverride(start);

    // Add it to the jaxb object and our hashmap
    ((Numbering)getJaxbElement()).getNum().add(newNum);
    ListNumberingDefinition listDef 
        = new ListNumberingDefinition(newNum, abstractListDefinitions);
    instanceListDefinitions.put(listDef.getListNumberId(), listDef);        

    // Return the new numId
    return newNumId;

}

https://github.com/plutext/docx4j/blob/master/src/samples/docx4j/org/docx4j/samples/NumberingRestart.java是使用它的一个例子。

在w:p&#34;列表项&#34;中的numPr元素中:

                    <w:pPr>
                        <w:numPr>
                            <w:ilvl w:val="0"/>
                            <w:numId w:val="1"/>
                        </w:numPr>
                    </w:pPr>

将level(ilvl)设置为您在方法中使用的级别;将numid设置为方法返回的值。

如示例中所述,在使用newNumId的第一段之后,后续段落是否使用该段落或原始numId并不重要。