Excel单元格插入图片,并自适应宽高——保姆级教程

author:陈镇坤27

日期:2022年3月22日

创作不易,转载请注明来源

摘要:计算图片高宽像素,将Excel单元格高宽单位转化为以像素为单位,按目的坐标插入图片。

特别说明:示例为:XSSFSheet

文章目录

  • Excel单元格插入图片,并自适应宽高——保姆级教程
    • 需求
    • 效果图
    • 问题
    • 知识准备
    • 代码

——————————————————————————————

需求

市场需求,要在excel中和word文档中插入定制化的公司logo。

word文档中,logo图案要和标题同行且位于两侧,左侧的居左对齐,右侧的居右对齐。

这种需求,要么方案一:做表格,要么就是计量空字符,在居左对其的标题右边,按空格数插入图片,使图片居右对齐。

表格虽然可以设置无边框,但电子版会产生虚线,因此被否。

计量空格又没有达到产品的自适应居右对齐,最后也被否决。

最终,word文档取消了标题和logo同行的需求。

excel的话,要求在合并的单元格中,拆分出一列,来存放居右对齐的logo图案。当拉动边框时,logo会自适应列宽伸缩。

效果图

问题

如何将图片居右对齐,插入合并后的单元格中,并且保证logo图案等比缩小放大。

知识准备

需要知道的是,要手术级操作excel单元格,必须深入掌握excel相关知识。首先要了解的便是不同excel版本、字体大小对列宽的影响。本文远远达不到该程度,仅作为通识学习所用

一个比较清晰的单位解释文章地址:https://zhuanlan.zhihu.com/p/78307080?from_voters_page=true

1、excel的单元格高和宽的计量单位不一致。

高以point(点)计,宽以字符计。

2、当没有全局指定列宽时,列宽默认设置8个字符宽度。

3、sheet指定列设置列宽的方法,第二个列宽参数单位是1/256个字符。

sheet1.SetColumnWidth(1, 100 * 256);

4、sheet指定列设置高度的两个方法:

void setHeight(short height);    //  入参单位缇,是1/20 pointsvoid setHeightInPoints(float height);  //入参单位为1 points

5、excel单元格操作方法的入参和出参,有时候是标准单位,有时候又是百分比的标准单位。要根据api源码注释来判断。

6、1 inch = 72 point = 96 px

7、sheet提供的查询指定列宽值,并以px为单位表示的方法如下:

float getColumnWidthInPixels(int columnIndex);

8、合并单元格,是合并了“区域”,但单元格本身依然存在。

9、excel操作单元格的宽度,是对该单元格所处列的调整,因此在计算距离插入图片时,若图片设置了自适应,则必须注意后面的excel单元格生成时对该单元格的宽度的影响是否会导致图片被压缩。

10、sheet添加图片的方法:

Picture createPicture(ClientAnchor anchor, int pictureIndex);

11、anchor是“单元格锚”(理解成船锚),指示图片所处的位置,设置坐标时,需要知道图片所处的第一个单元格的左下角坐标和图片所处的最后一个单元格的右上角坐标。中心点为单元格的左下角。——这一块是我的理解,源码并没有对此做很多解释。

12、EMUs用于基于矢量的绘图和嵌入图片中的坐标。它是厘米与英尺间的一个虚拟单位。

Units的一个转化px为EMUs的方法

 /*** Converts pixels to EMUs* @param pixels pixels* @return EMUs*/public static int pixelToEMU(int pixels) {return pixels*EMU_PER_PIXEL;}

代码

private void fillExcelLogo(XSSFWorkbook book, String waterMarkCompanyLogo, Sheet sheet1, Cell finalCell,Row row,int leftTopCellNum) {if (StringUtils.isBlank(waterMarkCompanyLogo)) {return;}Cell cell1 = null;Cell cell2 = finalCell;HttpURLConnection conn = null;InputStream inputStream = null;BufferedImage image = null;try {URL url = new URL(waterMarkCompanyLogo);conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(20 * 1000);ByteArrayOutputStream output = new ByteArrayOutputStream();inputStream = conn.getInputStream();IOUtils.copy(inputStream, output);//  必须准备两份资源!!!ByteArrayInputStream inputStreamPic = new ByteArrayInputStream(output.toByteArray());ByteArrayInputStream imageStream = new ByteArrayInputStream(output.toByteArray());image = ImageIO.read(imageStream);// 添加图片,并获得图片全局序号int pictureIdx = book.addPicture(inputStreamPic, Workbook.PICTURE_TYPE_JPEG);//   计算获得图片在文档中的初始化高宽float initWith = 0;float initHigh = 0;//  1 inch = 72 point = 96 px float v = row.getHeightInPoints() / 72f;initHigh = v * 96f;float highScaler = initHigh/(float) image.getHeight();initWith = (float)image.getWidth() * highScaler;// 由于图片向右顶格,则锚的最后一个单元格为最右边的单元格。//   因为表格中列宽不一,因此需计算所处图片第一个单元格位置。int i1 = cell2.getColumnIndex() + 1 - leftTopCellNum;int allColumWithInPx = 0;for (int i = 0; i < i1; i++) {allColumWithInPx = allColumWithInPx + Math.round(sheet1.getColumnWidthInPixels(row.getCell(leftTopCellNum+i).getColumnIndex()));}int columWidthInPx = allColumWithInPx / i1;int i = Math.round(initWith) / columWidthInPx;if (i > 0 && i < (finalCell.getColumnIndex() - leftTopCellNum)) {cell1 = row.getCell(cell2.getColumnIndex() - i);} else if (i >= (finalCell.getColumnIndex() - leftTopCellNum)) {cell1 = row.getCell(leftTopCellNum);} else {cell1 = cell2;}CreationHelper helper = sheet1.getWorkbook().getCreationHelper();ClientAnchor anchor = helper.createClientAnchor();//  图像右上角所在单元格的图像右上角坐标anchor.setDx2(Units.pixelToEMU(columWidthInPx));anchor.setDy2(Units.toEMU(row.getHeightInPoints())); ////  图像左下角所在单元格的图像左下角坐标anchor.setDx1(0); // TODO: 2022/3/18 理应事实计算,为方便直接左下角顶格处理即可anchor.setDy1(0);//  图像左下角所处单元格与图像右上角所处单元格anchor.setCol1(cell1.getColumnIndex());anchor.setRow1(cell1.getRowIndex());anchor.setCol2(cell2.getColumnIndex());anchor.setRow2(cell2.getRowIndex());//  边框自适应(拉动单元格时,图片追随)anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);//  最终插入图片Drawing drawing = sheet1.createDrawingPatriarch();drawing.createPicture(anchor, pictureIdx);} catch (Exception e) {e.printStackTrace();} finally {//   这是一个我自己封装的关闭资源的代码。不做分享。ResourceCloseUtil.closeJDBCResource2(inputStream);}}

Excel单元格插入图片,并自适应宽高——保姆级教程相关推荐

  1. Excel单元格插入图片并实现单击放大或缩小功能(含VBA代码)

    文章目录 0 引言 1 提前准备VBA代码 1.1 ThisWorkbook的代码: 1.2 模块的代码: 2 设置步骤 2.1 VBA代码设置单元格 2.2 插入图片到单元格 2.3 以启用宏的方式 ...

  2. excel 单元格插入图片

    //插入图片 void COperExcel::XlsInsertPictrue(const CString &strPicPath,float xPos, float yPos,float ...

  3. excel2019单元格插入图片位置大小随单元格变化

    描述:excel2019单元格插入图片位置大小随单元格变化 步骤: 复制图片到Excel2019单元格 调整图片到合适大小 双击图片,菜单栏会出现 图片工具格式 找到对齐,选择对齐网格 将图片对齐单元 ...

  4. 导出Excel之单元格插入图片

    前置代码 IWorkbook wb = new XSSFWorkbook(); ISheet sheet = wb.CreateSheet("Sheet1"); //创建一个名称为 ...

  5. poi往word单元格插入图片,支持本地图片和网络图片

    poi版本:4.1.2 最近word导出时需要导出图片,在网上翻了会就发现了好心人分享的代码,但是只支持本地文件读取,我们项目需要从其他服务器获取图片,那肯定得使用网络方式了,于是在源代码上进行了完善 ...

  6. 微信小程序 - 解决 rich-text 富文本解析图片无法自适应宽高问题(图片超出屏幕宽度且不受控)

    前言 注意:您无法通过直接指定 <img> 标签样式来试图设置为自适应图片. 使用官方 <rich-text> 富文本组件解析时, 当内容包含图片(大图)时显示的结果就会超出屏 ...

  7. 使用NPOI向Excel单元格中插入图片

    使用NPOI向Excel单元格中插入图片 目标 代码 参考文章 目标 需要向Excel中的某一列插入图片,每行的图片大小一致. 此方法仅适用于使用NPOI向xlsx文件中的指定单元格插入图片. 代码 ...

  8. Excel用底纹突出单元格的数据给Excel单元格添加底纹效果

    在表格中某些单元格的数据相对重要,需要突出显示,除了应用单元格样式外,还可以单独为单元格设置图案底纹,让其突出显示. (常见问题) excel中如何设置单元格的底纹 怎样给EXCEL表格加底纹 在EX ...

  9. php单元格字体颜色,PHPExcel API接口用法大全,按模板导入excel,美化excel,导出图片,设置单元格字体颜色背景色边框,合并单元格,设置行高列宽...

    PHPExcel API接口用法大全,按模板导入excel,美化excel,导出图片,设置单元格字体颜色背景色边框,合并单元格,设置行高列宽 2020-08-31 85 一:读取excel表模板$ph ...

最新文章

  1. Elasticsearch 知识点目录
  2. 百度最近开源了分布式配置中心,名叫BRCC
  3. 解决postgresql数据库localhost可以连接,ip连接不了的问题
  4. 环形动画加载视图AnimatedCircleLoadingView
  5. 关于直流电源纹波和噪声的测量的分析和介绍
  6. HDU-3280 Equal Sum Partitions
  7. 机器人学习--Imperial College London机器人学课程
  8. 将项目导入myeclipse后 tortoise svn 右键项目不能更新和提交
  9. idea springboot 发布webservice 发布服务_阿里云发布 Spring Boot 新脚手架,真香
  10. 添加公共引用目录_原来Word还可以自动生成图片和图表目录!
  11. Python基础教程笔记——条件,循环和其他语句
  12. XFire 配置文件注意事项
  13. 2.1 机器中数据的存储
  14. 改造u3d第一人称控制器,使之适合Cardboard+蓝牙手柄控制
  15. 屏幕录制生成gif文件神器和相关操作 GifCam
  16. 细胞自动机,那是什么?
  17. Redis分布式架构以及实战
  18. dnw linux 内核,Linux下使用DNW工具通过USB下载镜像
  19. php挂机源码,织音QQ助手QQ互赞挂机开源版源码
  20. Eclipse开发环境搭建

热门文章

  1. 怎样在VS2005中添加Flash控件
  2. 性能测试工具的 Coordinated Omission 问题
  3. 明解C语言(入门篇)第二章
  4. 嵌入式学习硬件篇------初识ARM
  5. Cadence Allegro如何添加泪滴
  6. 为什么要设置HashMap的初始化容量
  7. 书签书签书签书签书签书签
  8. Lammps模拟剪切作用下的位错滑移
  9. DELLR740带外镜像安装系统
  10. 那个叫鲁迅的人终于从教科书里滚蛋了