Lecture des informations de calendrier à partir des fichiers de projet

Vue d’ensemble

Microsoft Project permet d’associer divers calendriers au temps de travail du projet, aux tâches et à la disponibilité des ressources. Aspose.Tasks for .NET offre une prise en charge complète de la lecture de ces données de calendrier à partir des fichiers MPP, y compris toutes les versions principales (2003–2013 et ultérieures).

Cet article explique comment récupérer les collections de calendriers, lire la configuration détaillée des calendriers (par exemple, les semaines de travail) et calculer les heures de travail réelles entre des dates spécifiées à l’aide de l’API Aspose.Tasks.

Récupération des informations de calendrier

La classe Project expose la propriété Calendars, qui retourne une CalendarCollection. Cette collection contient tous les calendriers définis dans le fichier de projet.

Pour vérifier les calendriers dans Microsoft Project :

  1. Ouvrez le fichier de projet.
  2. Accédez à Projet > Modifier les horaires de travail.

Le code suivant montre comment parcourir les calendriers d’un projet et récupérer leurs métadonnées.

 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}

Lecture des configurations de semaines de travail

Les calendriers dans Microsoft Project peuvent définir des semaines de travail personnalisées pour remplacer les horaires de travail par défaut. Aspose.Tasks expose ces informations via la classe WorkWeek.

Les semaines de travail peuvent être accessibles via la propriété WorkWeeks de l’objet Calendar. Chaque WorkWeek contient des métadonnées sur l’intervalle de dates et les heures de travail pour chaque jour.

 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}

Calcul des heures de travail entre deux dates

Pour évaluer la faisabilité d’un planning ou la disponibilité des ressources, les développeurs peuvent avoir besoin de calculer le nombre total d’heures de travail entre deux valeurs DateTime. Aspose.Tasks permet cela via deux surcharges de méthode de la classe Calendar :

Remarque : Lors de la spécification d’intervalle de dates, indiquez les horodatages complets (heure, minute, seconde). Si la date de fin est fournie sans heure (ex. 2025-08-18), elle est considérée comme 00:00:00 et exclue de l’intervalle.

L’exemple suivant calcule les durées de travail en minutes, heures et jours entre deux dates.

 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.