开发背景

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

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

Project Object 模型

之前做过Word的插件开发,里面的各个组件(Range,Paragraph,Selection)等都是有规律可循的,大多数对象都有自己的集合,而且多个对象之间的关联比较密切,但是Project的模型让我很费解,比如里面的单元格Cell,居然不存在集合的概念(见微软官方文档),这里面比较重要的模型有以下几个:Application、Task、Cell、Resource等,当然,还有其他的比较重要的模型,只是不是很常用,在此不做说明。

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.

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的常用属性,比如任务名称、工期、起止时间、资源以及完成百分比。以下是添新任务的代码段:

  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还有很多其他的属性,在此也不一一列举。

更清晰地展现任务进度

先看下整体的效果图:

在使用插件处理前基本是这样的

在使用插件处理后是这样的,预设好的背景色、字体、状态等。

这样一键处理后,看起来舒服多了,每项任务都有三个状态,即【准备】、【执行】、【完成】。【准备】对应背景色为红色,【执行】对应背景色为黄色,【完成】对应背景色为绿色,这样就会对项目任务进度的大概完成程度有一个直观的把握。相对于格式刷子来说还是很方便的。

下面是部分代码:

  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, , );
  9. if (task.PercentComplete == )
  10. {
  11. CallFont32Ex(CommonData.MappingColorState(CommonData.TaskState.Ready));
  12. }
  13. else if (task.PercentComplete == )
  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 20161212 记录的宏。
  4. SelectRow Row:=
  5. OutlineIndent
  6. Font32Ex CellColor:=
  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. "微软雅黑", , 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

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

【原创】记一次Project插件开发的更多相关文章

  1. 记一次Project插件开发

    一.开发背景 最近在使用微软的Office Project 2010 进行项目管理,看到排的满满的计划任务,一个个地被执行完毕,还是很有成就感的.其实,不光是在工作中可以使用Project进行项目进度 ...

  2. [原创]记一次java执行段错误及解决过程

    最近一周左右,网管监控系统经常监控到tomcat异常退出,由于有检测tomcat pid的脚本,所以会自动重启服务器,查询tomcat日志没有报错信息,查询系统message日志,可以看到如下信息. ...

  3. Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率..

    Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率.. 1. hybrid App 1 1.1. Hybrid Ap ...

  4. @RISK

    Price: AUD $3,295.00   Price: AUD $2,495.00   适用于项目管理的 @RISK 免费试用版下载 » 立即购买 » 价格对比 » 许可选项 (英文) » 教学计 ...

  5. .net core 连接mysql

    Package引入: mysql.data MySql.Data.EntityFrameworkCore Pomelo.EntityFrameworkCore.MySql 2. 在package ma ...

  6. 记一个mvn奇怪错误: Archive for required library: 'D:/mvn/repos/junit/junit/3.8.1/junit-3.8.1.jar' in project 'xxx' cannot be read or is not a valid ZIP file

    我的maven 项目有一个红色感叹号, 而且Problems 存在 errors : Description Resource Path Location Type Archive for requi ...

  7. [非原创]Project facet Java version 1.8 is not supported解决记录

    原博地址:http://blog.csdn.net/dingchenxixi/article/details/51496998 一看知道是因为jdk版本不一致所导致,如何解决? 方法一: 选中项目 P ...

  8. eclipse弃坑记第一篇之在idea上配置Tomcat环境并创建Javaweb项目的详细步骤原创

    IntelliJ IDEA是一款功能强大的开发工具,在代码自动提示.重构.J2EE支持.各类版本工具(如git.svn.github).maven等方面都有很好的应用. IntelliJ IDEA有免 ...

  9. MySQL用source命令导入不记入binlog中【原创】

    试验环境,MySQL主主复制 主库10.72.16.112 从库10.72.16.50 一直有个疑问,利用sql_log_bin=0可以临时在客户端停止将操作记入binlog中,如果使用source命 ...

随机推荐

  1. 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念

    一.前言     DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...

  2. [原创]mybatis中整合ehcache缓存框架的使用

    mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...

  3. 如何创建Vim Dotfile?

    Dotfile是电脑系统里的隐藏文件,它是专门给更高级的用户,如开发者.程序员或工程师使用的,让他们用来调整系统.如何创建Vim-Dotfile? 可以参考以下步骤: 1. 首先,你要检查一下.vim ...

  4. 【详细教程】论android studio中如何申请百度地图新版Key中SHA1值

    一.写在前面 现在越来越多的API接口要求都要求提供我们的项目SHA1值,开发版目前还要求不高,但是发布版是必定要求的.而目前定位在各大APP中也较为常见,当下主流的百度地图和高德地图都在申请的时候会 ...

  5. java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis

    A 调用摄像头拍照,自定义裁剪编辑头像 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单;  技术:313596790freemaker模版技术 ,0个代码不用写 ...

  6. 深入理解javascript函数定义与函数作用域

    最近在学习javascript的函数,函数是javascript的一等对象,想要学好javascript,就必须深刻理解函数.本人把思路整理成文章,一是为了加深自己函数的理解,二是给读者提供学习的途径 ...

  7. git如何切换远程仓库

    场景 工作时可能由于git仓库的变动,需要我们将已有代码切换仓库.比如我们先用的gitlab,现在要切换到github上. 迁移命令 代码迁移其实也很简单. 先保证本地代码是最新代码 $ git pu ...

  8. 《MySQL必知必会》学习笔记

    数据库:数据库是一种以某种有组织的方式存储的数据集合.其本质就是一个容器,通常是一个或者一组文件. 表:表示一种结构化的文件,可用来存储某种特定类型的数据. 模式:描述数据库中特定的表以及整个数据库和 ...

  9. Oracle中的commit详解

    本文转自 : http://blog.csdn.net/hzhsan/article/details/9719307 它执行的时候,你不会有什么感觉.commit在数据库编程的时候很常用,当你执行DM ...

  10. Git时间(第一次写,这个怎么玩啊)

    1.安装 Liunx直接打开shell界面,输入:sudo apt-get install git-core ,按下回车之后输入密码即可完成安装: Windows系统在https://git-for- ...