Easyexcel导出图片,固定单元格宽度自动高度保持图片比例

Easyexcel导出图片,固定单元格宽度自动高度保持图片比例

工作中有个导出需求,在导出的数据中有个图片。然后平常一直在使用 easyexcel,但在导出图片这块官方的案例中只是给出了 @ContentRowHeight(100) @ColumnWidth(100 / 8) 的方式进行设置,但我的每条数据图片比例可能存在差异,为了避免图片的比例失衡,找了个解决方法

灵感来源:如何根据单元格内容设置不同的样式?
这个Github上的一个issue,提到了使用 继承AbstractCellStyleStrategy 的方式来自定义单元格

并且你也能在源代码中,easyexcel-core 的 module 下的style包下找到一些 Strategy 类,这些源代码中带的样式策略,其中你能找到一个叫 LongestMatchColumnWidthStyleStrategy 的类。该类有个dataLength方法,该方法便通过swith cell 类型判断来决定 cell 单元格的宽度,我们可以以此为思路修改下写一个自己的 Strategy。
该方法中的类型使用了 CellDataTypeEnum 枚举,但可以注意到该枚举中没有图片的类型,经过 debug 发现当单元格是图片时它会是 EMPTY 类型,且 imageDataList 属性可以看到我们塞进去的图片。有图片就能只能宽高,同时 Cell 类也能拿到单元行我也就能设置行高如下面的代码

switch (type) {
    case STRING:
        return cellData.getStringValue().getBytes().length;
    case BOOLEAN:
        return cellData.getBooleanValue().toString().getBytes().length;
    case NUMBER:
        return cellData.getNumberValue().toString().getBytes().length;
    // 如果是图片返回图片的宽度,并设置row的高度为图片的高度
    case EMPTY:
        if (cellData.getImageDataList() != null && !cellData.getImageDataList().isEmpty()) {
            BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(cellData.getImageDataList().get(0).getImage()));
            int originalWidth = bufferedImage.getWidth();
            int originalHeight = bufferedImage.getHeight();

            // 计算与210的宽度的比例
            double ratio = (double) 210 / originalWidth;
            int newWidth = 210; // 设置新宽度为210
            int newHeight = (int) (originalHeight * ratio);

            // 将像素转换为磅以设置Excel行高
            double heightInPoints = newHeight * 0.75;
            cell.getRow().setHeightInPoints((float) heightInPoints);

            // 将像素转换为Excel中的宽度单位
            double charWidth = 7.0; // 默认的Excel字体中标准字符的大致宽度
            double estimatedChars = newWidth / charWidth;
            return (int) estimatedChars; // 以Excel单位返回调整后的宽度
        }
        return -1;
    default:
        return -1;
}

210 是我想固定的图片像素宽度,最终宽度会被计算为单元格的宽度,而高度会被等比例计算为行上磅为单位的高度

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现在EasyExcel导出相同内容单元格合并,可以使用EasyExcel提供的合并单元格的方法。具体步骤如下: 1. 在实体类中添加一个用于记录合并单元格行数的属性。 ```java public class ExcelData { // 其他属性... private int rowspan; // getter、setter方法... } ``` 2. 在导出数据,对相邻且内容相同的单元格进行合并,并设置合并的行数。 ```java // 创建ExcelWriter对象 ExcelWriter writer = EasyExcel.write(outputStream, ExcelData.class).build(); // 获取数据列表 List<ExcelData> dataList = getDataList(); // 写入数据 Sheet sheet = writer.sheet().build(); int rowIndex = 0; for (ExcelData data : dataList) { Row row = sheet.row(rowIndex++); // 写入其他单元格数据... // 合并相同内容单元格 if (rowIndex > 1 && data.getContent().equals(dataList.get(rowIndex - 2).getContent())) { data.setRowspan(dataList.get(rowIndex - 2).getRowspan() + 1); } else { data.setRowspan(1); } if (data.getRowspan() > 1) { CellRangeAddress range = new CellRangeAddress(rowIndex - data.getRowspan(), rowIndex - 1, 0, 0); sheet.addMergedRegion(range); } } // 关闭ExcelWriter对象 writer.finish(); ``` 其中,`addMergedRegion`方法用于添加合并单元格的区域,第一个参数为合并单元格左上角的单元格行号,第二个参数为合并单元格右下角的单元格行号,第三个参数为合并单元格左上角的单元格列号,第四个参数为合并单元格右下角的单元格列号。 这样就可以实现在EasyExcel导出相同内容单元格合并的功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值