【EasyExcel等比例缩小导出图片】

devtools/2024/11/20 22:48:29/

EasyExcel等比例缩小导出图片

  • 一、背景
  • 二、思路
  • 三、代码

一、背景

  • 使用EasyExcel导出excel文件,但是需要同时导出图片信息,且图片信息不能影响行高和单元格宽度,图片本身被导出时,不能因为压缩导致图片变形

二、思路

  • 使用EasyExcel最主要是要实现各种hadler,通过实现CellWriteHandler,获取单元格图片,进行图片压缩;
  • 由于excel的行高和单元格宽度换算方式完全不一样,所以要通过计算得出最合适的压缩比例
  • (excel宽度 / 字符宽度转换为标准字符宽度) * 估算的字符到像素的转换因子 = 宽度像素;
  • (excel高度 / 点转换为英寸) * 英寸转换为像素 = 行高像素;
  • 最终宽度像素或者行高像素 根据行高与像素的转换因子 ,计算出需要设置的单元格间距值,即可正常缩小图片

三、代码

java">public static class QuotationCustomCellWriteHandler implements CellWriteHandler {// 256分之一的字符宽度转换为标准字符宽度。public static final int STANDARD_CHARACTER_WIDTH = 256;// 7.5是一个估算的字符到像素的转换因子public static final float CHARACTER_2_PIXEL_FACTOR = 7.5f;// 将点转换为英寸,因为1点 = 1/72英寸。public static final int PIXEL_2_INCH_FACTOR = 72;// 英寸转换为像素,其中96是常用的DPI(每英寸像素数)值。public static final int DPI = 96;// 行高与像素的转换因子public static final float ROW_HEIGHT_2_PIXEL_FACTOR = 1.3333f;/*** 外界传入的行高,内部查不到*/private final int rowHeight;public QuotationCustomCellWriteHandler(int rowHeight) {this.rowHeight = rowHeight;}@Overridepublic void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,WriteCellData<?> cellData, Cell cell, Head head, Integer relativeRowIndex,Boolean isHead) {boolean noImageValue = Objects.isNull(cellData) || cellData.getImageDataList() == null || cellData.getImageDataList().isEmpty();if (Objects.equals(Boolean.TRUE, isHead) || noImageValue) {return;}Sheet sheet = cell.getSheet();ImageData imageData = cellData.getImageDataList().get(0);imageData.setRelativeLastRowIndex(0);imageData.setRelativeLastColumnIndex(0);// 处理图像缩放 - 等比例缩放try (ByteArrayInputStream bis = new ByteArrayInputStream(imageData.getImage())) {BufferedImage image = ImageIO.read(bis);int targetWidth = (int) ((double) sheet.getColumnWidth(cell.getColumnIndex()) / STANDARD_CHARACTER_WIDTH * CHARACTER_2_PIXEL_FACTOR);int targetHeight = (int) (rowHeight * 1.0 / PIXEL_2_INCH_FACTOR * DPI);// 计算图像的缩放比例double scaleX = (double) targetWidth / image.getWidth();double scaleY = (double) targetHeight / image.getHeight();double scale = Math.min(scaleX, scaleY);// 计算缩放后的图像大小int scaledWidth = (int) (image.getWidth() * scale);int scaledHeight = (int) (image.getHeight() * scale);// 计算上下左右四个角的空白int topPadding = (targetHeight - scaledHeight) / 2;int bottomPadding = targetHeight - scaledHeight - topPadding;int leftPadding = (targetWidth - scaledWidth) / 2;int rightPadding = targetWidth - scaledWidth - leftPadding;// 行高(点)= 像素高度 / 1.3333imageData.setTop((int) (topPadding / ROW_HEIGHT_2_PIXEL_FACTOR));imageData.setBottom((int) (bottomPadding / ROW_HEIGHT_2_PIXEL_FACTOR));imageData.setLeft((int) (leftPadding / ROW_HEIGHT_2_PIXEL_FACTOR));imageData.setRight((int) (rightPadding / ROW_HEIGHT_2_PIXEL_FACTOR));} catch (Exception e) {log.error("QuotationCustomCellWriteHandler afterCellDataConverted err", e);}CellWriteHandler.super.afterCellDataConverted(writeSheetHolder, writeTableHolder, cellData, cell, head, relativeRowIndex, isHead);}}

http://www.ppmy.cn/devtools/135597.html

相关文章

【FMC169】基于VITA57.1标准的4发4收射频子模块(基于ADRV9026)

产品概述 FMC169 是一款基于VITA57.1 标准规范&#xff0c;实现4 收4发的射频子模块&#xff0c;该板卡基于ADI的捷变收发器ADRV9026作为处理核心&#xff0c;射频工作范围为75MHz~6GHz频段&#xff0c;发射最大信号带宽450MHz&#xff0c;接收最大带宽200MHz&#xff0c;提供…

React教程第三节之JSX用法介绍特点

1、JSX 介绍 JSX 是javascript XML的缩写&#xff0c;表示可以再 js 中书写 html 语法&#xff1b;虽然看起来像是 HTML 但是在React 中使用时 Babel 会将 JSX 转化为 javascript 语法&#xff1b; 2、JSX的语法 a、在 大括号中书写表达式&#xff1a; { 表达式 }&#xff1…

卷积神经网络(CNN)对 CIFAR-10 数据集进行图像分类

代码功能 数据预处理&#xff1a;使用 transforms 对图像进行归一化和转换。 模型定义&#xff1a;SimpleCNN 包含两层卷积层和两层全连接层&#xff0c;使用 ReLU 激活函数和最大池化层。 优化器和损失函数&#xff1a;使用 Adam 优化器和交叉熵损失函数。 训练循环&#xff…

LabVIEW多通道面阵烟雾透过率测试系统

LabVIEW面阵烟雾透过率测试系统通过高精度多通道数据采集和实时处理技术&#xff0c;能够实现对固体推进剂烟雾的透过率进行精确测量。系统利用了LabVIEW的图形化编程环境及其丰富的设备驱动接口&#xff0c;有效提升了测试的自动化程度和数据处理的实时性。 项目背景&#xf…

详细分析ipvsadm负载均衡的命令

目录 前言1. 基本知识2. 命令参数3. 拓展 前言 LVS四层负载均衡架构详解Lvs推荐阅读&#xff1a;添加链接描述 1. 基本知识 ipvsadm 是用于管理和配置 Linux 服务器上 IP Virtual Server (IPVS) 的工具&#xff0c;是 Linux 提供的一个负载均衡模块&#xff0c;支持多种负载…

AI风向标|算力与通信的完美融合,SRM6690解锁端侧AI的智能密码

当前&#xff0c;5G技术已经成为推动数字经济和实体经济深度融合的关键驱动力&#xff0c;进入5G发展的下半场&#xff0c;5G与AI的融合正推动诸多行业的数字化转型和创新发展&#xff0c;终端侧AI和端云混合式AI将广泛应用于各类消费终端和各行各业。 在推动5G和AI与各行业场…

uniapp 自定义加载组件,全屏加载,局部加载 (微信小程序)

效果图 全屏加载 页面加载使用 局部加载 列表加载里面使用 使用gif html <template><view><view class"" v-if"typeFullScreen"><view class"loading" v-if"show"><view class""><i…

Spring Boot图书馆管理系统:疫情时代的管理工具

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了疫情下图书馆管理系统的开发全过程。通过分析疫情下图书馆管理系统管理的不足&#xff0c;创建了一个计算机管理疫情下图书馆管理系统的方案。文章介绍了疫情下图…