如何使用Java

时间:2019-02-19 13:52:31

标签: java apache-poi

我有一个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上。
请在我自己的答案中找到我的解决方案。干杯

1 个答案:

答案 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)
    }
}