当前位置: 首页 > news >正文

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.lryc.cn/news/535177.html

相关文章:

  • Java、Go、Rust、Node.js 的内存占比及优缺点分析
  • C++智能指针的使用
  • 计算机毕业设计——Springboot的社区维修平台旅游管理
  • MySQL ALTER 命令详解
  • 02、QLExpress从入门到放弃,相关API和文档
  • Mp4视频播放机无法播放视频-批量修改视频分辨率(帧宽、帧高)
  • deepseek大模型集成到idea
  • AI基础 -- AI学习路径图
  • 在 Visual Studio Code 与微信开发者工具中调试使用 emscripten 基于 C 生成的 WASM 代码
  • elasticsearch实战应用从入门到高效使用java集成es快速上手
  • 【OneAPI】通过网页预渲染让搜索引擎收录网页
  • 【网络安全.渗透测试】Cobalt strike(CS)工具使用说明
  • 港中文腾讯提出可穿戴3D资产生成方法BAG,可自动生成服装和配饰等3D资产如,并适应特定的人体模型。
  • 【C语言标准库函数】标准输入输出函数详解[4]:二进制文件读写函数
  • Python:凯撒密码
  • C++引用深度详解
  • C++ Primer 语句作用域
  • github - 使用
  • 内网ip网段记录
  • k8s部署logstash
  • EF Core中实现值对象
  • 【分布式理论9】分布式协同:分布式系统进程互斥与互斥算法
  • 木材表面缺陷检测数据集,支持YOLO+COCO JSON+PASICAL VOC XML+DARKNET格式标注信息,平均正确识别率95.0%
  • Leetcodehot 力扣热题100 二叉搜索树中第 K 小的元素
  • Awtk 如何添加开机画面
  • 关于多语言商城系统的开发流程
  • IDEA中常见问题汇总
  • 计算机视觉-拟合
  • CSS 实现下拉菜单效果实例解析
  • DeepSeek模拟阿里面试——Mysql