开源 .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 都提供了可靠、高性能的基础。

Previous Next

MPXJ.NET 入门指南

推荐的 MPXJ.NET 安装方式是通过 NuGet。请使用以下命令以顺利完成安装。

通过 NuGet 安装 MPXJ.NET

NuGet\Install-Package MPXJ.Net -Version 14.5.2

您可以直接从 GitHub 页面 下载。

通过 .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}");
    }
}
           
 中国人