EPPlus将图片流嵌入到Excel

2023-12-14 16:36:20 浏览数 (1)

话说好长时间没用EPPlus进行生成Excel文件,对上的文章也是2019(EPPlus秘籍之Excel导出之图表导出),之后就有用但都是很简单的应用。这次为什么又提起呢?是因为一开始用FastReport做报表不错,但后来要求导出到Excel并且要在文件中插入图片,那就犯难了。因为图片是放在云服务器上的,最简单就做个图片引用就完事。但问题是导出的Excel后需要在内网(与互联网断开)的情况进行处理。那怎么办呢?有困难就要克服,那只能祭出我们的EPPlus

首先上个干货,就是EPPlus最新版开始商用要求License,那怎么解决,简单了就是弄个License。。

代码语言:c#复制
ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;

这样就解决License的问题。好,到主题了,因为我们的图片都是放在云服务器,直接引用可以,但无互联网就不行,那怎么办。办法很简单将图片嵌入到Excel解决,那又怎么嵌入的?研究了个把小时,终于有思路了。将云服务器上的图片转化为文件流,然后通过文件流写入到Excel。这又怎么把云服务器的图片转为文件流了,有了之前写过一个图片采集的功能,核心代码。

代码语言:c#复制
// 将图片转为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这个就没后继试,如果图片多可以再研究。上代码吧。

代码语言:c#复制
 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里面了。

0 人点赞