apachePoi中XSSFClientAnchor图片坐标简述;填充多张图片

概述

业务中经常会遇到在单元格内填充图片的需求,而且要求指定图片在单元格内的位置。

一般都是用的apache的poi,设置图片坐标。

HSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2)

dx1 dy1 起始单元格中的x,y坐标.

dx2 dy2 结束单元格中的x,y坐标

col1,row1 指定起始的单元格,下标从0开始

col2,row2 指定结束的单元格 ,下标从0开始

在这里插入图片描述

在这里插入图片描述

demo

public static void main(String[] args) {byte[] imgBytes = ResourceUtil.readBytes("test.jpg");// 创建一个 ExcelWriterExcelWriter writer = ExcelUtil.getWriter("output.xlsx");// 获取 sheet 对象Sheet sheet = writer.getWorkbook().getSheetAt(0);int rowNum = 0; // 假设图片插入在第一行int colNum = 0; // 假设图片插入在第一列// 在指定的单元格内插入图片insertImagesToCell(sheet, rowNum, colNum, imgBytes);// 保存到文件writer.flush();
}private static void insertImagesToCell(Sheet sheet, int rowNum, int colNum, byte[] imageBytes) {// 获取 Excel 的工作簿并添加图片Workbook workbook = sheet.getWorkbook();// 获取 Drawing 对象Drawing drawing = sheet.getDrawingPatriarch();if (drawing == null) {drawing = sheet.createDrawingPatriarch();}// 创建 Excel 的行和列Row row = sheet.getRow(rowNum);if (row == null) {row = sheet.createRow(rowNum);}//创建单元格Cell cell = row.createCell(colNum);int pictureIdx = workbook.addPicture(imageBytes, Workbook.PICTURE_TYPE_JPEG);// 创建图片的定位点XSSFClientAnchor anchor = new XSSFClientAnchor();//图片起始列anchor.setCol1(colNum);//图片起始行anchor.setRow1(rowNum);//图片结束列anchor.setCol2(colNum + 1);//图片结束行anchor.setRow2(rowNum + 1);//图片左上角在开始单元格中的X坐标;>0向右;<0向左(有点类似html页面中的padding)anchor.setDx1(Units.EMU_PER_PIXEL * 100);//图片左上角在开始单元格中的Y坐标;>0向下;<0向上(有点类似html页面中的padding)anchor.setDy1(Units.EMU_PER_PIXEL *(100));//图片右下角在结束单元格中的X坐标;>0向右;<0向左anchor.setDx2(Units.EMU_PER_PIXEL *(-100));//图片右下角在结束单元格中的Y坐标;>0向下;<0向上anchor.setDy2(Units.EMU_PER_PIXEL *(-100));anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);// 创建并设置图片drawing.createPicture(anchor, pictureIdx);
}

效果图
在这里插入图片描述

填充多张图片demo
填充多张图片,且开始单元格和结束单元格为同一个单元格

public static void main(String[] args) {byte[] imgBytes = ResourceUtil.readBytes("test.jpg");// 创建一个 ExcelWriterExcelWriter writer = ExcelUtil.getWriter("output.xlsx");// 获取 sheet 对象Sheet sheet = writer.getWorkbook().getSheetAt(0);int rowNum = 0; // 假设图片插入在第一行int colNum = 0; // 假设图片插入在第一列// 在指定的单元格内插入图片insertImagesToCell(sheet, rowNum, colNum, imgBytes);// 保存到文件writer.flush();
}private static void insertImagesToCell(Sheet sheet, int rowNum, int colNum, byte[] imageBytes) {// 获取 Excel 的工作簿并添加图片Workbook workbook = sheet.getWorkbook();// 创建 Excel 的行和列Row row = sheet.getRow(rowNum);if (row == null) {row = sheet.createRow(rowNum);}//创建单元格Cell cell = row.createCell(colNum);// 边距int padding = Units.toEMU(20);// 计算每张图片的宽度和位置int numImages = 5;// 获取 Drawing 对象Drawing drawing = sheet.getDrawingPatriarch();if (drawing == null) {drawing = sheet.createDrawingPatriarch();}//上一张图片的左上角X坐标int preDx1 = 0;//上一张图片的右下角X坐标int preDx2 = 0;//图片宽度int defaultImgWidth = Units.toEMU(80);//图片高度;图片右下角相对结束单元格的y高度int defaultImgHeight = Units.toEMU(100);for (int i = 0; i < numImages; i++) {int pictureIdx = workbook.addPicture(imageBytes, Workbook.PICTURE_TYPE_JPEG);// 创建图片的定位点XSSFClientAnchor anchor = new XSSFClientAnchor();//图片起始列anchor.setCol1(colNum);//图片起始行anchor.setRow1(rowNum);//图片结束列anchor.setCol2(colNum);//图片结束行anchor.setRow2(rowNum);//上一张图片右下角的x坐标 + 图片间距int dx1 = preDx2 + padding;//当前图片的左上角x坐标 + 图片宽度int dx2 = dx1 + defaultImgWidth;//当前图片x坐标anchor.setDx1(dx1);//上边距anchor.setDy1(padding);//图片宽度anchor.setDx2(dx2);//图片高度anchor.setDy2(defaultImgHeight);anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);// 创建并设置图片drawing.createPicture(anchor, pictureIdx);preDx1 = dx1;preDx2 = dx2;}}

填充效果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/69347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos挂载镜像制作本地yum源,并补装图形界面

内网环境centos7.9安装图形页面内网环境制作本地yum源 上传镜像到服务器目录 创建目录并挂载镜像 #创建目录 cd /mnt/ mkdir iso#挂载 mount -o loop ./CentOS-7-x86_64-DVD-2009.iso ./iso #前面镜像所在目录&#xff0c;后面所挂载得目录#检查 [rootlocalhost mnt]# df -h…

ssti学习笔记(服务器端模板注入)

目录 一&#xff0c;ssti是什么 二&#xff0c;原理 所谓模板引擎&#xff08;三列&#xff0c;可滑动查看&#xff09; 三&#xff0c;漏洞复现 1&#xff0c;如何判断其所属的模板引擎&#xff1f; 2&#xff0c;判断清楚后开始注入 &#xff08;1&#xff09;Jinja2&a…

【前端】Python 闭包与JavaScript闭包的实现差异

目录 Python 闭包JavaScript 闭包 推荐超级课程&#xff1a; Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战 Python 闭包 如何定义&#xff1a; 在一个函数内部定义另一个函数&#xff0c;内部函数引用外部函数的变量。 def outer_function(text):…

【JVM详解二】常量池

一、常量池概述 JVM的常量池主要有以下几种&#xff1a; class文件常量池运行时常量池字符串常量池基本类型包装类常量池 它们相互之间关系大致如下图所示&#xff1a; 每个 class 的字节码文件中都有一个常量池&#xff0c;里面是编译后即知的该 class 会用到的字面量与符号引…

人工智能入门 数学基础 线性代数 笔记

必备的数学知识是理解人工智能不可或缺的要素&#xff0c;今天的种种人工智能技术归根到底都建立在数学模型之上&#xff0c;而这些数学模型又都离不开线性代数&#xff08;linear algebra&#xff09;的理论框架。 线性代数的核心意义&#xff1a;世间万事万物都可以被抽象成某…

C# Winform怎么设计串口,客户端和相机控件界面显示

首先我们必须把这个类创建好 INIAPI using System; using System.Text; using System.Runtime.InteropServices;namespace Ini {public class IniAPI{#region INI文件操作/** 针对INI文件的API操作方法&#xff0c;其中的节点&#xff08;Section)、键&#xff08;KEY&#x…

在 Windows 上使用 ZIP 包安装 MySQL 的详细步骤

以下是使用官方 ZIP 包在 Windows 上安装 MySQL 的详细步骤&#xff0c;确保能通过 mysql -uroot -p 成功连接。 步骤 1&#xff1a;下载 MySQL ZIP 包 访问 MySQL 官方下载页面&#xff1a; https://dev.mysql.com/downloads/mysql/选择 Windows (x86, 64-bit), ZIP Archive&…

el-table表格点击单元格实现编辑

使用 el-table 和 el-table-column 创建表格。在单元格的默认插槽中&#xff0c;使用 div 显示文本内容&#xff0c;单击时触发编辑功能。使用 el-input 组件在单元格中显示编辑框。data() 方法中定义了 tableData&#xff0c;tabClickIndex: null,tabClickLabel: ,用于判断是否…

Windows逆向工程入门之汇编环境搭建

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 Visual Studio逆向工程配置 基础环境搭建 Visual Studio 官方下载地址安装配置选项(后期可随时通过VS调整) 使用C的桌面开发 拓展可选选项 MASM汇编框架 配置MASM汇编项目 创建新项目 选择空…

手写一个C++ Android Binder服务及源码分析

手写一个C Android Binder服务及源码分析 前言一、 基于C语言编写Android Binder跨进程通信Demo总结及改进二、C语言编写自己的Binder服务Demo1. binder服务demo功能介绍2. binder服务demo代码结构图3. binder服务demo代码实现3.1 IHelloService.h代码实现3.2 BnHelloService.c…

DeepSeekMoE 论文解读:混合专家架构的效能革新者

论文链接&#xff1a;DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models 目录 一、引言二、背景知识&#xff08;一&#xff09;MoE架构概述&#xff08;二&#xff09;现有MoE架构的问题 三、DeepSeekMoE架构详解&#xff08;一&a…

[每周一更]-(第133期):Go中MapReduce架构思想的使用场景

文章目录 **MapReduce 工作流程**Go 中使用 MapReduce 的实现方式&#xff1a;**Go MapReduce 的特点****哪些场景适合使用 MapReduce&#xff1f;**使用场景1. 数据聚合2. 数据过滤3. 数据排序4. 数据转换5. 数据去重6. 数据分组7. 数据统计8.**统计文本中单词出现次数****代码…

【C++高并发服务器WebServer】-13:多线程服务器开发

本文目录 一、多线程服务器开发二、TCP状态转换三、端口复用 一、多线程服务器开发 服务端代码如下。 #include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <pthread.h>s…

「vue3-element-admin」告别 vite-plugin-svg-icons!用 @unocss/preset-icons 加载本地 SVG 图标

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …

C#中深度解析BinaryFormatter序列化生成的二进制文件

C#中深度解析BinaryFormatter序列化生成的二进制文件 BinaryFormatter序列化时,对象必须有 可序列化特性[Serializable] 一.新建窗体测试程序BinaryDeepAnalysisDemo,将默认的Form1重命名为FormBinaryDeepAnalysis 二.新建测试类Test Test.cs源程序如下: using System; us…

深度学习在医疗影像分析中的应用

引言 随着人工智能技术的快速发展&#xff0c;深度学习在各个领域都展现出了巨大的潜力。特别是在医疗影像分析中&#xff0c;深度学习的应用不仅提高了诊断的准确性&#xff0c;还大大缩短了医生的工作时间&#xff0c;提升了医疗服务的质量。本文将详细介绍深度学习在医疗影像…

计算机领域QPM、TPM分别是什么并发指标,还有其他类似指标吗?

在计算机领域&#xff0c;QPM和TPM是两种不同的并发指标&#xff0c;它们分别用于衡量系统处理请求的能力和吞吐量。 QPM&#xff08;每分钟请求数&#xff09; QPM&#xff08;Query Per Minute&#xff09;表示每分钟系统能够处理的请求数量。它通常用于衡量系统在单位时间…

【安当产品应用案例100集】036-视频监控机房权限管理新突破:安当windows操作系统登录双因素认证解决方案

一、机房管理痛点&#xff1a;权限失控下的数据泄露风险 在智慧城市与数字化转型浪潮下&#xff0c;视频监控系统已成为能源、金融、司法等行业的核心安防设施。然而&#xff0c;传统机房管理模式中&#xff0c;值班人员通过单一密码即可解锁监控画面的操作漏洞&#xff0c;正…

Unity抖音云启动测试:如何用cmd命令行启动exe

相关资料&#xff1a;弹幕云启动&#xff08;原“玩法云启动能力”&#xff09;_直播小玩法_抖音开放平台 1&#xff0c;操作方法 在做云启动的时候&#xff0c;接完发现需要命令行模拟云环境测试启动&#xff0c;所以研究了下。 首先进入cmd命令&#xff0c;CD进入对应包的文件…

< OS 有关 > 利用 google-drive-ocamlfuse 工具,在 Ubuntu 24 系统上 加载 Google DRIVE 网盘

Created by Dave On 8Feb.2025 起因&#xff1a; 想下载 StableDiffusion&#xff0c;清理系统文件时把 i/o 搞到 100%&#xff0c;已经删除到 apt 缓存&#xff0c;还差 89MB&#xff0c;只能另想办法。 在网上找能不能挂在 Google 网盘&#xff0c;百度网盘&#xff0c;或 …