Kalenderinformationen aus Projektdateien lesen

Überblick

Microsoft Project ermöglicht die Zuordnung verschiedener Kalender zu projektbezogenen Arbeitszeiten, Aufgaben und Ressourcenverfügbarkeit. Aspose.Tasks for .NET bietet vollständige Unterstützung für das Auslesen dieser Kalenderdaten aus MPP-Dateien, einschließlich aller Hauptversionen (2003–2013 und neuer).

Dieser Artikel erklärt, wie man Kalenderlisten abruft, detaillierte Kalendereinstellungen (z. B. Arbeitswochen) ausliest und tatsächliche Arbeitszeiten zwischen bestimmten Datumsbereichen berechnet – mithilfe der Aspose.Tasks API.

Abrufen von Kalenderinformationen

Die Klasse Project stellt die Eigenschaft Calendars bereit, die eine CalendarCollection zurückgibt. Diese Sammlung enthält alle im Projekt definierten Kalender.

So überprüfen Sie Kalender in Microsoft Project:

  1. Öffnen Sie die Projektdatei.
  2. Navigieren Sie zu Projekt > Arbeitszeit ändern.

Der folgende Beispielcode zeigt, wie Sie über Projektkalender iterieren und deren Metadaten abrufen können.

 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}

Auslesen von Arbeitswochenkonfigurationen

Kalender in Microsoft Project können benutzerdefinierte Arbeitswochen definieren, die Standardarbeitszeiten überschreiben. Aspose.Tasks stellt dafür die Klasse WorkWeek bereit.

Auf Arbeitswochen kann über die Eigenschaft WorkWeeks des Calendar-Objekts zugegriffen werden. Jede WorkWeek enthält Metadaten zum Datumsbereich und zu den Arbeitszeiten pro Wochentag.

 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}

Berechnung von Arbeitsstunden zwischen zwei Daten

Zur Bewertung der Planung oder Verfügbarkeit von Ressourcen kann es notwendig sein, die Gesamtanzahl an Arbeitsstunden zwischen zwei DateTime-Werten zu berechnen. Aspose.Tasks ermöglicht dies über zwei Überladungen der Methode GetWorkingHours der Klasse Calendar:

Hinweis: Bei Datumsbereichen sollten vollständige Zeitstempel (Stunde, Minute, Sekunde) angegeben werden. Wird das end-Datum ohne Uhrzeit übergeben (z. B. 2025-08-18), wird es als 00:00:00 interpretiert und vom Intervall ausgeschlossen.

Das folgende Beispiel berechnet die Arbeitsdauer in Minuten, Stunden und Tagen zwischen zwei Zeitpunkten.

 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.