【原创】记一次Project插件开发

开发背景

最近在使用微软的Office Project 2010 进行项目管理,看到排的满满的计划任务,一个个地被执行完毕,仍是颇有成就感的。其实,不光是在工做中可使用Project进行项目进度控制,一样能够把这款软件应用在平常的生活中,好比为阅读某本书排一个计划,而任务单元就是本书的目录,固然粒度能够本身定制;也能够为健身排一个计划,每周去几回健身房、每次作多少个动做、作什么类型的动做,均可以提早排程,每完成一项就就在任务进度上狠狠地输入100%,那是多么爽的事啊。html

可是,经过一段时间的使用,我发现本身有一个个性化的需求,就是习惯为各类状态的任务加上不一样的背景色,这样就会很清晰直观地掌握任务的整体完成状况;还有就是很不喜欢Project自带的建立任务的方式,但愿能够以本身的方式来建立任务,好比任务的资源通常是我本身的名字(大多数状况),因此我但愿建立任务的时候,默认带出资源名称,再好比我喜欢用微软雅黑做为默认字体,可是每次都是设置好单个单元格后,再用格式刷去刷,非常麻烦,再好比表示任务状态的背景色,也是本身一点点用格式刷去刷的,若是不经常使用这个工具还好,可是老是这样不免让人反感,因此就产生了这个想法。以上就是我本身的个性化需求,若是后续有其余想法,还能够本身扩展,把懒人的风格发扬到底。在园子里也找了一些相关资料,可是和个人出发点都不是很吻合,因此废话很少说,本身动手,丰衣足食。git

Project Object 模型

以前作过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上,文中表述若是什么问题,请你们留言,我会及时更正。

Porject Addin Download

 

做者:悠扬的牧笛

博客地址:http://www.cnblogs.com/xhb-bky-blog/p/6155809.html

声明:本博客原创文字只表明本人工做中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未受权贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文链接。

相关文章
相关标签/搜索