Lectura de Información del Calendario desde Archivos de Proyecto
Resumen
Microsoft Project permite asociar varios calendarios con el tiempo de trabajo a nivel de proyecto, tareas y disponibilidad de recursos. Aspose.Tasks for .NET ofrece soporte completo para la lectura de estos datos de calendario desde archivos MPP, incluyendo todas las versiones principales (2003–2013 y posteriores).
Este artículo explica cómo recuperar colecciones de calendarios, leer configuraciones detalladas del calendario (por ejemplo, semanas laborales) y calcular las horas laborales reales entre fechas específicas utilizando la API de Aspose.Tasks.
Recuperación de Información del Calendario
La clase
Project
expone la propiedad
Calendars
, que devuelve una
CalendarCollection
. Esta colección contiene todos los calendarios definidos en el archivo de proyecto.
Para verificar los calendarios en Microsoft Project:
- Abre el archivo de proyecto.
- Navega a Proyecto > Cambiar horario laboral.
El siguiente código demuestra cómo iterar sobre los calendarios del proyecto y recuperar sus metadatos.
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}
Lectura de Configuraciones de Semanas Laborales
Los calendarios en Microsoft Project pueden definir semanas laborales personalizadas para sobrescribir los horarios de trabajo predeterminados. Aspose.Tasks expone estas semanas mediante la clase
WorkWeek
.
Las semanas laborales se pueden acceder a través de la propiedad WorkWeeks
del objeto Calendar
. Cada WorkWeek
contiene metadatos sobre el rango de fechas y los horarios laborales para cada día.
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}
Cálculo de Horas Laborales Entre Fechas
Para evaluar la viabilidad de la programación o la disponibilidad de recursos, los desarrolladores pueden necesitar calcular el número total de horas laborales entre dos valores DateTime
. Aspose.Tasks permite esto mediante dos sobrecargas del método en la clase Calendar
:
Nota: Al especificar rangos de fechas, proporciona marcas de tiempo completas (hora, minuto, segundo). Si la fecha
end
se pasa sin hora (por ejemplo,2025-08-18
), se trata como00:00:00
y se excluye del intervalo.
El siguiente ejemplo calcula las duraciones laborales en minutos, horas y días entre dos fechas.
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);