Trabajar con calendarios
Crear un calendario
Los calendarios en Microsoft Project definen el tiempo laborable y no laborable, lo que impacta directamente en la programación de tareas y disponibilidad de recursos. En Aspose.Tasks para .NET, los calendarios pueden crearse utilizando la clase
Calendar, que ofrece tres sobrecargas de constructor:
Calendar()– Inicializa un calendario por defecto.Calendar(int id)– Inicializa un calendario con un ID específico.Calendar(string name)– Inicializa un calendario con un nombre determinado.
El siguiente ejemplo muestra cómo instanciar calendarios usando cada constructor. Una vez generados, los calendarios pueden visualizarse en Microsoft Project accediendo a Proyecto > Información del proyecto.
Información del proyecto mostrando los calendarios

1// Create a project instance
2Project project = new Project();
3
4// New calendar can be added to a project's calendar collection using the collection's Add method.
5Calendar cal1 = project.Calendars.Add("New Info");
6Calendar cal2 = project.Calendars.Add("no name");
7Calendar cal3 = project.Calendars.Add("cal3");
8
9project.Save("CreatingCalendar_out.Xml", SaveFileFormat.XML);Definir días laborables para un calendario
La colección
Days de la clase Calendar representa los días laborables y sus intervalos de tiempo asociados. Las definiciones de los días laborables se modelan mediante las clases
WeekDay y
WorkingTime.
Los desarrolladores pueden usar CreateDefaultWorkingDay() para establecer el horario estándar para un día específico, o definir intervalos personalizados con las propiedades FromTime y ToTime.
El siguiente ejemplo define de lunes a jueves como días laborables estándar y el viernes con un horario personalizado. Para verificar el resultado en Microsoft Project, vaya a Herramientas > Cambiar tiempo laborable.
Definir días laborables en Microsoft Project

1// This example shows how Aspose.Tasks API can be used to define a new Calendar, add week days to it and define working times for days
2// Create a project instance
3Project project = new Project();
4
5// Define Calendar
6Calendar cal = project.Calendars.Add("Calendar1");
7
8// Add working days monday through thursday with default timings
9cal.WeekDays.Add(WeekDay.CreateDefaultWorkingDay(DayType.Monday));
10cal.WeekDays.Add(WeekDay.CreateDefaultWorkingDay(DayType.Tuesday));
11cal.WeekDays.Add(WeekDay.CreateDefaultWorkingDay(DayType.Wednesday));
12cal.WeekDays.Add(WeekDay.CreateDefaultWorkingDay(DayType.Thursday));
13cal.WeekDays.Add(new WeekDay(DayType.Saturday));
14cal.WeekDays.Add(new WeekDay(DayType.Sunday));
15
16// Set friday as short working day
17WeekDay myWeekDay = new WeekDay(DayType.Friday);
18
19// Sets working time. Only time part of DateTime is important
20WorkingTime wt1 = new WorkingTime();
21wt1.FromTime = new DateTime(1, 1, 1, 9, 0, 0, 0);
22wt1.ToTime = new DateTime(1, 1, 1, 12, 0, 0, 0);
23WorkingTime wt2 = new WorkingTime();
24wt2.FromTime = new DateTime(1, 1, 1, 13, 0, 0, 0);
25wt2.ToTime = new DateTime(1, 1, 1, 16, 0, 0, 0);
26myWeekDay.WorkingTimes.Add(wt1);
27myWeekDay.WorkingTimes.Add(wt2);
28myWeekDay.DayWorking = true;
29cal.WeekDays.Add(myWeekDay);
30
31project.Save("Project_DefineCalendarWeekdays_out.xml", SaveFileFormat.XML);Reemplazar un calendario
Los calendarios base sirven como plantillas para la planificación de tareas y recursos. Aspose.Tasks permite reemplazar un calendario existente accediendo a
CalendarCollection a través del objeto
Project.
Los tipos de calendario base compatibles incluyen:
- Estándar: lunes a viernes, de 08:00 a 17:00.
- 24 horas: utilizado para horarios de trabajo continuos.
- Turno nocturno: de lunes por la noche a sábado por la mañana, de 23:00 a 08:00.
El siguiente ejemplo muestra cómo eliminar un calendario existente y agregar uno nuevo estándar a la colección.
1// Create project
2Project project = new Project("New Project.mpp");
3
4// Access project calendars
5CalendarCollection calColl = project.Calendars;
6foreach (Calendar myCalendar in calColl)
7{
8 if (myCalendar.Name == "TestCalendar")
9 {
10 // Remove calendar
11 calColl.Remove(myCalendar);
12 }
13}
14
15// Add new calendar
16Calendar newCalendar = calColl.Add("TestCalendar");
17project.Save("ReplaceCalendar_out.mpp", SaveFileFormat.MPP);Crear un calendario estándar
Un calendario estándar define los días y horas laborales por defecto comúnmente utilizados en cronogramas de proyectos. Aspose.Tasks proporciona dos métodos estáticos para facilitar esto:
MakeStandardCalendar()– Crea un nuevo calendario con configuración estándar.MakeStandardCalendar(Calendar cal)– Convierte un calendario existente a estándar.
Para ver el resultado en Microsoft Project, utilice Herramientas > Cambiar tiempo laborable.
El cuadro de diálogo Cambiar tiempos laborables muestra el calendario estándar utilizado por el proyecto

1// Create a project instance
2Project project = new Project();
3
4// Define Calendar and make it standard
5Calendar cal1 = project.Calendars.Add("My Cal");
6Calendar.MakeStandardCalendar(cal1);
7
8project.Save("Project_MakeStandardCalendar_out.xml", SaveFileFormat.XML);Guardar los datos de calendario actualizados en MPP
Aspose.Tasks permite actualizar las definiciones de calendario y guardarlas nuevamente en un archivo MPP. El proceso implica:
- Cargar el archivo MPP existente.
- Modificar la colección de calendarios (agregar, actualizar).
- Guardar el proyecto actualizado en disco.
El siguiente ejemplo demuestra cómo agregar un nuevo calendario y escribirlo de nuevo en el archivo MPP original.
1Project project = new Project("New Project.mpp");
2Calendar cal = project.Calendars.GetByUid(3);
3
4// Update the calendar information
5Calendar.MakeStandardCalendar(cal);
6cal.Name = "Test calendar";
7CalendarException exc = new CalendarException();
8exc.FromDate = DateTime.Now;
9exc.ToDate = DateTime.Now.AddDays(2);
10exc.DayWorking = true;
11
12WorkingTime wt1 = new WorkingTime();
13wt1.FromTime = new DateTime(10, 1, 1, 9, 0, 0);
14wt1.ToTime = new DateTime(10, 1, 1, 13, 0, 0);
15
16WorkingTime wt2 = new WorkingTime();
17wt2.FromTime = new DateTime(10, 1, 1, 14, 0, 0);
18wt2.ToTime = new DateTime(10, 1, 1, 19, 0, 0);
19
20WorkingTime wt3 = new WorkingTime();
21wt3.FromTime = new DateTime(10, 1, 1, 20, 0, 0);
22wt3.ToTime = new DateTime(10, 1, 1, 21, 0, 0);
23
24exc.WorkingTimes.Add(wt1);
25exc.WorkingTimes.Add(wt2);
26exc.WorkingTimes.Add(wt3);
27cal.Exceptions.Add(exc);
28
29CalendarException exc2 = new CalendarException();
30exc2.FromDate = DateTime.Now.AddDays(7);
31exc2.ToDate = exc2.FromDate;
32exc2.DayWorking = false;
33cal.Exceptions.Add(exc2);
34
35project.Set(Prj.Calendar, cal);
36
37project.Save("WriteUpdatedCalendarDataToMPP_out.mpp", SaveFileFormat.MPP);