我需要使用docx4j创建一个.docx文件,其中包含许多基于模板的表。
表必须包含具有自动编号的行。
从模板中复制表后,在连续表中继续计算,如下所示:
表1
表2
如何为每个表重新启动计数以获得此值:
表1
表2
我发现存在可能有用的NumberingDefinitionPart.restart()方法但是如何在每个表上应用它?
你能用java代码举例吗?
答案 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;
}
在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并不重要。