开源 .NET 项目管理 API,用于在 Redmine 中处理项目
领先的 C# .NET 项目管理库允许开发人员创建、读取、操作并将项目文件转换为其他格式,如 MPP、MPT、XML、XER、PMXML 等。
MPXJ.NET 是什么?
管理项目数据通常意味着要应对来自 Microsoft Project、Primavera P6 等工具的众多文件格式。如果您是一名 .NET 开发者,想要以编程方式读取、写入和操作项目数据,而不受单一平台限制,MPXJ.NET 是您一直在寻找的强大开源库。该库已包含多个重要功能,用于处理项目管理文件,例如创建新项目、读取现有项目文件、在不同格式之间转换、操作进度数据、处理资源和分配等,均可通过编程实现。
MPXJ.NET 是一个开源的 .NET 包装器,基于 Java 库 MPXJ(由 Jon Iles 维护)。它允许 .NET 开发者——C#、VB.NET 等——使用符合 C# 习惯的类型和约定来读取、写入和操作项目进度文件。MPXJ 库支持多种进度和项目格式,如 MPP、MPX、MSPDI XML、XER、P6 数据库、Planner XML 等。虽然 MPXJ 最初是基于 Java 的,但 MPXJ.Net 对其进行封装,并呈现 C# 的约定(属性而非 Java 的 getter/setter;.NET 命名规范),使其在 .NET 代码中使用自然。无论您是为企业组合聚合数据、对进度进行质量检查,还是在 CRM 与 PMO 工具之间搭建桥梁,MPXJ.Net 都提供了可靠、高性能的基础。
MPXJ.NET 入门指南
推荐的 MPXJ.NET 安装方式是通过 NuGet。请使用以下命令以顺利完成安装。
通过 .NET 创建和操作项目
开源的 MPXJ.NET 为在 .NET 应用程序中处理项目文件提供了多个重要功能。除了读取之外,您还可以从头创建新的项目文件:定义项目属性(标题、作者、开始日期),添加日历和例外,添加任务(包括持续时间、开始日期、数值字段),添加资源和分配,创建依赖关系(任务 A 在任务 B 之前),然后保存为文件格式(例如 MSPDI 或 MPX),该文件可以被 MS Project 或其他工具打开。下面是一个简单示例,演示如何在 .NET 应用程序中创建新项目。
如何通过 .NET 库创建新项目并以 XML 格式写入?
using Net.Sf.Mpxj;
using Net.Sf.Mpxj.Write;
using System;
// Create a new, empty project file
ProjectFile project = new ProjectFile();
// Set basic project properties
project.Name = "My New MPXJ-Generated Project";
project.StartDate = DateTime.Now;
// Add tasks
Task task1 = project.AddTask();
task1.Name = "Task 1";
task1.Duration = project.GetDuration(8, TimeUnit.Hours); // 1 day
task1.Start = DateTime.Now;
Task task2 = project.AddTask();
task2.Name = "Task 2 (Child of Task 1)";
task2.Duration = project.GetDuration(16, TimeUnit.Hours); // 2 days
task2.Start = DateTime.Now.AddDays(1);
// Make task2 a child of task1 by setting the outline level
task2.OutlineLevel = 1;
// Create a writer for the desired output format
ProjectWriter writer = new MicrosoftProjectWriter();
try
{
// Write the project to an XML file (compatible with MS Project)
writer.Write(project, "C:\\Projects\\MyNewProject.xml");
Console.WriteLine("Project file written successfully!");
}
catch (Exception ex)
{
Console.WriteLine($"Failed to write file: {ex.Message}");
}
通过 C# 通用项目文件读取
MPXJ.NET 库的主要优势在于它能够通过简单且一致的 API 加载和读取大量格式。该库已包含基于文件扩展名和内容自动检测文件格式的支持。Read 方法返回一个 ProjectFile 对象,它是所有其他项目实体(如任务、资源和分配)的根容器。此简单模式对 XER 文件、XML 文件或任何其他受支持的格式都同样适用。下面的示例展示了如何轻松实现此操作。
如何通过 .NET API 加载并读取 MPP 项目文件?
using Net.Sf.Mpxj;
using Net.Sf.Mpxj.Read;
// Create a ProjectReader instance.
// The UniversalProjectReader intelligently determines the file type.
ProjectReader reader = new UniversalProjectReader();
try
{
// Read the project file. This one line of code is all you need.
ProjectFile project = reader.Read("C:\\Projects\\MySchedule.mpp");
// Now you have access to all project data!
Console.WriteLine($"Project Name: {project.Name}");
Console.WriteLine($"Start Date: {project.StartDate}");
}
catch (Exception ex)
{
Console.WriteLine($"Failed to read file: {ex.Message}");
}
通过 .NET API 转换项目文件
开源的 MPXJ.NET 完全支持在 .NET 应用程序中将项目文件转换为其他支持的文件格式。由于其多格式能力,MPXJ.NET 常用于在 .NET 应用程序中将项目文件从一种格式转换为另一种格式。例如:读取 .MPP 文件,然后写入 .MPX、.MSPDI 或甚至 XER/PMXML(取决于支持情况)。README 中提供了转换示例。
如何在 .NET 应用程序中读取并转换项目文件?
using System;
using MPXJ.Net;
namespace ConvertProject
{
class Program
{
static void Main(string[] args)
{
string input = "LegacyProject.mpp";
string output = "ConvertedProject.mpx";
// Read using universal reader
var proj = new UniversalProjectReader().Read(input);
// Write using universal writer to MPX format
new UniversalProjectWriter(FileFormat.MPX).Write(proj, output);
Console.WriteLine($"Converted {input} → {output}");
}
}
}
访问项目任务和层次结构
项目由任务组成,MPXJ.NET 允许您遍历整个工作分解结构(WBS)。该库支持多种处理项目任务和数据的功能,例如列出项目中的所有任务、查看任务摘要、任务持续时间、任务的开始和结束时间、任务的完成百分比等。下面的示例演示了开发者如何使用 .NET 命令遍历所有任务。
如何通过 C# API 遍历项目的所有任务?
using Net.Sf.Mpxj;
// ... (Assume 'project' is a loaded ProjectFile object)
Console.WriteLine("Tasks in the project:");
foreach (Task task in project.Tasks)
{
// Calculate the indentation for a hierarchical view
string indent = new string(' ', task.OutlineLevel * 2);
Console.WriteLine($"{indent}ID: {task.ID}, Name: {task.Name}, " +
$"Duration: {task.Duration}, " +
$"Start: {task.Start}, Finish: {task.Finish}");
// Access specific properties
if (task.PercentageComplete != null && task.PercentageComplete > 0)
{
Console.WriteLine($"{indent} -> % Complete: {task.PercentageComplete}");
}
}