最近在使用微軟的Office Project 2010 進行項目管理,看到排的滿滿的計劃任務,一個個地被執行完畢,仍是頗有成就感的。其實,不光是在工做中可使用Project進行項目進度控制,一樣能夠把這款軟件應用在平常的生活中,好比爲閱讀某本書排一個計劃,而任務單元就是本書的目錄,固然粒度能夠本身定製;也能夠爲健身排一個計劃,每週去幾回健身房、每次作多少個動做、作什麼類型的動做,均可以提早排程,每完成一項就就在任務進度上狠狠地輸入100%,那是多麼爽的事啊。html
可是,經過一段時間的使用,我發現本身有一個個性化的需求,就是習慣爲各類狀態的任務加上不一樣的背景色,這樣就會很清晰直觀地掌握任務的整體完成狀況;還有就是很不喜歡Project自帶的建立任務的方式,但願能夠以本身的方式來建立任務,好比任務的資源通常是我本身的名字(大多數狀況),因此我但願建立任務的時候,默認帶出資源名稱,再好比我喜歡用微軟雅黑做爲默認字體,可是每次都是設置好單個單元格後,再用格式刷去刷,非常麻煩,再好比表示任務狀態的背景色,也是本身一點點用格式刷去刷的,若是不經常使用這個工具還好,可是老是這樣不免讓人反感,因此就產生了這個想法。以上就是我本身的個性化需求,若是後續有其餘想法,還能夠本身擴展,把懶人的風格發揚到底。在園子裏也找了一些相關資料,可是和個人出發點都不是很吻合,因此廢話很少說,本身動手,豐衣足食。git
以前作過Word的插件開發,裏面的各個組件(Range,Paragraph,Selection)等都是有規律可循的,大多數對象都有本身的集合,並且多個對象之間的關聯比較密切,可是Project的模型讓我很費解,好比裏面的單元格Cell,竟然不存在集合的概念(見微軟官方文檔),這裏面比較重要的模型有如下幾個:Application、Task、Cell、Resource等,固然,還有其餘的比較重要的模型,只是否是很經常使用,在此不作說明。github
Represents the active cell. (There is no collection for Cell objects.) The Cell object can be accessed only through the ActiveCell property of the Application object.app
Represents a task. The Task object is a member of the Tasks collection.工具
Use Tasks(Index), where Index is the task index number or task name, to return a single Task object. The following example prints the name of every resource assigned to every task in the active project.學習
仍是先來看下自定義的建立任務窗口,效果以下:字體
因爲個人個性化需求不是很複雜,就簡單地建立了一個存儲經常使用字段的Model,主要包括Task的經常使用屬性,好比任務名稱、工期、起止時間、資源以及完成百分比。如下是添新任務的代碼段:spa
1 private void Create_Click(object sender, EventArgs e) 2 { 3 if (string.IsNullOrEmpty(taskName.Text)) return; 4 Project proj = Globals.ThisAddIn.Application.ActiveProject; 5 TaskModel.TaskModel taskModel = new TaskModel.TaskModel 6 { 7 TaskName = taskName.Text, 8 TaskDuring = taskDuring.Value.ToString(), 9 ResourceNames = taskResource.Text, 10 Notes = taskNotes.Text 11 }; 12 13 Application_NewProject(proj, taskModel); 14 }
Application_NewProject接受一個當前的ActiveProject對象和一個TaskModel對象,代碼以下:插件
1 private void Application_NewProject(Microsoft.Office.Interop.MSProject.Project pj, TaskModel.TaskModel taskModel) 2 { 3 object missing = Type.Missing; 4 TaskModel.TaskModel tm = taskModel; 5 Microsoft.Office.Interop.MSProject.Task newTask = pj.Tasks.Add(tm.TaskName, missing); 6 newTask.Start = DateTime.Now; 7 newTask.Duration = tm.TaskDuring; 8 newTask.ResourceNames = tm.ResourceNames.ToString(); 9 newTask.Notes = tm.Notes; 10 }
新增Task是經過Project對象的Tasks屬性的Add方法添加的。Task還有不少其餘的屬性,在此也不一一列舉。code
先看下總體的效果圖:
在使用插件處理前基本是這樣的
在使用插件處理後是這樣的,預設好的背景色、字體、狀態等。
這樣一鍵處理後,看起來舒服多了,每項任務都有三個狀態,即【準備】、【執行】、【完成】。【準備】對應背景色爲紅色,【執行】對應背景色爲黃色,【完成】對應背景色爲綠色,這樣就會對項目任務進度的大概完成程度有一個直觀的把握。相對於格式刷子來講仍是很方便的。
下面是部分代碼:
1 /// <summary> 2 /// 根據任務狀態進行背景填充的核心方法 3 /// </summary> 4 private void CallSelectTaskField() 5 { 6 foreach (Task task in Globals.ThisAddIn.Application.ActiveProject.Tasks) 7 { 8 Globals.ThisAddIn.Application.SelectTaskField(task.Index, "名稱", false, 6, 0); 9 if (task.PercentComplete == 0) 10 { 11 CallFont32Ex(CommonData.MappingColorState(CommonData.TaskState.Ready)); 12 } 13 else if (task.PercentComplete == 100) 14 { 15 CallFont32Ex(CommonData.MappingColorState(CommonData.TaskState.Complete)); 16 } 17 else 18 { 19 CallFont32Ex(CommonData.MappingColorState(CommonData.TaskState.Processing)); 20 } 21 } 22 }
上面的代碼中涉及到兩個個核心模型,一個是Application,這是整個應用程序級別的對象,不少東西都封裝在裏面,包括ActiveCell、ActiveSelection、ActiveWindow以及上面代碼中的ActiveProject,具體的成員請看這裏;還有一個就是Task,Task模型對應的是Project中一條條的任務,它的不少成員都是動態類型(Dynamic),具體模型在這裏,成員在這裏。代碼中從當前活動的Project中獲取全部Task集合,並判斷每一條Task的PercentComplete(完成百分比)屬性,根據未開始、執行中和已完成幾個狀態來設置每一條Task背景色。開始時,我覺得Task會存在一個背景色Background屬性,可是並無,而是經過選擇一段Filed,而後針對該段Filed調用Font32Ex方法進行設置的。
在這個功能點上,仍是遇到了不少麻煩,走了不少彎路,好比剛開始的時候,並非採用Font32Ex方法來填充任務背景色的,而是用的TextStyle方法,這個方法的第一個參數是一個枚舉,在填充背景色功能點上,只有第一個枚舉生效了(其餘也有,可是沒有一個個嘗試,枚舉比較多),後來就採用錄製宏的方式來解決,如下是宏代碼:
1 Sub Macro1() 2 ' 宏 Macro1 3 ' Xuhbd 在 2016年12月12日 記錄的宏。 4 SelectRow Row:=0 5 OutlineIndent 6 Font32Ex CellColor:=62207 7 End Sub
在這段宏代碼中,明顯看到了Font32Ex這個方法,可是看了官方提供的文檔,其中有一個參數是CellColor,要求的對象是pjColor枚舉,運行後發現被填充的背景色都是黑色,不管選擇什麼顏色。
後來我就把pjColor直接用Color替換,竟然成功了。
代碼以下:
1 /// <summary> 2 /// 調用系統方法設置背景色 3 /// </summary> 4 /// <param name="bgColor"></param> 5 private void CallFont32Ex(Color bgColor) 6 { 7 object missing=Type.Missing; 8 Globals.ThisAddIn.Application.Font32Ex( 9 "微軟雅黑", 9, missing, missing, 10 missing, missing, missing, 11 bgColor, missing, missing); 12 }
經過完成這個Project的插件,學習了Project 模型,同時讓我更加方便地使用Project,提升了積極性,若是有新的需求能夠在這個基礎上進行擴展,這樣就造成了良性循環。在這個過程當中,參考了不少的微軟官方文檔(並且是英文的,看來英文學習很重要啊),最後,代碼已經託管到GitHub上,文中表述若是什麼問題,請你們留言,我會及時更正。
做者:悠揚的牧笛
博客地址:http://www.cnblogs.com/xhb-bky-blog/p/6155809.html
聲明:本博客原創文字只表明本人工做中在某一時間內總結的觀點或結論,與本人所在單位沒有直接利益關係。非商業,未受權貼子請以現狀保留,轉載時必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。