我尝试使用org.apache.poi
创建报告。我已经用表创建了模板,我想复制行和插入信息。一个单元格包含两个段落和它们之间的小表。
所以,我想有时删除表,但XWPFTableCell
没有所需的方法。只有1个}}。
如何删除单元格内的表格?
它是细胞克隆方法的代码
removeParagraph(int p1)
答案 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);
}
}