1. 程式人生 > >Excel催化劑開源第9波-VSTO開發圖片插入功能,圖片帶事件

Excel催化劑開源第9波-VSTO開發圖片插入功能,圖片帶事件

圖片插入功能,這個是Excel外掛的一大剛需,但目前在VBA接口裡開發,如果用Shapes.AddPicture方法插入的圖片,沒法對其新增事件,且圖片插入後需等比例調整縱橫比例特別麻煩,特別是對於插入的多個圖片非統一的縱橫尺寸比時。

例如一個很經典的需求是將插入的縮圖放大操作,沒法點選、雙擊之類的事件響應對應的放大操作。

在VBA的方法中,還有一個方式,用窗體控制元件Image,可以實現圖片插入後有事件關聯。

 

  窗體控制元件Image方法插入

但很遺憾的是,這個方法中插入的圖片,當沒有點選圖片時,圖片會有些模糊的情況。具體可對比下圖左右部分。這個模糊的問題,還是老大難,難於達到完美。如果換成是VSTO的宿主項PictureBox,就完美解決了。

  兩種不同窗體控制元件方式插入圖片

例如下圖中的,用滑鼠右鍵事件,調出上下文選單。和Excel催化劑中的雙擊圖片進行圖片下載本地並呼叫Windows圖片檢視器實現圖片的放大功能。

  可以關聯事件的插入圖片方法   雙擊圖片事件   保留有正確的原始圖片縱橫比例

筆者覺得這是個接近完美的解決方案(用窗體控制元件的方式插入圖片,使用者不能直接選擇圖片、移動圖片,會有種奇怪的感覺)。

具體實現

使用VSTO的PictureBox容器,將其圖片屬性設定成對應的圖片物件即可,此處傳入的圖片物件是Image物件,不必像VBA方法裡的只能傳入檔案全路徑,可以方便某些資料庫等方式儲存二進位制圖片格式時,直接呼叫。

 public static string AddPictureBoxToVstoWorkSheet(Excel.Range dstRange, Image img, string fileExt, bool hasBordersMargin, bool isLookupFromRangValue, int offsetRow, int offsetCol) { string picName = Guid.NewGuid().ToString(); Excel.Worksheet actSht = dstRange.Worksheet; Worksheet vstoActSht = Globals.Factory.GetVstoObject(actSht); PictureBox pictureBox = new PictureBox(); pictureBox.Image = img; pictureBox.SizeMode = PictureBoxSizeMode.Zoom; pictureBox.MouseDoubleClick += PictureBox_MouseDoubleClick; AddContextMenuToPictureBox(pictureBox); pictureBox.Name = picName; ControlSite controlSite; if (hasBordersMargin) { controlSite = vstoActSht.Controls.AddControl( control: pictureBox, top: dstRange.Top + 2, left: dstRange.Left + 2, height: dstRange.Height - 4, width: dstRange.Width - 4, name: picName); } else { controlSite = vstoActSht.Controls.AddControl( control: pictureBox, range: dstRange, name: picName); } string srcFileName = string.Empty; Excel.Range srcFileNameRange = null; if (isLookupFromRangValue) { //取回圖片檔名的單元格,可拿到檔名,我初始的單元格地址,為後面有可能插入過行、列來重新定位。 srcFileNameRange = dstRange.Offset[-offsetRow, -offsetCol]; srcFileName = srcFileNameRange == null ? "" : srcFileNameRange.Value2.ToString(); } Common.vstoPicInfos.Add( new Entity.VstoPicInfo() { PicName = picName, IsLookupFromRangValue = isLookupFromRangValue, PicOleName = controlSite.Name, PicSht = actSht, SrcFileNameRange = srcFileNameRange, DstRange = dstRange, SrcFileName = srcFileName, ImageExt = fileExt, PictureBoxImage = img }); return picName; } 

其中核心程式碼有:
得到一個VSTO的WorkSheet物件和新建一個PictureBox物件。

  Excel.Worksheet actSht = dstRange.Worksheet;
            Worksheet vstoActSht = Globals.Factory.GetVstoObject(actSht);
            PictureBox pictureBox = new PictureBox();
            pictureBox.Image = img;
            pictureBox.SizeMode = PictureBoxSizeMode.Zoom;

通過方法vstoActSht.Controls.AddControl進行建立一個Picturebox到工作表中。具體各引數的意義和VBA的AddPicture方法類似,可自行查閱文件。

   controlSite = vstoActSht.Controls.AddControl(
                       control: pictureBox,
                       top: dstRange.Top + 2,
                       left: dstRange.Left + 2,
                       height: dstRange.Height - 4,
                       width: dstRange.Width - 4,
                       name: picName);

通過以上的方法,即可建立了一個PictureBox物件容器,並且圖片是我們傳入的圖片。這當中可以繫結一些PictureBox事件和上下文選單等,如:

pictureBox.MouseDoubleClick += PictureBox_MouseDoubleClick;

        private static void AddContextMenuToPictureBox(PictureBox pictureBox) { ContextMenuStrip contextMenuStrip = new ContextMenuStrip(); string[] btnsText = { "複製另存為", "移動至其他區域", "刪除圖片" }; foreach (var btnText in btnsText) { ToolStripButton toolStripButton = new ToolStripButton(btnText); toolStripButton.Tag = pictureBox; toolStripButton.Click += PictureBoxToolStripButton_Click; contextMenuStrip.Items.Add(toolStripButton); } pictureBox.ContextMenuStrip = contextMenuStrip; } 

通過此方法插入的PictureBox,儲存關閉後,Excel檔案因無法在關閉狀態下儲存PictureBox物件,將會將其轉換為OLE物件儲存,設定過的事件將失效,Excel催化劑用了複雜的手段來恢復它,下篇其他技術時再進行介紹

結語

圖片插入這樣一個剛需功能,在Excel催化劑上已經將其做到極致化的體驗,也是有別於傳統方式所實現的,在使用者體驗上,相信有對比後,也會喜歡上Excel催化劑這樣的突破性的方式。

此篇已經對核心的技術及程式碼完成開源公開化,有興趣的朋友們,可以一試。

技術交流QQ群

QQ群名:Excel催化劑開源討論群, QQ群號:788145319

 

  Excel催化劑開源討論群二維碼

關於Excel催化劑

Excel催化劑先是一微信公眾號的名稱,後來順其名稱,正式推出了Excel外掛,外掛將持續性地更新,更新的週期視本人的時間而定爭取一週能夠上線一個大功能模組。Excel催化劑外掛承諾個人使用者永久性免費使用!

Excel催化劑外掛使用最新的佈署技術,實現一次安裝,日後所有更新自動更新完成,無需重複關注更新動態,手動下載安裝包重新安裝,只需一次安裝即可隨時保持最新版本!

Excel催化劑外掛下載連結:https://pan.baidu.com/s/1Iz2_NZJ8v7C9eqhNjdnP3Q

  聯絡作者   公眾號

取名催化劑,因Excel本身的強大,並非所有人能夠立馬享受到,大部分人還是在被Excel軟體所虐的階段,就是頭腦裡很清晰想達到的效果,而且高手們也已經實現出來,就是自己怎麼弄都弄不出來,或者更糟的是還不知道Excel能夠做什麼而停留在不斷地重複、機械、手工地在做著資料,耗費著無數的青春年華歲月。所以催生了是否可以作為一種媒介,讓廣大的Excel使用者們可以瞬間點燃Excel的爆點,無需苦苦地掙扎地沒日沒夜的技巧學習、高階複雜函式的燒腦,最終走向了從入門到放棄的道路。

最後Excel功能強大,其實還需樹立一個觀點,不是所有事情都要交給Excel去完成,也不是所有事情Excel都是十分勝任的,外面的世界仍然是一個廣闊的世界,Excel只是其中一枚耀眼的明星,還有其他更多同樣精彩強大的技術、工具等。*Excel催化劑也將借力這些其他技術,讓Excel能夠發揮更強大的爆發!

關於Excel催化劑作者

姓名:李偉堅,從事資料分析工作多年(BI方向),一名同樣在路上的學習者。
服務過行業:零售特別是鞋服類的零售行業,電商(淘寶、天貓、京東、唯品會)

技術路線從一名普通使用者,通過Excel軟體的學習,從此走向資料世界,非科班IT專業人士。
歷經重重難關,終於在資料的道路上達到技術平原期,學習眾多的知識不再太吃力,同時也形成了自己的一套資料解決方案(資料採集、資料加工清洗、資料多維建模、資料報表展示等)。

擅長技術領域:Excel等Office家族軟體、VBA&VSTO的二次開發、Sqlserver資料庫技術、Sqlserver的商業智慧BI技術、Powerbi技術、雲伺服器佈署技術等等。

2018年開始職業生涯作了重大調整,從原來的正職工作,轉為自由職業者,暫無固定收入,暫對前面道路不太明朗,苦重新回到正職工作,對Excel催化劑的運營和開發必定受到很大的影響(正職工作時間內不可能維護也不可能隨便把工作時間內的成果公佈於外,工作外的時間也十分有限,因已而立之年,家庭責任重大)。

和廣大擁護者一同期盼:Excel催化劑一直能執行下去,我所惠及的群體們能夠給予支援(多留言鼓勵下、轉發下朋友圈推薦、小額打賞下和最重點的可以和所在公司及同行推薦推薦,讓我的技術可以在貴司發揮價值,實現雙贏(初步設想可以資料顧問的方式或一些小型專案開發的方式合作)。

技術交流QQ群

QQ群名:Excel催化劑開源討論群, QQ群號:788145319

 

  Excel催化劑開源討論群二維碼

關於Excel催化劑

Excel催化劑先是一微信公眾號的名稱,後來順其名稱,正式推出了Excel外掛,外掛將持續性地更新,更新的週期視本人的時間而定爭取一週能夠上線一個大功能模組。Excel催化劑外掛承諾個人使用者永久性免費使用!

Excel催化劑外掛使用最新的佈署技術,實現一次安裝,日後所有更新自動更新完成,無需重複關注更新動態,手動下載安裝包重新安裝,只需一次安裝即可隨時保持最新版本!

Excel催化劑外掛下載連結:https://pan.baidu.com/s/1Iz2_NZJ8v7C9eqhNjdnP3Q

  聯絡作者   公眾號

取名催化劑,因Excel本身的強大,並非所有人能夠立馬享受到,大部分人還是在被Excel軟體所虐的階段,就是頭腦裡很清晰想達到的效果,而且高手們也已經實現出來,就是自己怎麼弄都弄不出來,或者更糟的是還不知道Excel能夠做什麼而停留在不斷地重複、機械、手工地在做著資料,耗費著無數的青春年華歲月。所以催生了是否可以作為一種媒介,讓廣大的Excel使用者們可以瞬間點燃Excel的爆點,無需苦苦地掙扎地沒日沒夜的技巧學習、高階複雜函式的燒腦,最終走向了從入門到放棄的道路。

最後Excel功能強大,其實還需樹立一個觀點,不是所有事情都要交給Excel去完成,也不是所有事情Excel都是十分勝任的,外面的世界仍然是一個廣闊的世界,Excel只是其中一枚耀眼的明星,還有其他更多同樣精彩強大的技術、工具等。*Excel催化劑也將借力這些其他技術,讓Excel能夠發揮更強大的爆發!

關於Excel催化劑作者

姓名:李偉堅,從事資料分析工作多年(BI方向),一名同樣在路上的學習者。
服務過行業:零售特別是鞋服類的零售行業,電商(淘寶、天貓、京東、唯品會)

技術路線從一名普通使用者,通過Excel軟體的學習,從此走向資料世界,非科班IT專業人士。
歷經重重難關,終於在資料的道路上達到技術平原期,學習眾多的知識不再太吃力,同時也形成了自己的一套資料解決方案(資料採集、資料加工清洗、資料多維建模、資料報表展示等)。

擅長技術領域:Excel等Office家族軟體、VBA&VSTO的二次開發、Sqlserver資料庫技術、Sqlserver的商業智慧BI技術、Powerbi技術、雲伺服器佈署技術等等。

2018年開始職業生涯作了重大調整,從原來的正職工作,轉為自由職業者,暫無固定收入,暫對前面道路不太明朗,苦重新回到正職工作,對Excel催化劑的運營和開發必定受到很大的影響(正職工作時間內不可能維護也不可能隨便把工作時間內的成果公佈於外,工作外的時間也十分有限,因已而立之年,家庭責任重大)。

和廣大擁護者一同期盼:Excel催化劑一直能執行下去,我所惠及的群體們能夠給予支援(多留言鼓勵下、轉發下朋友圈推薦、小額打賞下和最重點的可以和所在公司及同行推薦推薦,讓我的技術可以在貴司發揮價值,實現雙贏(初步設想可以資料顧問的方式或一些小型專案開發的方式合作)。