EPPlus实现Excel工作簿中插入图片

摘要:
插入图片的主要方法代码:1///2///插入图片3///4///5//6///7///8///˂paramname=“a

插入图片主方法代码:

 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方法:

EPPlus实现Excel工作簿中插入图片第1张EPPlus实现Excel工作簿中插入图片第2张
 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 }
View Code

GetWidthInPixels方法:

EPPlus实现Excel工作簿中插入图片第1张EPPlus实现Excel工作簿中插入图片第2张
 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 }
View Code

GetHeightInPixels方法:

EPPlus实现Excel工作簿中插入图片第1张EPPlus实现Excel工作簿中插入图片第2张
 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 }
View Code

MeasureString方法:

EPPlus实现Excel工作簿中插入图片第1张EPPlus实现Excel工作簿中插入图片第2张
 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 }
View Code

免责声明:文章转载自《EPPlus实现Excel工作簿中插入图片》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【ogg三】日常运维篇:清理归档日志,ogg进程注册服务,定期备份数据库启用代理导致 有道云笔记未知错误、网络错误和OneDrive断线下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

UITableView+FDTemplateLayoutCell源码学习笔记

本文转载至  http://www.cocoachina.com/bbs/read.php?tid=299773基本原理是通过缓存每个cell的高度,当tableview回调delegate的heightForRowAtIndexPath的时候,省去了计算cell高度计算,极大的提高了tableview的滑动体验。 因为 heightForRowAt...

iOS开发之--使用storyboard下,tabbar小图标和文字颜色的设置

在开发项目的时候,如果是使用故事版设计的架构,那么在设置tabbar小图标的时候,可能会出现一点小问题, 成功的设置方法如下: 1.设置seleectedImage和image,其实就是非选中状态的图片,设置选中是的图片,也可以用代码设置,如下: self.tabBarController.tabBar.selectedItem.selectedI...

解决UItableView cell的间隔线 separatorStyle ( plain group 两种类型)

一 . Plain类型的: 做法 cell 的backgroupView 是设置的 57 pix,在此基础上 在方法willDisplayCell 中 cell.backgroundView添加一个高为55Pix的view 作为背景 这样就有了 2pix的 cell 下边框了   -(CGFloat)tableView:(UITableView *)tab...

ios开发之--UITableView中的visibleCells的用法

先上图: 具体代码如下: #import "ViewController.h" @interface ViewController ()<UITableViewDelegate,UITableViewDataSource> @property(nonatomic,strong)UITableView *myTableV; @propert...

Vue实现图片预加载

<script>export default { data () { return { count: 0, } }, mounted: function() { this.preload() }, methods: { preload: function() { let imgs = [ "static/img/back.gif", "sta...

#应用openxml读写excel代码

这个例子比较简单,没有考虑格式之类的问题。 using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using System; using System.Collections.Generic; using System.IO; using Syst...