c#使用EPPlus将图片流嵌入到Excel实现示例
作者:谭广健
引言
话说好长时间没用EPPlus进行生成Excel文件,对上的文章也是2019(EPPlus秘籍之Excel导出之图表导出),之后就有用但都是很简单的应用。这次为什么又提起呢?是因为一开始用FastReport做报表不错,但后来要求导出到Excel并且要在文件中插入图片,那就犯难了。因为图片是放在云服务器上的,最简单就做个图片引用就完事。但问题是导出的Excel后需要在内网(与互联网断开)的情况进行处理。那怎么办呢?有困难就要克服,那只能祭出我们的EPPlus
弄个License
首先上个干货,就是EPPlus最新版开始商用要求License,那怎么解决,简单了就是弄个License。。
ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
这样就解决License的问题。好,到主题了,因为我们的图片都是放在云服务器,直接引用可以,但无互联网就不行,那怎么办。
办法很简单将图片嵌入到Excel解决,那又怎么嵌入的?研究了个把小时,终于有思路了。
图片采集的功能
将云服务器上的图片转化为文件流,然后通过文件流写入到Excel。这又怎么把云服务器的图片转为文件流了,有了之前写过一个图片采集的功能
核心代码
// 将图片转为byte字段 public byte[] DownloadImageAsByteArray(string imageUrl) { using (var client = new HttpClient()) { var response = client.GetAsync(imageUrl).Result; return response.Content.ReadAsByteArrayAsync().Result; } } MemoryStream imageData = new System.IO.MemoryStream(DownloadImageAsByteArray(img_src));
上面的DownloadImageAsByteArray的方法,就是将图片地址的图片转为byte字段,然后再写入MemoryStream类了,就完成图片的采集。
如何让写入
既然内存类已经获得图片的文件流,那又怎么写入呢?
查看了一圈EPPlus才发现有2个方法:
- 1、AddPicture 这个直接存入。
- 2、AddPictureAsync 照字面解析应该是异步。
2个都可以但AddPictureAsync可能是异步的原因无法进行图片的定位,当然也可能我没发现,反正我直接用AddPicture、然后SetSize及SetPosition完事。AddPictureAsync这个就没后继试,如果图片多可以再研究。
上代码吧
string img_src = ps_list.URL.Replace("cloud://cloud1-8g4e2khfd2b8c508.636c-cloud1-8g4e2khfd2b8c508-1320236877", "http://636c-cloud1-8g4e2khfd2b8c508-1320236877.tcb.qcloud.la"); MemoryStream imageData = new System.IO.MemoryStream(DownloadImageAsByteArray(img_src)); ExcelPicture image = worksheet.Drawings.AddPicture(obj.Id, imageData); image.SetSize(300, 300); image.SetPosition(rowIndex - 1, 30, 9, 30);
大概就是将微信云的图片转为 http方式,然后将图片存入文件流;再注入到EPPlus,然后就设置图片大小及位置。这里值得一提的是SetPosition,SetPosition可以4个参数,第一个Row就是行,第二个就行起位置,第三个就是列,最后一个就是列起位置。 这样就完美地将通过EPPlus将图片嵌入到Excel里面了。
以上就是c#使用EPPlus将图片流嵌入到Excel实现示例的详细内容,更多关于c# EPPlus图片流嵌入Excel的资料请关注脚本之家其它相关文章!