プロジェクトファイルからのカレンダー情報の読み取り
概要
Microsoft Projectでは、プロジェクトレベルの作業時間、タスク、およびリソースの可用性に対してさまざまなカレンダーを関連付けることができます。Aspose.Tasks for .NETは、主要なバージョン(2003-2013以降)を含むMPPファイルからのカレンダーデータの読み取りを完全にサポートしています。
この記事では、カレンダーコレクションの取得方法、詳細なカレンダー設定(作業週など)の読み取り、およびAspose.Tasks APIを使用して指定された日付間の実際の作業時間を計算する方法について説明します。
カレンダー情報の取得
Project
クラスは
Calendars
プロパティを公開し、
CalendarCollection
を返します。このコレクションは、プロジェクトファイルで定義されたすべてのカレンダーを保持します。
Microsoft Projectでカレンダーを確認するには:
- プロジェクトファイルを開きます。
- プロジェクト > 稼働時間の変更に移動します。
以下のコードは、プロジェクトカレンダーを反復処理し、そのメタデータを取得する方法を示しています。
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}
作業週設定の読み取り
Microsoft Projectのカレンダーでは、デフォルトの作業時間を上書きするカスタム作業週を定義できます。Aspose.Tasksは、
WorkWeek
クラスを通じてこれらを公開します。
作業週は、Calendar
オブジェクトのWorkWeeks
プロパティを介してアクセスできます。各WorkWeek
には、日付範囲と各日の作業時間に関するメタデータが含まれています。
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}
日付間の作業時間の計算
スケジューリングの実現可能性やリソースの可用性を評価するために、開発者は2つのDateTime
値間の総作業時間を計算する必要がある場合があります。Aspose.Tasksは、Calendar
クラスの2つのメソッドオーバーロードを通じてこれを可能にします:
注意: 日付範囲を指定する場合は、完全なタイムスタンプ(時、分、秒)を提供してください。
end
の日付が時刻なしで渡された場合(例:2025-08-18
)、00:00:00
として扱われ、間隔から除外されます。
以下の例では、2つの日付間の作業期間を分、時間、日で計算します。
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);