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

ops/2024/11/17 21:56:27/

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/ops/134236.html

相关文章

关于在Reverse函数中不能使用L=s而是*L=*s的原因分析

完整代码地址&#xff1a; https://blog.csdn.net/2301_76819732/article/details/143807340?spm1001.2014.3001.5502 如果使用Ls; 的话&#xff0c;当输出结果时&#xff0c;会发现内容为空。 我感到很奇怪&#xff0c;按照我的设想&#xff0c;Ls;会把s指向的地址赋给L。 但…

1.两数之和-力扣(LeetCode)

题目&#xff1a; 解题思路&#xff1a; 在解决这个问题之前&#xff0c;首先要明确两个点&#xff1a; 1、参数returnSize的含义是返回答案的大小&#xff08;数目&#xff09;&#xff0c;由于这里的需求是寻找数组中符合条件的两个数&#xff0c;那么当找到这两个数时&#…

「Qt Widget中文示例指南」如何创建一个窗口标志?(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 窗口标志要么是类型…

数仓建设之Oracle常见语法学习

1. 字符串截取 select substr(AAA-BBB, 1, instr(AAA-BBB, -, -1) - 1) 值 from dual; --AAA select substr(AAA-BBB, instr(AAA-BBB, -, -1) 1) 值 from dual; --BBB2. 帆软报表有参数SQL select a.agency_code, a.agency_name, a.agency_typefrom dw.dim_ta_subred_agency…

Ubuntu22.04.2 k8s部署

k8s介绍 简单介绍 通俗易懂的解释&#xff1a; Kubernetes&#xff08;也被称为 K8s&#xff09;就像是一个大管家&#xff0c;帮你管理你的云计算服务。想象一下&#xff0c;你有很多个小程序&#xff08;我们称之为“容器”&#xff09;&#xff0c;每个都在做不同的事情&…

Tiktok对接和内容发布申请流程

这段时间在搞AI生成视频&#xff0c;希望用户能一键发布到Tiktok&#xff0c;因此研究了一下Tiktok的开发者申请流程&#xff0c;发现好复杂&#xff0c;同时也发现Tiktok的开发也跟我一样&#xff0c;挺草台班子的 0、流程简述 废话不多说&#xff0c;Tiktok的开发者申请和…

确保以管理员权限运行 Visual Studio 开发者命令提示符

文章目录 解决方法&#xff1a;1. 以管理员身份运行命令提示符2. 改变目录权限3. 改变项目目录位置4. 检查文件系统权限 总结&#xff1a; ********************************************************************** ** Visual Studio 2022 Developer Command Prompt v17.12.0 …

基于微信小程序的高校实习管理系统设计与实现,LW+源码+讲解

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自…