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:
- Öffnen Sie die Projektdatei.
- 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 als00: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);