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

/// <summary>
/// 图片在单元格等比缩放居中显示
/// </summary>
/// <param name="cell">单元格</param>
/// <param name="value">图片二进制流</param>
private void CellImage(ICell cell, byte[] value)
{
if (value.Length == ) return;//空图片处理
double scalx = ;//x轴缩放比例
double scaly = ;//y轴缩放比例
int Dx1 = ;//图片左边相对excel格的位置(x偏移) 范围值为:0~1023,超过1023就到右侧相邻的单元格里了
int Dy1 = ;//图片上方相对excel格的位置(y偏移) 范围值为:0~256,超过256就到下方的单元格里了
bool bOriginalSize = false;//是否显示图片原始大小 true表示图片显示原始大小 false表示显示图片缩放后的大小
///计算单元格的长度和宽度
double CellWidth = ;
double CellHeight = ;
int RowSpanCount = cell.GetSpan().RowSpan;//合并的单元格行数
int ColSpanCount = cell.GetSpan().ColSpan;//合并的单元格列数
int j = ;
for (j = ; j < RowSpanCount; j++)//根据合并的行数计算出高度
{
CellHeight += cell.Sheet.GetRow(cell.RowIndex + j).Height;
}
for (j = ; j < ColSpanCount; j++)
{
CellWidth += cell.Row.Sheet.GetColumnWidth(cell.ColumnIndex + j);
}
//单元格长度和宽度与图片的长宽单位互换是根据实例得出
CellWidth = CellWidth / ;
CellHeight = CellHeight / ;
///计算图片的长度和宽度
MemoryStream ms = new MemoryStream(value);
Image Img = Bitmap.FromStream(ms, true);
double ImageOriginalWidth = Img.Width;//原始图片的长度
double ImageOriginalHeight = Img.Height;//原始图片的宽度
double ImageScalWidth = ;//缩放后显示在单元格上的图片长度
double ImageScalHeight = ;//缩放后显示在单元格上的图片宽度
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 = ;
scaly = (CellWidth / ImageOriginalWidth) * ImageOriginalHeight / CellHeight;//计算y轴的缩放比例,CellWidth / ImageWidth计算出图片整体的缩放比例,然后 * ImageHeight计算出单元格应该显示的图片高度,然后/ CellHeight就是高度的缩放比例
}
else
{
scaly = ;
scalx = (CellHeight / ImageOriginalHeight) * ImageOriginalWidth / CellWidth;
}
}
else if (ImageOriginalWidth > CellWidth && ImageOriginalHeight < CellHeight)//图片长度大于单元格长度但图片高度小于单元格高度,此时长度不需要缩放,直接取单元格的,因此scalx=1,但图片高度需要等比缩放
{
scalx = ;
scaly = (CellWidth / ImageOriginalWidth) * ImageOriginalHeight / CellHeight;
}
else if (ImageOriginalWidth < CellWidth && ImageOriginalHeight > CellHeight)//图片长度小于单元格长度但图片高度大于单元格高度,此时单元格高度直接取单元格的,scaly = 1,长度需要等比缩放
{
scaly = ;
scalx = (CellHeight / ImageOriginalHeight) * ImageOriginalWidth / CellWidth;
}
ImageScalWidth = scalx * CellWidth;
ImageScalHeight = scaly * CellHeight;
}
Dx1 = Convert.ToInt32((CellWidth - ImageScalWidth) / CellWidth * / );
Dy1 = Convert.ToInt32((CellHeight - ImageScalHeight) / CellHeight * / );
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);//等比缩放
}
}

NPOI 图片在单元格等比缩放且居中显示的更多相关文章

  1. NPOI 在指定单元格导入导出图片

    NPOI 在指定单元格导入导出图片 Intro 我维护了一个 NPOI 的扩展,主要用来导入导出 Excel 数据,最近有网友提出了导入 Excel 的时候解析图片的需求,于是就有了本文的探索 导入E ...

  2. NPOI设置Excel单元格字体、边框、对齐、背景色

    代码: ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; ce ...

  3. C# NPOI Export DataTable C# NPOI导出DataTable 单元格自适应大小

    1.Install-Package NPOI -v 2.4.0 2. using NPOI.XSSF; using NPOI.XSSF.UserModel; using NPOI.SS.UserMod ...

  4. 【VBA】单元格插入图片,单元格删除图片

    封装函数: Sub 插入产品形象(strRange As String, datebaseTu As String) Dim strJpg As String strJpg = datebaseTu ...

  5. NPOI 修改指定单元格字体颜色

    //创建一个字体颜色 IFont font = hssfworkbook.CreateFont(); //红色 font.Color = HSSFColor.Red.Index; //样式 ICell ...

  6. C# NPOI Excel 合并单元格和取消单元格

    1.合并单元操作 //合并单元格 /** 第一个参数:从第几行开始合并 第二个参数:到第几行结束合并 第三个参数:从第几列开始合并 第四个参数:到第几列结束合并 **/ CellRangeAddres ...

  7. DataGridView单元格内容自动匹配下拉显示

    页面显示数据使用的控件是ComponentFactory.Krypton.Toolkit中的KryptonDataGridView控件.在指定“商品”单元格中需要根据用户输入内容自动匹配数据库中商品信 ...

  8. PHPEXCEL xls模板导入,及格式自定义:合并单元格、加粗、居中等操作

    PHPExcel 是用来操作Office Excel 文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言.可以使用它来读取.写入不同格式的电子表格,如 Excel (BIFF) .xls ...

  9. 纯JS实现图片预览与等比例缩放和居中

    最近做项目时有一个需求,广告位图片上传时要预览,并且要等比例缩放和居中.已经保存的广告位图片显示时也要等比例缩放和居中.我使用了下面的代码实现,不过可能有一些小问题. <!DOCTYPE HTM ...

随机推荐

  1. 正确启动从GitHub上下载的vue项目:vueAdmin-template

    先讲重点,后上相关资料: 遇到的问题:在启动从GitHub上下载的vue项目:vueAdmin-template 时报错:'webpack-dev-server' 不是内部或外部命令,也不是可运行的程 ...

  2. git 提交项目代码到码云步骤 以及出现错误解决办法

    git initgit remote add origin 项目地址git add .git commit -m "注释"git push origin master 出现错误 $ ...

  3. 如何快速清理 docker 资源

    如果经常使用 docker,你会发现 docker 占用的资源膨胀很快,其中最明显也最容易被察觉的应该是对磁盘空间的占用.本文将介绍如何快速的清理 docker 占用的系统资源,具体点说就是删除那些无 ...

  4. Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块

    Python第十三天   django 1.6   导入模板   定义数据模型   访问数据库   GET和POST方法    SimpleCMDB项目   urllib模块   urllib2模块 ...

  5. 2019-1-17 前言 C#高级编程(第11版)

    C#已更新为更快的速度.主要版本7.0是2017年3月发布,次要版本7.1和7.2很快发布在2017年8月和2017年12月.通过项目设置,您可以与每个应用程序一起分发,是开源的,不可用仅适用于Win ...

  6. SQL SERVER 2012 AlwaysOn - 维护篇 03

    搭建 AlwaysOn 是件非常繁琐的工作,需要从两方面考虑,操作系统层面和数据库层面,AlwaysOn 非常依赖于操作系统,域控,群集,节点等概念: DBA 不但要熟悉数据库也要熟悉操作系统的一些概 ...

  7. IOS以无线方式安装企业内部应用(开发者)

    请先阅读:http://help.apple.com/deployment/ios/#/apda0e3426d7 操作系统:osx yosemite 10.10.5 (14F1509) xcode:V ...

  8. Ubuntu 18.04 安装 Apache, MySQL, PHP7, phpMyAdmin

    https://blog.csdn.net/sanve/article/details/80770675

  9. React 系列教程2:编写兰顿蚂蚁演示程序

    简介 最早接触兰顿蚂蚁是在做参数化的时候,那时候只感觉好奇,以为是很复杂的东西.因无意中看到生命游戏的 React 实现,所以希望通过兰顿蚂蚁的例子再学习一下 React. 兰顿蚂蚁的规则非常简单: ...

  10. html中的meta标签是什么?有哪些属性?

    meta标签介绍 meta标签是HTML语言head区域的一个辅助性标签,常用于定义页面的说明,关键字,最后修改的日期和其他的元数据.这些元数据将服务于浏览器,搜索引擎和其他网络服务. meta标签的 ...