插入圖片主方法代碼:
1 /// <summary> 2 /// 插入圖片 3 /// </summary> 4 /// <param name="worksheet"></param> 5 /// <param name="imageBytes"></param> 6 /// <param name="rowNum"></param> 7 /// <param name="columnNum"></param> 8 /// <param name="autofit"></param> 9 public static void InsertImage(ExcelWorksheet worksheet, byte[] imageBytes, int rowNum, int columnNum, bool autofit) 10 { 11 using (var image = Image.FromStream(new MemoryStream(imageBytes))) 12 { 13 var picture = worksheet.Drawings.AddPicture($"image_{DateTime.Now.Ticks}", image); 14 var cell = worksheet.Cells[rowNum, columnNum]; 15 int cellColumnWidthInPix = GetWidthInPixels(cell); 16 int cellRowHeightInPix = GetHeightInPixels(cell); 17 int adjustImageWidthInPix = cellColumnWidthInPix; 18 int adjustImageHeightInPix = cellRowHeightInPix; 19 if (autofit) 20 { 21 //圖片尺寸適應單元格 22 var adjustImageSize = GetAdjustImageSize(image, cellColumnWidthInPix, cellRowHeightInPix); 23 adjustImageWidthInPix = adjustImageSize.Item1; 24 adjustImageHeightInPix = adjustImageSize.Item2; 25 } 26 //設置為居中顯示 27 int columnOffsetPixels = (int)((cellColumnWidthInPix - adjustImageWidthInPix) / 2.0); 28 int rowOffsetPixels = (int)((cellRowHeightInPix - adjustImageHeightInPix) / 2.0); 29 picture.SetSize(adjustImageWidthInPix, adjustImageHeightInPix); 30 picture.SetPosition(rowNum - 1, rowOffsetPixels, columnNum - 1, columnOffsetPixels); 31 } 32 }
GetAdjustImageSize方法:

1 /// <summary> 2 /// 獲取自適應調整后的圖片尺寸 3 /// </summary> 4 /// <param name="image"></param> 5 /// <param name="cellColumnWidthInPix"></param> 6 /// <param name="cellRowHeightInPix"></param> 7 /// <returns>item1:調整后的圖片寬度; item2:調整后的圖片高度</returns> 8 private static Tuple<int, int> GetAdjustImageSize(Image image, int cellColumnWidthInPix, int cellRowHeightInPix) 9 { 10 int imageWidthInPix = image.Width; 11 int imageHeightInPix = image.Height; 12 //調整圖片尺寸,適應單元格 13 int adjustImageWidthInPix; 14 int adjustImageHeightInPix; 15 if (imageHeightInPix * cellColumnWidthInPix > imageWidthInPix * cellRowHeightInPix) 16 { 17 //圖片高度固定,寬度自適應 18 adjustImageHeightInPix = cellRowHeightInPix; 19 double ratio = (1.0) * adjustImageHeightInPix / imageHeightInPix; 20 adjustImageWidthInPix = (int)(imageWidthInPix * ratio); 21 } 22 else 23 { 24 //圖片寬度固定,高度自適應 25 adjustImageWidthInPix = cellColumnWidthInPix; 26 double ratio = (1.0) * adjustImageWidthInPix / imageWidthInPix; 27 adjustImageHeightInPix = (int)(imageHeightInPix * ratio); 28 } 29 return new Tuple<int, int>(adjustImageWidthInPix, adjustImageHeightInPix); 30 }
GetWidthInPixels方法:

1 /// <summary> 2 /// 獲取單元格的寬度(像素) 3 /// </summary> 4 /// <param name="cell"></param> 5 /// <returns></returns> 6 private static int GetWidthInPixels(ExcelRange cell) 7 { 8 double columnWidth = cell.Worksheet.Column(cell.Start.Column).Width; 9 Font font = new Font(cell.Style.Font.Name, cell.Style.Font.Size, FontStyle.Regular); 10 double pxBaseline = Math.Round(MeasureString("1234567890", font) / 10); 11 return (int)(columnWidth * pxBaseline); 12 }
GetHeightInPixels方法:

1 /// <summary> 2 /// 獲取單元格的高度(像素) 3 /// </summary> 4 /// <param name="cell"></param> 5 /// <returns></returns> 6 private static int GetHeightInPixels(ExcelRange cell) 7 { 8 double rowHeight = cell.Worksheet.Row(cell.Start.Row).Height; 9 using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero)) 10 { 11 float dpiY = graphics.DpiY; 12 return (int)(rowHeight * (1.0 / DEFAULT_DPI) * dpiY); 13 } 14 }
MeasureString方法:

1 /// <summary> 2 /// MeasureString 3 /// </summary> 4 /// <param name="s"></param> 5 /// <param name="font"></param> 6 /// <returns></returns> 7 private static float MeasureString(string s, Font font) 8 { 9 using (var g = Graphics.FromHwnd(IntPtr.Zero)) 10 { 11 g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 12 return g.MeasureString(s, font, int.MaxValue, StringFormat.GenericTypographic).Width; 13 } 14 }