c#使用EPPlus將圖片流嵌入到Excel實(shí)現(xiàn)示例
引言
話說好長時(shí)間沒用EPPlus進(jìn)行生成Excel文件,對上的文章也是2019(EPPlus秘籍之Excel導(dǎo)出之圖表導(dǎo)出),之后就有用但都是很簡單的應(yīng)用。這次為什么又提起呢?是因?yàn)橐婚_始用FastReport做報(bào)表不錯(cuò),但后來要求導(dǎo)出到Excel并且要在文件中插入圖片,那就犯難了。因?yàn)閳D片是放在云服務(wù)器上的,最簡單就做個(gè)圖片引用就完事。但問題是導(dǎo)出的Excel后需要在內(nèi)網(wǎng)(與互聯(lián)網(wǎng)斷開)的情況進(jìn)行處理。那怎么辦呢?有困難就要克服,那只能祭出我們的EPPlus
(EPPlus秘籍之Excel導(dǎo)出之圖表導(dǎo)出)
弄個(gè)License
首先上個(gè)干貨,就是EPPlus最新版開始商用要求License,那怎么解決,簡單了就是弄個(gè)License。。
ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
這樣就解決License的問題。好,到主題了,因?yàn)槲覀兊膱D片都是放在云服務(wù)器,直接引用可以,但無互聯(lián)網(wǎng)就不行,那怎么辦。
辦法很簡單將圖片嵌入到Excel解決,那又怎么嵌入的?研究了個(gè)把小時(shí),終于有思路了。
圖片采集的功能
將云服務(wù)器上的圖片轉(zhuǎn)化為文件流,然后通過文件流寫入到Excel。這又怎么把云服務(wù)器的圖片轉(zhuǎn)為文件流了,有了之前寫過一個(gè)圖片采集的功能
核心代碼
// 將圖片轉(zhuǎn)為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的方法,就是將圖片地址的圖片轉(zhuǎn)為byte字段,然后再寫入MemoryStream類了,就完成圖片的采集。
如何讓寫入
既然內(nèi)存類已經(jīng)獲得圖片的文件流,那又怎么寫入呢?
查看了一圈EPPlus才發(fā)現(xiàn)有2個(gè)方法:
- 1、AddPicture 這個(gè)直接存入。
- 2、AddPictureAsync 照字面解析應(yīng)該是異步。
2個(gè)都可以但AddPictureAsync可能是異步的原因無法進(jìn)行圖片的定位,當(dāng)然也可能我沒發(fā)現(xiàn),反正我直接用AddPicture、然后SetSize及SetPosition完事。AddPictureAsync這個(gè)就沒后繼試,如果圖片多可以再研究。
上代碼吧
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);
大概就是將微信云的圖片轉(zhuǎn)為 http方式,然后將圖片存入文件流;再注入到EPPlus,然后就設(shè)置圖片大小及位置。這里值得一提的是SetPosition,SetPosition可以4個(gè)參數(shù),第一個(gè)Row就是行,第二個(gè)就行起位置,第三個(gè)就是列,最后一個(gè)就是列起位置。 這樣就完美地將通過EPPlus將圖片嵌入到Excel里面了。
以上就是c#使用EPPlus將圖片流嵌入到Excel實(shí)現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于c# EPPlus圖片流嵌入Excel的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#怎么實(shí)現(xiàn)手機(jī)短信發(fā)送功能
為了個(gè)人信息的安全,很多網(wǎng)站都有短信發(fā)送的功能,究竟是怎么實(shí)現(xiàn)的呢?對于個(gè)人站長來說的話,通過使用sms短信通知api接口相對比較簡單,下面小編給大家介紹具體實(shí)現(xiàn)過程,對c#怎么實(shí)現(xiàn)手機(jī)短信發(fā)送功能感興趣的朋友一起學(xué)習(xí)吧2015-12-12c#獲得目標(biāo)服務(wù)器中所有數(shù)據(jù)庫名、表名、列名的實(shí)現(xiàn)代碼
這篇文章主要介紹了c#獲得目標(biāo)服務(wù)器中所有數(shù)據(jù)庫名、表名、列名的方法,需要的朋友可以參考下2014-05-05C#?TaskScheduler任務(wù)調(diào)度器的實(shí)現(xiàn)
本文主要介紹了C#?TaskScheduler任務(wù)調(diào)度器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>2023-05-05c# for循環(huán)中創(chuàng)建線程執(zhí)行問題
這篇文章主要介紹了有關(guān)c# for循環(huán)中創(chuàng)建線程執(zhí)行問題,下面文章將將以舉例的方式展開for循環(huán)中創(chuàng)建線程執(zhí)行問題的內(nèi)容,需要的朋友可以參考一下,希望對你有所幫助2021-11-11C#將隱私信息(銀行賬戶,身份證號碼)中間部分特殊字符替換成*
大家在銀行交易某些業(yè)務(wù)時(shí),都可以看到無論是身份證、銀行賬號中間部分都是用*號替換的,下面這篇文章主要介紹C#將隱私信息(銀行賬戶,身份證號碼)中間部分特殊字符替換成*的相關(guān)資料,需要的朋友可以參考下2015-08-08Extjs4如何處理后臺(tái)json數(shù)據(jù)中日期和時(shí)間
本文給大家分享Extjs4如何處理后臺(tái)json數(shù)據(jù)中日期和時(shí)間,通過代碼示例給大家剖析,感興趣的朋友快來圍觀2015-08-08