如何用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
相关产品推荐
相关产品推荐

