我有一个XSSFSheet
,在已使用的行的末尾有图像。添加新行时,我想将所有图像向下移动一行。我发现this similar question与移动图表有关,并尝试使用答案来进行图表的实际移动,因为它看起来也适用于图像。
java.util.List<CTTwoCellAnchor> drawingAnchors = ((XSSFDrawing)sheet.getDrawingPatriarch()).getCTDrawing().getTwoCellAnchorList();
for (CTTwoCellAnchor drawingAnchor : drawingAnchors) {
int fromRow = drawingAnchor.getFrom().getRow();
int toRow = drawingAnchor.getTo().getRow();
if (fromRow >= startRow) {
drawingAnchor.getFrom().setRow(fromRow + n);
drawingAnchor.getTo().setRow(toRow + n);
}
}
但是这不起作用,而是抛出了NoClassDefFoundError
。
(编辑:我现在发现,可以通过提供FAQ-N10025中提到的所有模式ooxml-schemas
的完整jar来解决此错误。谢谢@Axel Richter)
尝试了几种不同的方法后,我找到了一种方法。由于花了我很长时间,而且还没有任何相关信息,所以我决定将自己的发现发布在SO上。
请在我自己的答案中找到我的解决方案。干杯
答案 0 :(得分:2)
下面的代码获取工作表的绘图父级,遍历其所有形状,如果形状为XSSFPicture
类型,它将通过其XSSFClientAnchor
修改行索引。
int moveRowsBy = 1; // 1 will move the images 1 row down. moveRowsBy can be negative to move up
XSSFDrawing drawing = sheet.getDrawingPatriarch();
for (XSSFShape shape : drawing.getShapes()) {
if (shape instanceof XSSFPicture){
XSSFClientAnchor anchor = ((XSSFPicture)shape).getClientAnchor();
anchor.setRow1(anchor.getRow1() +moveRowsBy);
anchor.setRow2(anchor.getRow2() +moveRowsBy);
// if needed you could change column too, using one of these:
// anchor.setCol1(newColumnInt)
// anchor.setCol1(anchor.getCol1() + moveColsBy)
}
}