NPOI 图片在单元格等比缩放且居中显示
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 图片在单元格等比缩放且居中显示的更多相关文章
- NPOI 在指定单元格导入导出图片
NPOI 在指定单元格导入导出图片 Intro 我维护了一个 NPOI 的扩展,主要用来导入导出 Excel 数据,最近有网友提出了导入 Excel 的时候解析图片的需求,于是就有了本文的探索 导入E ...
- NPOI设置Excel单元格字体、边框、对齐、背景色
代码: ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; ce ...
- 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 ...
- 【VBA】单元格插入图片,单元格删除图片
封装函数: Sub 插入产品形象(strRange As String, datebaseTu As String) Dim strJpg As String strJpg = datebaseTu ...
- NPOI 修改指定单元格字体颜色
//创建一个字体颜色 IFont font = hssfworkbook.CreateFont(); //红色 font.Color = HSSFColor.Red.Index; //样式 ICell ...
- C# NPOI Excel 合并单元格和取消单元格
1.合并单元操作 //合并单元格 /** 第一个参数:从第几行开始合并 第二个参数:到第几行结束合并 第三个参数:从第几列开始合并 第四个参数:到第几列结束合并 **/ CellRangeAddres ...
- DataGridView单元格内容自动匹配下拉显示
页面显示数据使用的控件是ComponentFactory.Krypton.Toolkit中的KryptonDataGridView控件.在指定“商品”单元格中需要根据用户输入内容自动匹配数据库中商品信 ...
- PHPEXCEL xls模板导入,及格式自定义:合并单元格、加粗、居中等操作
PHPExcel 是用来操作Office Excel 文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言.可以使用它来读取.写入不同格式的电子表格,如 Excel (BIFF) .xls ...
- 纯JS实现图片预览与等比例缩放和居中
最近做项目时有一个需求,广告位图片上传时要预览,并且要等比例缩放和居中.已经保存的广告位图片显示时也要等比例缩放和居中.我使用了下面的代码实现,不过可能有一些小问题. <!DOCTYPE HTM ...
随机推荐
- 《JavaScript高级程序设计》笔记:DOM扩展(十一)
选择符API querySelector()方法 // 取得body元素 var tbody = document.querySelector('body'); // 取得ID为"myDIV ...
- (一) Keras 一元线性回归
视频学习来源 https://www.bilibili.com/video/av40787141?from=search&seid=17003307842787199553 笔记 环境为 an ...
- DevExpress TreeList 禁止节点拖动到其他节点上
背景 在做一个类似文件树的控件,支持节点从树上向其它的控件拖动程序,但是要保证树上的节点不能拖动上其他的节点上. 代码 /// <summary> /// 拖动节点完成 /// </ ...
- Android 使用TextView实现跑马灯效果
前言 我们在开发中经常会遇到一个小问题.比如下面一个小例子: 这个文字太长,单行中导致无法全部显示出来,这就是今天要实现的功能. 当然,百度中也有很多这种解决方案. 其中有一种,例如: <Tex ...
- 使用AndroidStudio编写APICloud模块需要注意的地方,解决模块未定义。
在新的版本下,使用AndroidStudio编写APICloud模块,已经非常简单了,解决模块未定义,最重要的就是要先看官方的视频! 注意在模块的module.json中name很重要,建议做到三统一 ...
- Mysql得隔离级别
一.首先什么是事务? 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事 ...
- Win7环境 搭建IIS环境。发布asp.net MVC项目到IIS(第一期)
一.右键添加网站,输入网站基本配置信息. 二.成功添加网站后,应用程序池里会多一个应用,版本一定要改成4.0,并且模式是集成模式,否则项目报错(原因可以看配置文件中的版本信息). 三.再启用项目时可能 ...
- 安装了精简版的windows 的电脑如何修复?参照的程序集没有安装在系统上
我利用网络上的windows 10 纯净版来进行安装windows 10 镜像的时候,发现很多的windows 的服务都是不能用的.比如启动/删除 windows 功能就是不能用的,会出现如下信息: ...
- 周一02.3运行python程序的两种方式
一.运行python程序的两种方式 方法一:交互式: 优点:输入一行代码立刻返回结果 缺点:无法永久保存代码 方法二: ...
- 在html代码中js的script标签建议放在那里?
今天编写了一个简单的js代码,F12有错误,然后发现是<script>放的位置有问题.之前在我的印象当中,说的是这个标签放在哪里都可以,然而...并不是这样的,例如我现在练习的这个代码,写 ...