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 :
- Ouvrez le fichier de projet.
- 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 comme00: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);