Java DOCX4J:向表中添加最后一行

Java DOCX4J:向表中添加最后一行,java,docx4j,Java,Docx4j,我帮助创建并修改了以下内容,用docx4j将行项目添加到word文档中的表中。我现在正试图将最后一行添加到我指定的表中,我做这件事花了很多时间。我试图避免把整件事都扔掉,然后重写它,但它越来越近了 我可以让它添加一行,在第二个for语句中添加以下内容,其中I是要检查的索引,但是它只复制上一行的全部内容,任何插入空白对象的尝试都会导致失败: lineItemsTables.getContent().add(newTableRow); 还有很多其他的地方,我试着把它放在一个额外的位置,但是我觉得我

我帮助创建并修改了以下内容,用docx4j将行项目添加到word文档中的表中。我现在正试图将最后一行添加到我指定的表中,我做这件事花了很多时间。我试图避免把整件事都扔掉,然后重写它,但它越来越近了

我可以让它添加一行,在第二个
for
语句中添加以下内容,其中
I
是要检查的索引,但是它只复制上一行的全部内容,任何插入空白对象的尝试都会导致失败:

lineItemsTables.getContent().add(newTableRow);
还有很多其他的地方,我试着把它放在一个额外的位置,但是我觉得我错过了一些基本的东西,在过去的两天里,我一直盯着它看,但都是徒劳的,我没有看到它

代码:

public Tbl createLineItemsTable(WordprocessingMLPackage输入、映射输入请求、字符串oid)抛出JAXBEException、SecurityException、IllegalArgumentException、NoSuchMethodException、IllegalAccessException、InvocationTargetException
{
List lineItems=getLineItemFromRequest(incomingRequest);
Tbl lineItemsTables=新Tbl();
如果(lineItems.size()>0)
{
字符串xpath=“//w:bookmarkStart[@w:name='LLINEITEMS']/../../../../../../…”;
List nodes=input.getMainDocumentPart().getJAXBNodesViaXPath(xpath,false);
Tbl lineTable=(Tbl)XmlUtils.unwrap(nodes.get(0));
lineItemsTables.setTblGrid(lineTable.getTblGrid());
lineItemsTables.setTblPr(lineTable.getTblPr());
Tr tableRows=(Tr)lineTable.getContent().get(1);
lineItemsTables.getContent().addAll(lineTable.getContent());
对于(int i=0;i

任何帮助都将不胜感激。

lineItemsTables.getContent().set(1,newTableRow);正在替换您的第二排。您的问题可能会更清楚。。。“导致失败”是什么意思?调试辅助工具是使用XmlUtils.marshalToString将对象转换为XML,这样您就可以看到自己在做什么。谢谢Jason。lineItemsTables.getContent().set(1,newTableRow);正在根据incomingrequest对象传递的行项目数添加行。我只是尝试填充所有内容,并在最后添加一个自定义行,我可以在其中插入一组已定义的字符串。
public Tbl createLineItemsTable(WordprocessingMLPackage input, Map incomingRequest, String oid) throws JAXBException, SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException
{
    List<Object> lineItems = getLineItemFromRequest(incomingRequest);
    Tbl lineItemsTables = new Tbl();
    if (lineItems.size() > 0)
    {
        String xpath = "//w:bookmarkStart[@w:name= 'LLINEITEMS']//..//..//..//..";
        List nodes = input.getMainDocumentPart().getJAXBNodesViaXPath(xpath, false);
        Tbl lineTable = (Tbl)XmlUtils.unwrap(nodes.get(0));
        lineItemsTables.setTblGrid(lineTable.getTblGrid());
        lineItemsTables.setTblPr(lineTable.getTblPr());
        Tr tableRows = (Tr)lineTable.getContent().get(1);
        lineItemsTables.getContent().addAll(lineTable.getContent());

        for (int i = 0; i < lineItems.size(); i++)
        {
            Object lineItem = (Object)lineItems.get(i);
            Tr newTableRow = (Tr)XmlUtils.deepCopy(tableRows);
            List tableCells = newTableRow.getContent();
            for (int ix = 0; ix < tableCells.size(); ix++)
            {
                Tc tableCell = (Tc)XmlUtils.unwrap(tableCells.get(ix));
                //Grab first element of these lists.  Table is formatted to only have one item in element list.
                P paragraph = (P)tableCell.getContent().get(0);
                R run = (R)paragraph.getContent().get(0);
                Text text = (Text)XmlUtils.unwrap(run.getContent().get(0));
                text.setValue(findLineItemValue(lineItem,text.getValue(), oid));
            }

            //Replace first row of table, then add all rows after.
            if (i == 0) {
                lineItemsTables.getContent().set(1, newTableRow);
            } else {
                lineItemsTables.getContent().add(newTableRow);
            }
        }
    }

    return lineItemsTables;
}