NPOI导出的图片默认是在单元格左上方,这使得图片在单元格显示得很难看。居中,且等比缩放,才是图片在单元格上的完美展示。

        /// <summary>/// 图片在单元格等比缩放居中显示/// </summary>/// <param name="cell">单元格</param>/// <param name="value">图片二进制流</param>private void CellImage(ICell cell, byte[] value){if (value.Length == 0) return;//空图片处理double scalx = 0;//x轴缩放比例double scaly = 0;//y轴缩放比例int Dx1 = 0;//图片左边相对excel格的位置(x偏移) 范围值为:0~1023,超过1023就到右侧相邻的单元格里了int Dy1 = 0;//图片上方相对excel格的位置(y偏移) 范围值为:0~256,超过256就到下方的单元格里了bool bOriginalSize = false;//是否显示图片原始大小 true表示图片显示原始大小  false表示显示图片缩放后的大小///计算单元格的长度和宽度double CellWidth = 0;double CellHeight = 0;int RowSpanCount = cell.GetSpan().RowSpan;//合并的单元格行数int ColSpanCount = cell.GetSpan().ColSpan;//合并的单元格列数 int j = 0;for (j = 0; j < RowSpanCount; j++)//根据合并的行数计算出高度
            {CellHeight += cell.Sheet.GetRow(cell.RowIndex + j).Height;}for (j = 0; j < ColSpanCount; j++){CellWidth += cell.Row.Sheet.GetColumnWidth(cell.ColumnIndex + j);}//单元格长度和宽度与图片的长宽单位互换是根据实例得出CellWidth = CellWidth / 35;CellHeight = CellHeight / 15;///计算图片的长度和宽度MemoryStream ms = new MemoryStream(value);Image Img = Bitmap.FromStream(ms, true);double ImageOriginalWidth = Img.Width;//原始图片的长度double ImageOriginalHeight = Img.Height;//原始图片的宽度double ImageScalWidth = 0;//缩放后显示在单元格上的图片长度double ImageScalHeight = 0;//缩放后显示在单元格上的图片宽度if (CellWidth > ImageOriginalWidth && CellHeight > ImageOriginalHeight)//单元格的长度和宽度比图片的大,说明单元格能放下整张图片,不缩放
            {ImageScalWidth = ImageOriginalWidth;ImageScalHeight = ImageOriginalHeight;bOriginalSize = true;}else//需要缩放,根据单元格和图片的长宽计算缩放比例
            {bOriginalSize = false;if (ImageOriginalWidth > CellWidth && ImageOriginalHeight > CellHeight)//图片的长和宽都比单元格的大的情况
                {double WidthSub = ImageOriginalWidth - CellWidth;//图片长与单元格长的差距double HeightSub = ImageOriginalHeight - CellHeight;//图片宽与单元格宽的差距if (WidthSub > HeightSub)//长的差距比宽的差距大时,长度x轴的缩放比为1,表示长度就用单元格的长度大小,宽度y轴的缩放比例需要根据x轴的比例来计算
                    {scalx = 1;scaly = (CellWidth / ImageOriginalWidth) * ImageOriginalHeight / CellHeight;//计算y轴的缩放比例,CellWidth / ImageWidth计算出图片整体的缩放比例,然后 * ImageHeight计算出单元格应该显示的图片高度,然后/ CellHeight就是高度的缩放比例
                    }else{scaly = 1;scalx = (CellHeight / ImageOriginalHeight) * ImageOriginalWidth / CellWidth;}}else if (ImageOriginalWidth > CellWidth && ImageOriginalHeight < CellHeight)//图片长度大于单元格长度但图片高度小于单元格高度,此时长度不需要缩放,直接取单元格的,因此scalx=1,但图片高度需要等比缩放
                {scalx = 1;scaly = (CellWidth / ImageOriginalWidth) * ImageOriginalHeight / CellHeight;}else if (ImageOriginalWidth < CellWidth && ImageOriginalHeight > CellHeight)//图片长度小于单元格长度但图片高度大于单元格高度,此时单元格高度直接取单元格的,scaly = 1,长度需要等比缩放
                {scaly = 1;scalx = (CellHeight / ImageOriginalHeight) * ImageOriginalWidth / CellWidth;}ImageScalWidth = scalx * CellWidth;ImageScalHeight = scaly * CellHeight;}Dx1 = Convert.ToInt32((CellWidth - ImageScalWidth) / CellWidth * 1023 / 2);Dy1 = Convert.ToInt32((CellHeight - ImageScalHeight) / CellHeight * 256 / 2);int pictureIdx = cell.Sheet.Workbook.AddPicture((Byte[])value, PictureType.PNG);IClientAnchor anchor = cell.Sheet.Workbook.GetCreationHelper().CreateClientAnchor();anchor.AnchorType = AnchorType.MoveDontResize;anchor.Col1 = cell.ColumnIndex;anchor.Col2 = cell.ColumnIndex + cell.GetSpan().ColSpan;anchor.Row1 = cell.RowIndex;anchor.Row2 = cell.RowIndex + cell.GetSpan().RowSpan;anchor.Dy1 = Dy1;//图片下移量anchor.Dx1 = Dx1;//图片右移量,通过图片下移和右移,使得图片能居中显示,因为图片不同文字,图片是浮在单元格上的,文字是钳在单元格里的IDrawing patriarch = cell.Sheet.CreateDrawingPatriarch();IPicture pic = patriarch.CreatePicture(anchor, pictureIdx);if (bOriginalSize){pic.Resize();//显示图片原始大小
            }else{pic.Resize(scalx, scaly);//等比缩放
            }}

转载于:https://www.cnblogs.com/xbzsz/p/8185266.html

NPOI随笔——图片在单元格等比缩放且居中显示相关推荐

  1. java Excel图片在合并单元格等比缩放且居中显示

    下面展示一些 内联代码片. int x = 9; //列总数int y = 8; //行总数//单元格高度double heightRow = (cell.getRow().getHeightInPo ...

  2. C# 使用 NPOI 处理Excel导入单元格内容是公式问题

    C# 使用 NPOI 处理Excel导入单元格内容是公式问题 引言:今天在处理业务的时候,碰到导入Excel数据不成功的问题,那么就在这里做下笔记吧. 首先,我们有以下的数据.整块业务逻辑的代码在最后 ...

  3. Excel根据表格内容批量导入指定图片到单元格

    如下图所示想根据姓名列导入对应的图像列内容,看小编如何操作呢,请看动图演示 (方方格子插件) 1.选择图片工具按钮 2.选择根据内容导入图片 ​ 3.选择图片名的拉选按钮 4.拉选图片名单元格 ​ 5 ...

  4. Excel:技巧:如何:图片随着单元格变化+双击图片会出现系统自带的绘画工具显示图片

    目录 一.目的 1.想知道:如何:图片随着单元格变化+双击图片会出现系统自带的绘画工具显示图片 1.一开始想表格插入图片,找到方法查看图片大图 二.参考 三.注意 1.最终发现:操作:1:随着图片越来 ...

  5. python图片表格单元格切分

    python图片表格单元格切分算法 切分思路 生成表格文件 寻找表格的范围和最小点 查找单元格 寻找坐标的行像素列像素 寻找点周围的单元格 切分思路 首先通过寻找轮廓线的方法找到最大的轮廓线,然后根据 ...

  6. openxlpy 在excel中批量插入图片 根据单元格内容插入图片 图片随单元格大小变化而变化 AnchorMarker python

    需求: 根据单元格的文本内容,插入相同名称的图片: 图片大小与单元格大小相同 要用到OS库和openxlpy库 步骤: 遍历excel区域里面的单元格,看是否有文本内容 根据文本内容确定图片的名称,从 ...

  7. Excel按图片上方单元格名称导出图片的操作

    今天小编要和大家分享的是,Excel按图片上方单元格名称导出图片的操作,如下图所示 (方方格子插件) 1.动图演示 2.操作前先选中数据区域 3.然后我们选择方方格子的图片工具按钮 4.然后呢我们选择 ...

  8. Excel VBA 插入指定图片到单元格并只适应大小

    Sub 插入图片() Dim filenames As String Dim filefilter1 As String filefilter1 = ("所有图片文件(*.jpg;*.bmp ...

  9. C# NPOI 设置(.xlsx) 【单元格填充】以及【字体颜色】

    C# NPOI 设置(.xlsx) [单元格填充]以及[字体颜色] 写在前面: 因为我需要用到NPOI处理.xlsx文件,需要设置单元格填充及字体颜色,期间网上搜索的时候很麻烦,结果五花八门,提炼一下 ...

最新文章

  1. 在CentOS 7.5上升级SQLite3过程实录
  2. Dubbo 源码分析 - 服务引用
  3. Python脚本配合Linux计划任务工作
  4. recovery v1跟recovery v2的区别
  5. CMOS图像传感器——SmartSens
  6. (53)Xilinx时钟原语-BUG与IBUFG(第11天)
  7. Controller接口控制器(4)
  8. OpenResty实现LNMP的缓存前移(到达nginx前端层面)
  9. Properties集合
  10. 用Wireshark轻松解密TLS浏览器流量
  11. iPhoneamp;iPad DFU及恢复模式刷机、降级教程
  12. 知行之桥®中文版EDI系统正式发布
  13. 360提高计算机运行速度,简单操作,360优化加速帮你优化电脑运行速度
  14. Unity Shader入门精要--第4 章 学习Shader 所需的数学基础:矩阵
  15. css如何去掉图片里面存在的背景色
  16. 使用Python画小猪佩奇
  17. Excel中如何输入前面带0的数值
  18. 基于OpenCV的形状检测
  19. nodejs探秘:require加载模块的原理及代码实现
  20. linux的电脑 配哪款显卡,27款AMD、NVIDIA显卡大战Linux

热门文章

  1. ubuntu 12.04 php mysql_Ubuntu 12.04下LAMP安装配置
  2. 华为服务器bmc默认地址_智能数据中心和智慧园区:华为的单点突破与全局效应...
  3. c语言创建链表存储10个数,C语言编写的建立单向int链表,连续输入10个结点创建链表,并实现在原链表中插入数字、删除数字、查找数字的功能...
  4. Java 启动和停止界面_IntelliJ IDEA 2019.3 发布,启动更快,性能更好(新特性解读)...
  5. basler相机 ip linux,Linux环境中连接Basler相机(Pylon软件的安装),ROS环境中连接Basler相机...
  6. android art虚拟机安装,Android中art虚拟机启动流程
  7. python解题软件哪个好_笔试 - 高德软件有限公司python问题 和 答案
  8. 虚拟的云服务器需要重启吗,虚拟主机重启服务器吗
  9. linux java tar 卸载_linux下jdk的卸载与安装
  10. dateformat java_java常用API之DateFormat