프로젝트 파일에서 일정표 정보 읽기
개요
Microsoft Project는 프로젝트 수준의 근무 시간, 작업 및 리소스 가용성과 관련된 다양한 일정표를 연결할 수 있도록 지원합니다. Aspose.Tasks for .NET은 MPP 파일(2003–2013 및 이후 버전 포함)의 이러한 일정표 데이터를 완벽하게 읽을 수 있도록 지원합니다.
이 문서에서는 Aspose.Tasks API를 사용하여 일정표 컬렉션을 가져오고, 일정표 구성(예: 근무 주간)을 읽으며, 지정된 날짜 사이의 실제 근무 시간을 계산하는 방법을 설명합니다.
일정표 정보 가져오기
Project
클래스는
Calendars
속성을 통해
CalendarCollection
을 반환합니다. 이 컬렉션은 프로젝트 파일에 정의된 모든 일정표를 포함합니다.
Microsoft Project에서 일정표를 확인하려면 다음 단계를 따르세요:
- 프로젝트 파일을 엽니다.
- 프로젝트 > 근무 시간 변경 메뉴로 이동합니다.
다음 코드는 프로젝트의 일정표를 반복(iterate)하면서 메타데이터를 가져오는 방법을 보여줍니다.
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의 일정표는 기본 근무 시간을 재정의하기 위해 사용자 정의 근무 주간(Work Week) 을 정의할 수 있습니다. Aspose.Tasks는 이를
WorkWeek
클래스를 통해 제공합니다.
WorkWeeks
속성을 통해 Calendar
객체에서 근무 주간 정보를 접근할 수 있습니다. 각 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}
날짜 간 근무 시간 계산하기
일정 가능성 또는 리소스 가용성을 평가하려면, 두 개의 DateTime
값 사이의 총 근무 시간을 계산해야 할 수 있습니다. Aspose.Tasks는 Calendar
클래스의 두 가지 메서드 오버로드를 통해 이를 지원합니다:
참고: 날짜 범위를 지정할 때는 시각 정보(시, 분, 초)를 포함한 전체 타임스탬프를 제공해야 합니다. 예를 들어 종료 날짜를
2025-08-18
처럼 시간 없이 지정하면00:00:00
으로 간주되어 간격에서 제외됩니다.
다음 예제는 두 날짜 사이의 근무 시간을 분, 시간, 일 단위로 계산합니다.
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);