Как переместить изображения в лист Excel с Java - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть XSSFSheet с изображениями в конце моих используемых строк.При добавлении новой строки я хотел бы сдвинуть все изображения на одну строку вниз.Я нашел этот похожий вопрос о перемещении диаграмм и попытался использовать ту часть ответа, которая выполняет фактическое перемещение диаграмм, потому что, похоже, это будет работать и для изображений.

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.
(Правка: теперь я обнаружил, что эту ошибку можно устранить, предоставив полный jar всех схем ooxml-schemas, как упоминалосьв FAQ-N10025 . спасибо @Axel Richter)

После опробования нескольких различных подходов я нашел способ сделать это.Так как это заняло у меня так много времени, а информации об этом пока нет, я решил опубликовать свои выводы здесь на SO.
Пожалуйста, найдите мое решение в моем собственном ответе.Приветствия

1 Ответ

0 голосов
/ 19 февраля 2019

Следующий код получает Патриарх Рисования листа, перебирает все его фигуры, и если фигура имеет тип 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)
    }
}
...