C#基于EPPlus插入图片到Excel单元格时高度拉伸如何解决
EPPlus插入Excel图片拉伸变形问题解决
错误原因
代码中的问题主要有3点:
- 强制设置固定宽高未保持原图比例:调用
pic.SetSize(316, 60)时同时传入了宽高参数,会直接将图片强制拉伸到指定尺寸,忽略原图的宽高比,直接导致变形。 - 单元格尺寸与图片尺寸不匹配:设置的第一行行高为46.61磅,但指定的图片高度为60像素,尺寸不匹配时EPPlus会自动调整图片显示规则,进一步加重拉伸问题。
- 未处理单位换算差异:Excel中行高单位为磅,列宽单位为字符数,和图片的像素单位存在换算关系,直接混用数值会导致尺寸计算偏差。
修复方案
修改逻辑为优先保持原图宽高比,再根据目标单元格尺寸适配,修改后代码如下:
imgCompanyLogo = Image.FromFile(@"C:\Users\tridip\Desktop\Test1\www_files\image002.png"); // 计算原图宽高比 double imgAspectRatio = (double)imgCompanyLogo.Width / imgCompanyLogo.Height; // 设置B1单元格尺寸 ws.Column(2).Width = 45.11; ws.Row(1).Height = 46.61; ExcelPicture pic = ws.Drawings.AddPicture("Logo", imgCompanyLogo); pic.SetPosition(0, 0, 1, 0); // 按单元格高度适配图片,宽度自动按比例计算,避免拉伸 int targetHeight = (int)(ws.Row(1).Height * 96 / 72); // 磅转像素,96为默认屏幕DPI int targetWidth = (int)(targetHeight * imgAspectRatio); pic.SetSize(targetWidth, targetHeight); // 可选:配置图片随单元格调整规则,避免后续调整单元格时变形 pic.EditAs = eEditAs.OneCell;
额外注意事项
- 如果只需要固定宽度,也可以仅指定宽度参数调用
SetSize,高度会自动按比例计算:pic.SetSize(316) - 如果原图DPI不是96,需要把换算公式中的96替换为原图实际DPI数值,避免尺寸偏差。
内容的提问来源于stack exchange,提问作者user15940620
相关产品推荐
相关产品推荐

