使用POI向Excel单元格插入图片如何固定宽度不受列宽自动调整影响
解决方案
有两类实现方式可以避免自动列宽调整影响图片尺寸,可根据你的业务场景选择:
方案1:调整操作执行顺序(成本最低)
把列宽自动调整的逻辑放到插入图片之前执行,插入图片后再单独设置图片覆盖列的列宽,这样后续不会再触发列宽变更,自然不会影响图片尺寸。
执行顺序示例:
- 填充所有单元格文本内容
- 执行全列
autoSizeColumn逻辑 - 插入图片,同时设置图片所在行的行高、覆盖列的列宽
方案2:跳过图片覆盖列的自动调整
如果你的业务逻辑必须先插入图片再调整列宽,可以提前记录所有图片覆盖的列索引,自动调整列宽时跳过这些列即可,代码示例:
// 提前记录所有图片覆盖的列索引,当前示例中图片覆盖2列 Set<Integer> imgCoverColumns = new HashSet<>(); imgCoverColumns.add(cell.getColumnIndex()); imgCoverColumns.add(cell.getColumnIndex() + 1); // 自动调整列宽时跳过图片覆盖列 for (; i < max; i++) { if (!imgCoverColumns.contains(i)) { xlsWorkbook.getSheet().autoSizeColumn(i); } }
方案3:硬编码固定图片尺寸(完全脱离列宽限制)
如果必须要调整图片所在列的列宽,又要图片尺寸完全不受单元格大小影响,可以直接修改图片的底层XML属性固定宽高,代码示例:
// 图片创建完成后执行以下逻辑 // 1. 定义你需要的固定宽高,单位为像素 int fixedWidthPx = 400; int fixedHeightPx = 300; // 2. 先重置图片为原始比例,避免锚点拉伸影响 myPicture.resize(1.0); // 3. 手动设置图片固定宽高(转换为EMU单位,1像素=9525 EMU) myPicture.getCTPicture().getSpPr().getXfrm().getExt().setCx((long) fixedWidthPx * 9525); myPicture.getCTPicture().getSpPr().getXfrm().getExt().setCy((long) fixedHeightPx * 9525); // 4. 设置锚点类型为不随单元格变动调整 myAnchor.setAnchorType(AnchorType.DONT_MOVE_AND_RESIZE);
该方案下无论后续如何调整单元格列宽行高,图片的尺寸都不会发生变化。
内容的提问来源于stack exchange,提问作者LeO
相关产品推荐
相关产品推荐

