XWPFTableCell删除bodyElement(表)

时间:2015-09-03 06:52:40

标签: java apache-poi cell xwpf

我尝试使用org.apache.poi创建报告。我已经用表创建了模板,我想复制行和插入信息。一个单元格包含两个段落和它们之间的小表。

所以,我想有时删除表,但XWPFTableCell没有所需的方法。只有1个}}。

如何删除单元格内的表格?

它是细胞克隆方法的代码

removeParagraph(int p1)

1 个答案:

答案 0 :(得分:0)

我使用这样的代码。有两种非常糟糕的方法直接访问单元格的字段。我找不到访问正文元素列表和表列表的正确方法。

该方法从startIndex开始从父级元素(文档主体元素或单元格元素)中删除元素,并且count显示要删除的元素数量。

注意:表中的最后一个元素必须是一个段落,因此请不要删除最后一个段落元素。将其清空(删除运行)。

public void removeElements(IBody parent, int startIndex, int count) {
    if (parent instanceof XWPFTableCell) {
        XWPFTableCell cell = (XWPFTableCell)parent;
        List<IBodyElement> bodyElementsRef = getBodyElementsRef(cell);
        for (int i = 0; i < count; i++) {
            IBodyElement element = bodyElementsRef.get(startIndex);
            if (element instanceof XWPFParagraph) {
                int realParIndex = getParagraphIndex(bodyElementsRef, (XWPFParagraph)element);
                cell.getParagraphs().remove(realParIndex);
                cell.getCTTc().removeP(realParIndex);
            } else if (element instanceof XWPFTable) {
                int realTableIndex = getTableIndex(bodyElementsRef, (XWPFTable) element);
                getTablesRef(cell).remove(realTableIndex);
                cell.getCTTc().removeTbl(realTableIndex);
            }
            bodyElementsRef.remove(startIndex);
        }
    }
    else {
        for (int i = 0; i < count; i++) {
            parent.getXWPFDocument().removeBodyElement(startIndex);
        }
    }
}

private int getParagraphIndex(List<IBodyElement> bodyElementsRef, XWPFParagraph paragraph) {
    int index = -1;
    for(IBodyElement elem : bodyElementsRef) {
        if (elem instanceof XWPFParagraph) {
            index++;
        }
        if (elem == paragraph) {
            return index;
        }
    }
    return -1;
}

private int getTableIndex(List<IBodyElement> bodyElementsRef, XWPFTable table) {
    int index = -1;
    for(IBodyElement elem : bodyElementsRef) {
        if (elem instanceof XWPFTable) {
            index++;
        }
        if (elem == table) {
            return index;
        }
    }
    return -1;
}

/**
 * It's a dirty hack but I cannot find proper way to remove elements from cell's body elements
 * @param cell
 * @return
 */
private List<IBodyElement> getBodyElementsRef(XWPFTableCell cell) {
    try {
        Field beField = cell.getClass().getDeclaredField("bodyElements");
        beField.setAccessible(true);
        return (List<IBodyElement>) beField.get(cell);
    } catch (NoSuchFieldException | IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}
/**
 * It's a dirty hack but I cannot find proper way to remove elements from cell's tables list
 * @param cell
 * @return
 */
private List<XWPFTable> getTablesRef(XWPFTableCell cell) {
    try {
        Field beField = cell.getClass().getDeclaredField("tables");
        beField.setAccessible(true);
        return (List<XWPFTable>) beField.get(cell);
    } catch (NoSuchFieldException | IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}