关于按分组列出任务及VSTO实现带完成占比的任务层级列表的问询
嗨Gilbert,针对你的两个问题,我来一步步给你解答:
一、按分组列出所有任务示例
假设你需要按「Group1(Text1维度)→ 子分组(Text2维度)」的层级来整理任务,这里给你一个具体的分组展示示例:
- Group1:项目启动(Text1)
- 子分组:需求调研(Text2)
- 任务1:完成核心用户需求访谈
- 任务2:输出需求规格说明书初稿
- 子分组:项目规划(Text2)
- 任务3:制定项目里程碑时间表
- 任务4:确认跨部门资源分配方案
- 子分组:需求调研(Text2)
- Group1:项目执行(Text1)
- 子分组:功能开发(Text2)
- 任务5:完成用户管理模块编码
- 任务6:完成订单模块单元测试
- 子分组:质量管控(Text2)
- 任务7:执行系统集成测试
- 任务8:修复测试阶段发现的优先级缺陷
- 子分组:功能开发(Text2)
你可以根据实际的Text1、Text2字段值,替换上面的分组名称和任务内容。
二、通过VSTO获取带层级结构与完成百分比的分组任务列表
完全可以实现!不管你是在Outlook任务还是Project中设置了分组,VSTO都能通过Office对象模型访问任务数据,提取层级结构和完成百分比。下面给你两种常见场景的实现代码:
场景1:Outlook任务分组
假设你的Group1对应Outlook任务的「类别」字段,Group2对应自定义字段「Text2」,代码示例如下:
using Outlook = Microsoft.Office.Interop.Outlook; public void FetchOutlookGroupedTasks() { // 初始化Outlook应用 Outlook.Application outlookApp = new Outlook.Application(); Outlook.Folder tasksFolder = outlookApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderTasks) as Outlook.Folder; // 按Group1(类别)排序,模拟分组逻辑 Outlook.Items sortedTasks = tasksFolder.Items; sortedTasks.Sort("[Categories]", Outlook.OlSortOrder.olAscending); string currentGroup1 = string.Empty; string currentGroup2 = string.Empty; foreach (Outlook.TaskItem task in sortedTasks) { // 提取分组标识(根据你的实际分组字段替换) string group1 = task.Categories ?? "未分组"; string group2 = task.UserProperties.Find("Text2")?.Value?.ToString() ?? "无子分组"; // 输出层级结构 if (group1 != currentGroup1) { currentGroup1 = group1; Console.WriteLine($"=== Group1: {group1} ==="); currentGroup2 = string.Empty; } if (group2 != currentGroup2) { currentGroup2 = group2; Console.WriteLine($" === 子分组(Text2): {group2} ==="); } // 获取任务完成百分比 double completionRate = task.PercentComplete; Console.WriteLine($" 任务名称: {task.Subject} | 完成百分比: {completionRate}%"); } }
场景2:Project任务分组
如果是在Microsoft Project中按Text1、Text2分组,代码会更直接,因为Project本身支持任务层级和自动计算完成率:
using Project = Microsoft.Office.Interop.MSProject; public void FetchProjectGroupedTasks() { Project.Application projectApp = new Project.Application(); Project.Project activeProject = projectApp.ActiveProject; foreach (Project.Task task in activeProject.Tasks) { if (task == null) continue; // 获取任务层级(OutlineLevel对应分组的嵌套层级) int indentLevel = task.OutlineLevel; string indent = new string(' ', (indentLevel - 1) * 2); // 提取Group1和Group2的字段值 string group1 = task.GetField(Project.PjField.pjTaskText1); string group2 = task.GetField(Project.PjField.pjTaskText2); // 完成百分比(摘要任务会自动汇总子任务完成率) double completionRate = task.PercentComplete; Console.WriteLine($"{indent}Group1: {group1} | Group2: {group2} | 任务: {task.Name} | 完成率: {completionRate}%"); } }
额外说明
- 如果需要自定义计算分组的完成百分比(比如汇总子任务的完成率),可以遍历子任务集合(Outlook的
TaskItem.ParentTask、Project的Task.OutlineChildren),自己编写逻辑计算。 - 代码中的分组字段可以根据你实际设置的Text1、Text2对应字段替换,确保和你的分组配置一致。
内容的提问来源于stack exchange,提问作者Gilbert
相关产品推荐
相关产品推荐

