1. 程式人生 > >Excel催化劑開源第5波-任務窗格在OFFICE2013中新建文件不能同步顯示問題解決

Excel催化劑開源第5波-任務窗格在OFFICE2013中新建文件不能同步顯示問題解決

在OFFICE2013及之後,使用了單文件介面技術,不同於以往版本可以共享任務空格、功能區。所以當開發任務窗格時,需要考慮到每一個工作薄都關聯一個任務窗格。

背景介紹

單文件介面摘錄官方定義如下:
對 Excel 2013 中的單文件介面 (SDI) 進行更改對可程式設計性具有一定影響。SDI 意味著每個工作簿都將有其自己的頂級應用程式視窗,並將有自己的相應功能區。

帶來的好處是不同工作薄可以精細控制不同的顯示,例如工作薄A,顯示功能區Tab1,工作薄B顯示功能區Tab2,區分對待不同文件所使用的功能。

帶來的不便之處就是要每個文件都要考慮關聯對應的介面,特別是任務窗格。

具體程式碼實現

Excel催化劑外掛也大量使用了任務窗格,為了讓使用者在作配置資訊時,可以更靈活,不必每次都彈出一個窗體來配置,只有需要配置時,才轉到任務窗格中配置,否則保留預設的配置,並且預設配置可以讓使用者在任務窗格上檢視。

所以用了任務窗格,需要做版本相容性,即區分Excel2013及之後的版本的SDI特性。

下面擷取關鍵程式碼,以Excel工作薄的工作表導航功能為例,作簡單解釋

  工作表導航任務窗格

先初始化字典變數

        private static void InialTaskPanel() { Utilities.TaskPanelUtility.CustomTaskPanesOfWorksheetNavigation = new Dictionary<int, Microsoft.Office.Tools.CustomTaskPane>(); Utilities.TaskPanelUtility.UscWorksheetNavigations = new Dictionary<int, UscWorksheetNavigation>(); } 

根據不同版本的Excel啟用不同方法

        private void tgbShowActionPanel_Click(object sender, RibbonControlEventArgs e)
        {
            RibbonToggleButton tgb = sender as RibbonToggleButton;
            try
            {
                if (Single.Parse(Common.ExcelApp.Version) >= 15) { WorksheetNavigate.ShowCustomTaskPanelOfWorksheetNavigationOfExcel2013(tgb.Checked); } else { WorksheetNavigate.ShowCustomTaskPanelOfWorksheetNavigationOfExcel2010(tgb.Checked); } //將工作表導航的顯示狀態儲存起來 Properties.Settings.Default.IsPaneVisible = tgb.Checked; Properties.Settings.Default.Save(); } catch (Exception ex) { Common.OutMsgError(ex); } } 

重點是2013版的方法,關鍵之處是拿到當前的活動窗體的控制代碼,通過字典查詢是否已經建立過,沒建立就新建,新建完要把它控制代碼存入到字典中。

        public static void ShowCustomTaskPanelOfWorksheetNavigationOfExcel2013(bool isPaneVisible) { int hwndCustomTaskPane = Common.ExcelApp.ActiveWindow.Hwnd; Microsoft.Office.Tools.CustomTaskPane activeCustomTaskPane; Utilities.TaskPanelUtility.CustomTaskPanesOfWorksheetNavigation.TryGetValue(hwndCustomTaskPane, out activeCustomTaskPane); if (activeCustomTaskPane == null) { UscWorksheetNavigation uscWorksheetNavigation = new UscWorksheetNavigation(); activeCustomTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(uscWorksheetNavigation, "工作表導航", Globals.ThisAddIn.Application.ActiveWindow); activeCustomTaskPane.DockPosition = Office.MsoCTPDockPosition.msoCTPDockPositionLeft; activeCustomTaskPane.Width = 300; activeCustomTaskPane.VisibleChanged += ActiveCustomTaskPane_VisibleChanged; activeCustomTaskPane.Visible = isPaneVisible; Utilities.TaskPanelUtility.CustomTaskPanesOfWorksheetNavigation.Add(hwndCustomTaskPane, activeCustomTaskPane); Utilities.TaskPanelUtility.UscWorksheetNavigations.Add(hwndCustomTaskPane, uscWorksheetNavigation); } else { activeCustomTaskPane.Visible = isPaneVisible; if (isPaneVisible) { Utilities.TaskPanelUtility.UscWorksheetNavigations[hwndCustomTaskPane].ReLoadWorksheetName(); } } } 

因工作表導航,每切換一次工作薄,都要更新下工作表清單,所以訂閱了一個窗體切換事件,其他場景可能不必這樣做,只需訂閱個開啟檔案事件即可。

        private void ExcelApp_WindowActivate(Excel.Workbook Wb, Excel.Window Wn) { try { if (Common.ExcelApp.ActiveWorkbook.ProtectStructure == false) { bool isPaneVisible = Properties.Settings.Default.IsPaneVisible; if (Single.Parse(Common.ExcelApp.Version) >= 15) { int hwndCustomTaskPane = this.Application.ActiveWindow.Hwnd; WorksheetNavigate.ShowCustomTaskPanelOfWorksheetNavigationOfExcel2013(isPaneVisible); } else { WorksheetNavigate.ShowCustomTaskPanelOfWorksheetNavigationOfExcel2010(isPaneVisible); } } } catch (Exception) { } } 

其他的非關鍵程式碼,自己把握如何寫就行,筆者寫程式碼也有限,只能拋磚引玉了。

結語

通過直接的原始碼講解,希望對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催化劑一直能執行下去,我所惠及的群體們能夠給予支援(多留言鼓勵下、轉發下朋友圈推薦、小額打賞下和最重點的可以和所在公司及同行推薦推薦,讓我的技術可以在貴司發揮價值,實現雙贏(初步設想可以資料顧問的方式或一些小型專案開發的方式合作)。