gpt4 book ai didi

java - XWPFTableCell 删除 bodyElement(表)

转载 作者:太空宇宙 更新时间:2023-11-04 13:29:02 25 4
gpt4 key购买 nike

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

所以,我有时想删除表格,但 XWPFTableCell 没有所需的方法。仅removeParagraph(int p1)

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

这是cell的clone方法的代码

public static void cloneCell(XWPFTableCell clone, XWPFTableCell source) {
CTTcPr cttcPr = clone.getCTTc().isSetTcPr() ? clone.getCTTc().getTcPr() : clone.getCTTc().addNewTcPr();
cttcPr.set(source.getCTTc().getTcPr());

int indexParag = 0, indexTable = 0;
for (IBodyElement iBodyElement : source.getBodyElements()) {
BodyElementType beType = iBodyElement.getElementType();
if (beType == BodyElementType.PARAGRAPH) {
XWPFParagraph sourceParag = (XWPFParagraph)iBodyElement;
XWPFParagraph cloneParag = indexParag < clone.getParagraphs().size() ? clone.getParagraphs().get(indexParag) : clone.addParagraph();
cloneParagraph(cloneParag, sourceParag);
indexParag++;
} else if (beType == BodyElementType.TABLE) {
XWPFTable sourceTable = (XWPFTable)iBodyElement;
XWPFTable cloneTable = indexTable < clone.getTables().size() ? clone.getTables().get(indexTable) : clone.insertNewTbl(sourceTable.getCTTbl().newCursor());
if (cloneTable == null)
cloneTable = new XWPFTable(clone.getCTTc().addNewTbl(), clone);

cloneTable(cloneTable, sourceTable);
indexTable++;
}
}
}

最佳答案

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

该方法从 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);
}
}

关于java - XWPFTableCell 删除 bodyElement(表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32368817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com