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

news2025/2/11 9:26:28

概述

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

一般都是用的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");

    // 创建一个 ExcelWriter
    ExcelWriter 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");

    // 创建一个 ExcelWriter
    ExcelWriter 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.coloradmin.cn/o/2295449.html

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

相关文章

无界构建微前端?NO!NO!NO!多系统融合思路!

文章目录 微前端理解1、微前端概念2、微前端特性3、微前端方案a、iframeb、qiankun --> 使用比较复杂 --> 自己写对vite的插件c、micro-app --> 京东开发 --> 对vite支持更拉跨d、EMP 方案--> 必须使用 webpack5 --> 很多人感觉不是微前端 --> 去中心化方…

为飞牛OS基于FRP的内网穿透开启HTTPS加密

前言 玩NAS的朋友应该有比较多只是在家庭局域网使用&#xff0c;比如日常看看电影、备份手机照片什么的&#xff0c;这属于家庭局域网的使用场景。 当然了&#xff0c;如果你经常出差&#xff0c;或者过年回家不想把NAS也背回去&#xff0c;或者是想上班摸鱼&#xff0c;或者是…

《基于Python与DashScope的智能语音合成工具开发》

《基于Python与DashScope的智能语音合成工具开发》 在当今数字化时代&#xff0c;语音合成技术已经广泛应用于各种场景&#xff0c;如智能语音助手、有声读物、导航系统等。本文将介绍如何使用Python和DashScope平台开发一个简单而功能强大的文字转语音工具。通过这个工具&…

快速上手Vim的使用

Vim Linux编辑器-vim使用命令行模式下所有选项都可以带数字底行模式可视块模式&#xff08;ctrlV进入&#xff09; Linux编辑器-vim使用 Vim有多种模式的编辑器。能帮助我们很快的进行代码的编辑&#xff0c;甚至完成很多其他事情。 默认情况下我们打开vim在命令模式下&#x…

vue学习第四天 v-on事件绑定

v-on绑定事件如下&#xff0c;点击按钮会弹出alert v-on&#xff1a;事件具体名称“事件调用的函数名” 事件调用的函数写在methods里面 在methods属性的函数里&#xff0c;可以用this获取data的数据&#xff0c;this代表的就是整个vue实例 用this.age就可以拿到age&#xff0…

2.8寒假作业

web&#xff1a;[HNCTF 2022 Week1]2048 之前也做过类似的题目&#xff0c;之前的解法是直接get传参score20000&#xff0c;可以尝试 打开环境看源代码&#xff0c;直接改源代码显然是不行的&#xff0c;那么用一下上面的办法也不行&#xff0c;估计是要改其他方向的&#xff…

Formality:时序变换(五)(寄存器复制)

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 一、引言 时序变换在Design Compiler的首次综合和增量综合中都可能发生&#xff0c;它们包括&#xff1a;时钟门控(Clock Gating)、寄存器合并(Register Merging)、…

科技赋能数字内容体验的核心技术探索

内容概要 在数字化时代&#xff0c;科技的迅猛发展为我们的生活和工作带来了深刻的变革。数字内容体验已经成为人们获取信息和娱乐的重要途径&#xff0c;而这背后的技术支持则扮演着至关重要的角色。尤其是在人工智能、虚拟现实和区块链等新兴技术的推动下&#xff0c;数字内…

DeepSeek-R1 本地大模型搭建对接API

DeepSeek-R1 在这里将学到很多知识 欢迎使用使用DeepSeek-R1本地大模型DeepSeek 的模型基础说明DeepSeek的本地 API 说明DeepSeek 本地模型搭建1、执行命令安装及测试 DeepSeek-R1 API接口调用当然&#xff0c;我们为了让用户更加便捷&#xff0c;我们把API 接口全部放到上面截…

redis高级数据结构布隆过滤器

文章目录 背景什么是布隆过滤器Redis 中的布隆过滤器布隆过滤器使用注意事项实现原理空间占用估计 背景 我们在使用新闻客户端看新闻时&#xff0c;它会给我们不停地推荐新的内容&#xff0c;它每次推荐时要去重&#xff0c;去掉那些已经看过的内容。问题来了&#xff0c;新闻…

《Wiki.js知识库部署实践 + CNB Git数据同步方案解析》

一、wiki.js 知识库简介 基本概述 定义 &#xff1a;Wiki.js 是一个开源、现代、轻量且功能强大的 Wiki 应用程序&#xff0c;基于 Node.js 构建&#xff0c;旨在帮助个人和团队轻松创建、管理和共享知识。开源性质 &#xff1a;它遵循 AGPLv3 许可证&#xff0c;任何人都可以…

CSS Overflow 属性详解:控制内容溢出的利器

在前端开发中&#xff0c;处理内容溢出是一个常见的需求。CSS 提供了 overflow 属性&#xff0c;帮助我们控制当内容超出元素框时的显示方式。本文将详细介绍 overflow 属性的各种取值及其应用场景。 1. 什么是 overflow 属性&#xff1f; overflow 属性用于控制当元素的内容…

根文件系统 Debian10【1】移植

1.开发背景 一般根文件系统使用 Busybox 或者是 Buildroot 构建&#xff0c;这样构建出来的文件系统比较小&#xff0c;但是不具备上网功能&#xff0c;扩展性比较差。随着 ARM 的日益强大&#xff0c;ARM 可以搭载更庞大复杂的系统&#xff0c;可以是 Ubuntu 或者 Debian 等发…

【PyQt】实现格式刷功能

实现格式刷功能 在Qt Designer中直接实现格式刷功能并不支持&#xff0c;但可以通过以下方法在应用程序中实现类似功能&#xff1a; 一、Qt Designer中的替代方案 1.手动设置样式表 在属性编辑器中复制样式表&#xff08;QSS&#xff09;内容&#xff0c;粘贴到其他控件。 …

2025年日祭

本文将同步发表于洛谷&#xff08;暂无法访问&#xff09;、CSDN 与 Github 个人博客&#xff08;暂未发布&#xff09; 本蒟自2025.2.8开始半停课。 任务计划&#xff08;站外题与专题&#xff09; 数了一下&#xff0c;通过人数比较高的题&#xff0c;也就是我准备补的题&a…

Windows下AMD显卡在本地运行大语言模型(deepseek-r1)

Windows下AMD显卡在本地运行大语言模型 本人电脑配置第一步先在官网确认自己的 AMD 显卡是否支持 ROCm下载Ollama安装程序模型下载位置更改下载 ROCmLibs先确认自己显卡的gfx型号下载解压 替换替换rocblas.dll替换library文件夹下的所有 重启Ollama下载模型运行效果 本人电脑配…

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

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

数据库操作与数据管理——Rust 与 SQLite 的集成

第六章&#xff1a;数据库操作与数据管理 第一节&#xff1a;Rust 与 SQLite 的集成 在本节中&#xff0c;我们将深入探讨如何在 Rust 中使用 SQLite 数据库&#xff0c;涵盖从基本的 CRUD 操作到事务处理、数据模型的构建、性能优化以及安全性考虑等方面。SQLite 是一个轻量…

Ubuntu 24.10 安装Deepseek(Ollama+openwebui)

一、Ollama安装 1.在线安装 curl -fsSL https://ollama.com/install.sh | sh 如果curl工具没有安装先执行如下命令 sudo apt install curl 验证curl是否安装成功 curl --version 安装的过程中会提示输入当前系统登录用户的密码。 安装提示success后,验证安装 ollama -…

【漫话机器学习系列】084.偏差和方差的权衡(Bias-Variance Tradeoff)

偏差和方差的权衡&#xff08;Bias-Variance Tradeoff&#xff09; 1. 引言 在机器学习模型的训练过程中&#xff0c;我们常常面临一个重要的挑战&#xff1a;如何平衡 偏差&#xff08;Bias&#xff09; 和 方差&#xff08;Variance&#xff09;&#xff0c;以提升模型的泛…