You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java移动Excel的XSSFSheet图片?新增行时下移图片

解决方案:XSSFSheet添加新行时下移所有图片

经过多次尝试和踩坑,终于搞定了这个问题,分享给有同样需求的朋友:

核心思路

Excel中的图片是通过锚点(TwoCellAnchor)定位的,我们只需要修改锚点的起始和结束行号,就能实现图片下移。之前的报错是因为缺少完整的ooxml-schemas依赖,解决依赖后,调整代码细节即可正常运行。

完整代码示例

import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTTwoCellAnchor;
import java.util.List;

public void shiftImagesDown(XSSFSheet sheet, int startRow, int rowsToShift) {
    // 获取sheet对应的绘图对象
    XSSFDrawing drawing = (XSSFDrawing) sheet.getDrawingPatriarch();
    if (drawing == null) {
        // 没有图片,直接返回
        return;
    }

    // 获取所有图片的双单元格锚点列表
    List<CTTwoCellAnchor> drawingAnchors = drawing.getCTDrawing().getTwoCellAnchorList();

    // 遍历每个锚点,修改行号实现下移
    for (CTTwoCellAnchor anchor : drawingAnchors) {
        long fromRow = anchor.getFrom().getRow();
        long toRow = anchor.getTo().getRow();

        // 只移动起始行在目标行及以下的图片
        if (fromRow >= startRow) {
            anchor.getFrom().setRow(fromRow + rowsToShift);
            anchor.getTo().setRow(toRow + rowsToShift);
        }
    }
}

关键注意事项

  • 依赖问题:必须确保项目引入了完整的ooxml-schemas相关Jar包,否则会抛出NoClassDefFoundError。推荐直接使用poi-ooxml-full依赖(替代普通的poi-ooxml),它包含了所有必要的ooxml schema类。
  • 参数说明:startRow是你插入新行的起始位置,rowsToShift是要下移的行数(比如添加1行就传1)。
  • 空值判断:先判断drawing是否为null,避免sheet中没有图片时出现空指针异常。

调用这个方法后,再添加新行,图片就会自动下移到对应的位置啦!

内容的提问来源于stack exchange,提问作者kscherrer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:46:30