واجهة برمجة تطبيقات إدارة مشاريع .NET مفتوحة المصدر للتعامل مع المشاريع في Redmine
مكتبة إدارة المشاريع الرائدة لـ C# .NET تسمح للمطورين بإنشاء، قراءة، تعديل وتحويل ملفات المشاريع إلى صيغ أخرى مثل MPP، MPT، XML، XER، PMXML، والعديد غيرها.
ما هو MPXJ.NET؟
إدارة بيانات المشروع غالبًا ما تعني التعامل مع مجموعة متعددة من صيغ الملفات من أدوات مثل Microsoft Project وPrimavera P6 وغيرها. إذا كنت مطور .NET وتبحث عن قراءة وكتابة وتعديل بيانات المشروع برمجيًا دون أن تكون مقيدًا بمنصة واحدة، فإن MPXJ.NET هي المكتبة المفتوحة المصدر القوية التي كنت تبحث عنها. تتضمن المكتبة عدة ميزات مهمة للعمل مع ملفات إدارة المشاريع، مثل إنشاء مشاريع جديدة، قراءة ملفات المشاريع الحالية، التحويل بين الصيغ، تعديل بيانات الجدول الزمني، العمل مع الموارد والتعيينات، برمجيًا.
MPXJ.NET هو غلاف .NET مفتوح المصدر حول مكتبة Java MPXJ (يديره جون إيلز). يتيح لمطوري .NET —C#، VB.NET، إلخ— قراءة وكتابة وتعديل ملفات جداول المشاريع باستخدام أنواع ومقاطع C# المألوفة. تدعم مكتبة MPXJ العديد من صيغ الجداول والمشاريع مثل MPP، MPX، MSPDI XML، XER، قواعد بيانات P6، Planner XML، إلخ. على الرغم من أن MPXJ أصلاً مبنية على Java، فإن MPXJ.Net يلتف حولها ويقدم اتفاقيات C# (خصائص بدلاً من getters/setters في Java؛ اتفاقيات تسمية .NET) بحيث تبدو طبيعية في كود .NET. سواءً كنت تجمع البيانات لمحفظة مؤسسية، أو تجري فحوصات جودة على الجداول، أو تبني جسرًا بين نظام إدارة علاقات العملاء (CRM) وأدوات مكتب إدارة المشاريع (PMO)، فإن MPXJ.Net يوفر الأساس الموثوق وعالي الأداء الذي تحتاجه.
البدء مع MPXJ.NET
الطريقة الموصى بها لتثبيت MPXJ.NET هي عبر NuGet. يرجى استخدام الأوامر التالية لتثبيت سلس.
تثبيت MPXJ.NET عبر NuGet
NuGet\Install-Package MPXJ.Net -Version 14.5.2
يمكنك تنزيله مباشرة من صفحة GitHub
إنشاء وتعديل المشاريع عبر .NET
يوفر مشروع MPXJ.NET مفتوح المصدر عدة ميزات مهمة لمعالجة ملفات المشاريع داخل تطبيقات .NET. بالإضافة إلى القراءة، يمكنك إنشاء ملفات مشاريع جديدة من الصفر: تعريف خصائص المشروع (العنوان، المؤلف، تاريخ البدء)، إضافة التقويمات والاستثناءات، إضافة المهام (مع المدد، تواريخ البدء، الحقول الرقمية)، إضافة الموارد والتعيينات، إنشاء الاعتمادات (المهمة A تسبق المهمة B)، ثم حفظها بتنسيق ملف (مثل MSPDI أو MPX) يمكن فتحه بواسطة MS Project أو أدوات أخرى. إليك مثال بسيط يوضح كيفية إنشاء مشروع جديد داخل تطبيقات .NET.
كيفية إنشاء مشروع جديد وكتابته بصيغة XML عبر مكتبة .NET؟
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 هي قدرتها على تحميل وقراءة عدد هائل من الصيغ باستخدام واجهة برمجة تطبيقات بسيطة ومتسقة. تشمل المكتبة دعمًا لاكتشاف تنسيق الملف تلقائيًا بناءً على امتداد الملف ومحتواه. تُعيد طريقة Read كائن ProjectFile، وهو الحاوية الجذرية لجميع كيانات المشروع الأخرى مثل المهام والموارد والتعيينات. يعمل هذا النمط البسيط بنفس الطريقة على ملف XER أو ملف XML أو أي تنسيق مدعوم آخر. يوضح المثال التالي كيفية تنفيذ ذلك بسهولة.
كيفية تحميل وقراءة ملف مشروع MPP عبر API .NET؟
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
يحتوي 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) بالكامل. تدعم المكتبة ميزات مختلفة للتعامل مع مهام المشروع والبيانات، مثل سرد جميع المهام في المشروع، عرض ملخص المهام، مدة المهام، بدء وانتهاء المهمة، نسبة الإنجاز (Percentage0Complete) للمهام، والعديد غير ذلك. يوضح المثال التالي كيف يمكن للمطورين التكرار عبر جميع المهام باستخدام أوامر .NET.
كيفية التنقل عبر جميع مهام المشروع عبر API C#؟
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}");
}
}