Читання інформації календаря з файлів проекту

Огляд

Microsoft Project дозволяє пов’язувати різні календарі з робочим часом на рівні проекту, завданнями та доступністю ресурсів. Aspose.Tasks для .NET забезпечує повну підтримку читання цих даних календаря з файлів MPP, включаючи всі основні версії (2003–2013 та пізніші).

Ця стаття пояснює, як отримувати колекції календарів, читати детальну конфігурацію календаря (наприклад, робочі тижні) та обчислювати фактичні робочі години між зазначеними датами за допомогою API Aspose.Tasks.

Отримання інформації календаря

Клас Project надає властивість Calendars, яка повертає CalendarCollection. Ця колекція містить всі календарі, визначені у файлі проекту.

Щоб перевірити календарі в Microsoft Project:

  1. Відкрийте файл проекту.
  2. Перейдіть до Проект > Змінити робочий час.

Наступний код демонструє, як ітерувати календарі проекту та отримувати їх метадані.

 1// Create a project instance
 2Project project = new Project("RetrieveCalendarInfo.mpp");
 3
 4// Retrieve Calendars Information
 5CalendarCollection calendars = project.Calendars;
 6foreach (Calendar cal in calendars)
 7{
 8    if (cal.Name != null)
 9    {
10        Console.WriteLine("Calendar UID : " + cal.Uid);
11        Console.WriteLine("Calendar Name : " + cal.Name);
12
13        WeekDayCollection alDays = cal.WeekDays;
14        foreach (WeekDay wd in alDays)
15        {
16            TimeSpan ts = wd.GetWorkingTime();
17            if (wd.DayWorking)
18            {
19                Console.WriteLine(wd.DayType.ToString() + ":");
20                Console.WriteLine(ts.ToString());
21            }
22        }
23    }
24}

Читання конфігурацій робочих тижнів

Календарі в Microsoft Project можуть визначати користувацькі робочі тижні для перевизначення стандартного робочого часу. Aspose.Tasks надає доступ до них через клас WorkWeek.

Робочі тижні можна отримати через властивість WorkWeeks об’єкта Calendar. Кожен WorkWeek містить метадані про діапазон дат та робочий час для кожного дня.

 1Project project = new Project("ReadWorkWeeksInformation.mpp");
 2Calendar calendar = project.Calendars.GetByUid(3);
 3WorkWeekCollection collection = calendar.WorkWeeks;
 4
 5foreach (WorkWeek workWeek in collection)
 6{
 7    DateTime fromDate = workWeek.FromDate;
 8    DateTime toDate = workWeek.ToDate;
 9
10    // This data is all about "Details." button you can set special working times for special WeekDay or even make it nonworking
11    WeekDayCollection weekDays = workWeek.WeekDays;  
12    foreach (WeekDay day in weekDays) 
13    {
14        // You can further traverse through working times and display these
15        WorkingTimeCollection workingTimes = day.WorkingTimes;
16    }
17}

Обчислення робочих годин між датами

Для оцінки можливості планування або доступності ресурсів розробникам може знадобитися обчислити загальну кількість робочих годин між двома значеннями DateTime. Aspose.Tasks забезпечує це через два перевантаження методів класу Calendar:

Примітка: При вказівці діапазонів дат надавайте повні позначки часу (година, хвилина, секунда). Якщо дата end передається без часу (наприклад, 2025-08-18), вона розглядається як 00:00:00 і виключається з інтервалу.

Наступний приклад обчислює тривалість роботи в хвилинах, годинах та днях між двома датами.

 1// Load an existing project
 2Project project = new Project("New Project.mpp");
 3
 4// Access Task By Id
 5Task task = project.RootTask.Children.GetById(1);
 6
 7// Access Calendar and it's start and end dates
 8Calendar taskCalendar = task.Get(Tsk.Calendar);
 9DateTime startDate = task.Get(Tsk.Start);
10DateTime endDate = task.Get(Tsk.Finish);
11DateTime tempDate = startDate;
12
13// Access resource and their calendar
14Resource resource = project.Resources.GetByUid(1);
15Calendar resourceCalendar = resource.Get(Rsc.Calendar);
16
17TimeSpan timeSpan;
18
19// Get Duration in Minutes
20double durationInMins = 0;
21while (tempDate < endDate)
22{
23    if (taskCalendar.IsDayWorking(tempDate) && resourceCalendar.IsDayWorking(tempDate))
24    {
25        timeSpan = taskCalendar.GetWorkingHours(tempDate);
26        durationInMins = durationInMins + timeSpan.TotalMinutes;
27    }
28    tempDate = tempDate.AddDays(1);
29}
30tempDate = startDate;
31
32// Get Duration in Hours
33double durationInHours = 0;
34while (tempDate < endDate)
35{
36    if (taskCalendar.IsDayWorking(tempDate) && resourceCalendar.IsDayWorking(tempDate))
37    {
38        timeSpan = taskCalendar.GetWorkingHours(tempDate);
39        durationInHours = durationInHours + timeSpan.TotalHours;
40    }
41    tempDate = tempDate.AddDays(1);
42}
43tempDate = startDate;
44
45// Get Duration in Days
46double durationInDays = 0;
47while (tempDate < endDate)
48{
49    if (taskCalendar.IsDayWorking(tempDate) && resourceCalendar.IsDayWorking(tempDate))
50    {
51        timeSpan = taskCalendar.GetWorkingHours(tempDate);
52        if (timeSpan.TotalHours > 0)
53        {
54            durationInDays = durationInDays + timeSpan.TotalDays * (24 / (timeSpan.TotalHours));
55        }
56    }
57    tempDate = tempDate.AddDays(1);
58}
59
60Console.WriteLine("Duration in Minutes = " + durationInMins);
61Console.WriteLine("Duration in Hours = " + durationInHours);
62Console.WriteLine("Duration in Days = " + durationInDays);
Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.