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 ...
随机推荐
- ArcGIS API for JavaScript 与 npm 之例子运行
下载官方的demo,4.7的,在终端里跑了一下,测试成功(未打包) 在测试中精简掉了不需要的文件,使用http协议跑的(file协议不行哦) 最简单的目录如下: 我把以上文件放到一个叫demo的文件夹 ...
- 关于写作那些事之github告诉我构建失败,然后呢?
The page build failed for the master branch with the following error 问题描述 看到这封邮件,一脸懵逼,本地运行 gitbook 服 ...
- vue(9)—— 组件化开发 - webpack(3)
前面两个终于把webpack相关配置解析完了.现在终于进入vue的开发了 vue组件化开发预热 前期准备 创建如下项目: app.js: footer.js: main.js: webpack.con ...
- JavaScript jQuery 中定义数组操作及数组操作
1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象 Javascript不支持多维数组,但是因为数组里面可以包含对象(数组也是一个对象),所以数组可以通过相互嵌套实现类似多维 ...
- centos7新增硬盘
centos7新增硬盘 步骤:分区---格式化---挂载(配置开机自动挂载) 1.分区 fdisk -l 查看硬盘信息确认新硬盘的名称(以/dev/sdb为例) fdisk /dev/sdb 管理硬 ...
- SQLServer之数据库行锁
行锁使用注意事项 1.ROWLOCK行级锁确保在用户取得被更新的行,到该行进行更新,这段时间内不被其它用户所修改.因而行级锁即可保证数据的一致性,又能提高数据操作的并发性. 2.ROWLOCK告诉SQ ...
- 浅谈 Angular 项目实战
为什么使用 Angular 我不是 Angular 的布道者,但如今痴迷 Angular,使用 Angular 做项目让我有一种兴奋感.目前的三大主流前端框架都研究过,博客中也有三者的相关教程,最早接 ...
- Socket网络编程(案例)
Socket:套接字 java.net包 1.流式套接字:基于TCP协议的Socket网络编程 工作方式: 1.客户端A连接到服务器: 2.服务器建立连接并把客户端A添加到列表: 3.客户端B.C.. ...
- 算法笔记-exgcd
扩展欧几里得 扩展欧几里德算法是用来在已知a, b求解一组x,y, 使它们满足贝祖等式: ax+by = gcd(a, b) =d(解一定存在,根据数论中的相关定理). 扩展欧几里德常用在求解模线性方 ...
- XAMPP支持多PHP版本
在使用xampp进行开发的时候,我们都知道它只能支持一个PHP版本不能像PHPstudy那样方便进行不同版本的切换操作.因此我们手动的对于xampp进行改造一下,使其支持其他PHP版本 1. 从官网上 ...