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:

  1. Abre el archivo de proyecto.
  2. 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 como 00: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);
Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.