符华- 2024-06-13 11:25 采纳率: 80%
浏览 41
已结题

easypoi或poi中,导出excel带echarts图片,如何根据图片宽高计算图片位置的结束行和列?

前端传过来一张echarts图片(base64),我需要将这张图片插入到表格中,我想根据图片的宽高计算图片位置的结束行、结束列,并且不让图片变形。比如设置图片插入的位置是从第一行、第一列开始,然后计算结束行、结束列。有什么办法实现吗?


目前代码如下:

/**
 * 导出Excel,并追加图片
 * @param workbook   XSSFWorkbook对象
 * @param sheetIndex sheet的下标索引
 */
public static void insertImage(Workbook workbook,int sheetIndex, String imgBase64){
    Sheet sheet = workbook.getSheetAt(sheetIndex);
    String[] imgUrlArr = imgBase64.split("base64,");  //拆分base64编码后部分
    byte[] buffer = new BASE64Decoder().decodeBuffer(imgUrlArr[1]);
    BufferedImage bufferImg = ImageIO.read(new ByteArrayInputStream(buffer));
    // 除以9、25是假设我的单元格列宽为9(字符),行高为25(磅)
    Double col = bufferImg.getWidth() * 0.5 / 9 / (bufferImg.getWidth() / bufferImg.getHeight()); // (图片缩小0.5倍)结束单元格的列号
    Double row = bufferImg.getHeight() * 0.5 / 25; // (图片缩小0.5倍)结束单元格的行号
    try {
        // 创建图片锚点并设置偏移量
        Drawing<?> patri = sheet.createDrawingPatriarch();
        ClientAnchor anchor = patri.createAnchor(0,0,0,0,0,0,col.intValue(),row.intValue());
        // 添加图片到工作簿并设置锚点
        int pictureIdx = workbook.addPicture(buffer, Workbook.PICTURE_TYPE_PNG);
        patri.createPicture(anchor, pictureIdx);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
  • 写回答

3条回答 默认 最新

  • 关注

    上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    在导出Excel中插入echarts图片时,可以使用poi或easypoi库生成Excel,并使用echarts将图表渲染为图片后,将图片插入到Excel中。当需要根据图片的宽高进行位置计算时,可以先确定图片缩放比例,然后根据表格的行高和列宽计算图片的结束行和列。

    下面是一个算法的示例:

    1. 读取图片的base64编码并解码为字节数组buffer。
    2. 使用ImageIO将字节数组buffer转换为BufferedImage。
    3. 计算缩放比例,假设图片缩小为原来的0.5倍,则缩放比例为0.5。
    4. 计算结束行和列,假设列宽为9字符,行高为25磅,假设图片的原始宽度为imgWidth,原始高度为imgHeight。则计算结束列的公式为:结束列 = 图片宽度 * 缩放比例 / 列宽;计算结束行的公式为:结束行 = 图片高度 * 缩放比例 / 行高。
    5. 使用poi的DrawingPatriarch对象创建图片锚点,并设置偏移量为0,0,0,0。锚点的起始行和列为0,0,结束行和列为计算得到的结束行和列。
    6. 将图片添加到工作簿并设置锚点。

    下面是修改后的代码示例:

    /**
     * 导出Excel,并追加图片
     * @param workbook   XSSFWorkbook对象
     * @param sheetIndex sheet的下标索引
     */
    public static void insertImage(Workbook workbook,int sheetIndex, String imgBase64){
        Sheet sheet = workbook.getSheetAt(sheetIndex);
        String[] imgUrlArr = imgBase64.split("base64,");  //拆分base64编码后部分
        byte[] buffer;
        try {
            buffer = Base64.getDecoder().decode(imgUrlArr[1]);
            BufferedImage bufferImg = ImageIO.read(new ByteArrayInputStream(buffer));
            // 除以9、25是假设我的单元格列宽为9(字符),行高为25(磅)
            double scale = 0.5; // 图片缩小0.5倍
            int col = (int) (bufferImg.getWidth() * scale / 9); //(图片缩小0.5倍)结束单元格的列号
            int row = (int) (bufferImg.getHeight() * scale / 25); //(图片缩小0.5倍)结束单元格的行号
            // 创建图片锚点并设置偏移量
            Drawing<?> patri = sheet.createDrawingPatriarch();
            ClientAnchor anchor = patri.createAnchor(0,0,0,0,0,0,col,row);
            // 添加图片到工作簿并设置锚点
            int pictureIdx = workbook.addPicture(buffer, Workbook.PICTURE_TYPE_PNG);
            patri.createPicture(anchor, pictureIdx);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    

    注意:

    1. 在计算结束行和列时,需要将结果进行转换为整数类型,以保持单元格的整数单位。
    2. 在Base64解码时,使用了Java 8中提供的Base64类的getDecoder方法。

    希望上述解决方案能够帮助到你。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月21日
  • 创建了问题 6月13日

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表