private static void CompletePeriodTunnel([NotNull] GanttSourceBuilder source) { void Loop(TicketBuilder ticket, IDateRange range) { if (ticket.EstimatedPeriod.Start == default) { ticket.EstimatedPeriod.Start = range.Start; } if (ticket.EstimatedPeriod.End == default) { ticket.EstimatedPeriod.End = range.End; } foreach (var child in ticket.Children) { Loop(child, ticket.EstimatedPeriod); } } foreach (var project in source.Projects) { var range = new DateRangeBuilder { Start = project.Tickets.Select(x => x.EstimatedPeriod).Minimum(), End = project.Tickets.Select(x => x.EstimatedPeriod).Maximum(), }; foreach (var ticket in project.Tickets) { Loop(ticket, range); } } }
/// <summary> /// 指定したテンプレートをもとにガント チャートを構築します。 /// </summary> /// <param name="source">ガント チャートの構築に使用するデータ。</param> /// <param name="template">ガント チャートのテンプレート。</param> /// <param name="destination">構築したガント チャートの出力先。</param> /// <exception cref="ArgumentNullException"><paramref name="source"/> または <paramref name="template"/> または <paramref name="destination"/> が <c>null</c> です。</exception> public static void BuildGanttChart([NotNull] this IGanttSource source, [NotNull] string template, [NotNull] string destination) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (template == null) { throw new ArgumentNullException(nameof(template)); } if (destination == null) { throw new ArgumentNullException(nameof(destination)); } XSSFWorkbook workbook; using (var stream = File.OpenRead(template)) { workbook = new XSSFWorkbook(stream); } var worksheet = workbook.GetSheet("ガントチャート"); var dateRange = new DateRangeBuilder { Start = source.Projects.SelectMany(x => x.Tickets).SelectMany(x => new[] { x.EstimatedPeriod, x.ActualPeriod }).Minimum(), End = source.Projects.SelectMany(x => x.Tickets).SelectMany(x => new[] { x.EstimatedPeriod, x.ActualPeriod }).Maximum(), }; // metadata worksheet.GetRow(0).GetCell(0).SetCellValue(DateTime.Now); // calendar BuildCalendar(source, worksheet, dateRange); // projects BuildProjects(source, worksheet, dateRange); using (var stream = File.OpenWrite(destination)) { workbook.Write(stream); } }
/// <summary> /// トップ ダウン戦略で、<see cref="IGanttSource"/> のサブプロパティに可能な限り値を設定します。 /// </summary> /// <param name="source">値を設定する対象の <see cref="GanttSourceBuilder"/>。</param> /// <exception cref="ArgumentNullException"><paramref name="source"/> が <c>null</c> です。</exception> public static void CompleteTunnel([NotNull] GanttSourceBuilder source) { if (source == null) { throw new ArgumentNullException(nameof(source)); } foreach (var project in source.Projects) { var range = new DateRangeBuilder { Start = project.Tickets.Select(x => x.EstimatedPeriod).Minimum(), End = project.Tickets.Select(x => x.EstimatedPeriod).Maximum(), }; foreach (var ticket in project.Tickets) { CompleteTunnel(ticket, range); } } }