프로젝트 파일에서 일정표 정보 읽기

개요

Microsoft Project는 프로젝트 수준의 근무 시간, 작업 및 리소스 가용성과 관련된 다양한 일정표를 연결할 수 있도록 지원합니다. Aspose.Tasks for .NET은 MPP 파일(2003–2013 및 이후 버전 포함)의 이러한 일정표 데이터를 완벽하게 읽을 수 있도록 지원합니다.

이 문서에서는 Aspose.Tasks API를 사용하여 일정표 컬렉션을 가져오고, 일정표 구성(예: 근무 주간)을 읽으며, 지정된 날짜 사이의 실제 근무 시간을 계산하는 방법을 설명합니다.

일정표 정보 가져오기

Project 클래스는 Calendars 속성을 통해 CalendarCollection을 반환합니다. 이 컬렉션은 프로젝트 파일에 정의된 모든 일정표를 포함합니다.

Microsoft Project에서 일정표를 확인하려면 다음 단계를 따르세요:

  1. 프로젝트 파일을 엽니다.
  2. 프로젝트 > 근무 시간 변경 메뉴로 이동합니다.

다음 코드는 프로젝트의 일정표를 반복(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);
Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.