Экспорт C# родительского дочернего списка с помощью epplus с раскрытием свертывания - PullRequest
0 голосов
/ 06 мая 2020

Мне нужно экспортировать родительскую дочернюю модель c# с возможностью разворачивания. У меня есть следующие c# Модели

     public class Stage
     {
        public int Id { get; set; }
        public string Title { get; set; }
        public string Sequence { get; set; }
        public List<Line> Lines { get; set; }
      }

      public class Line
      {
        public int Id { get; set; }                  
        public string Sequence { get; set; }
        public string Title { get; set; }
        public int? ParentId { get; set; }
        public bool HasChildren { get;  set; }
      }

следующие данные, извлеченные из базы данных

    var data = new List<Stage>
    {
        new Stage { Id = 1, Sequence = "1", Title = "Stage #1",
            Lines = new List<Line> {
                new Line { Id = 1,  Sequence = "1.1", Title = "Line1", HasChildren = false, ParentId = null },
                new Line { Id = 2,  Sequence = "1.2", Title = "Line2", HasChildren = false, ParentId = null },
                new Line { Id = 3,  Sequence = "1.3", Title = "Line3", HasChildren = false, ParentId = null },
                new Line { Id = 4,  Sequence = "1.4", Title = "Group4", HasChildren = true, ParentId = null },
                new Line { Id = 8,  Sequence = "1.4.1", Title = "Line8", HasChildren = false, ParentId = 4 },
                new Line { Id = 12,  Sequence = "1.4.2", Title = "Line12", HasChildren = false, ParentId = 4 },
                new Line { Id = 13,  Sequence = "1.4.3", Title = "Line13", HasChildren = false, ParentId = 4 },
                new Line { Id = 5,  Sequence = "1.5", Title = "Group5", HasChildren = true, ParentId = null },
                new Line { Id = 9,  Sequence = "1.5.1", Title = "Line9", HasChildren = false, ParentId = 5 },
                new Line { Id = 11,  Sequence = "1.5.2", Title = "Line11", HasChildren = false, ParentId = 5 },
                new Line { Id = 6,  Sequence = "1.6", Title = "Line6", HasChildren = false, ParentId = null },
                new Line { Id = 7,  Sequence = "1.7", Title = "Line7", HasChildren = false, ParentId = null },
                new Line { Id = 10,  Sequence = "1.8", Title = "Line10", HasChildren = false, ParentId = null }
                }
        },

        new Stage { Id = 1, Sequence = "2", Title = "Stage #2" ,
             Lines = new List<Line> {
                new Line { Id = 14,  Sequence = "2.1", Title = "Group14", HasChildren = true, ParentId = null },
                new Line { Id = 15,  Sequence = "2.1.1", Title = "Group15", HasChildren = true, ParentId = 14 },
                new Line { Id = 16,  Sequence = "2.1.1.1", Title = "Group16", HasChildren = true, ParentId = 15 },
                new Line { Id = 17,  Sequence = "2.1.1.1.1", Title = "Line17", HasChildren = false, ParentId = 16 },
                new Line { Id = 18,  Sequence = "2.2", Title = "Group18", HasChildren = true, ParentId = null },
                new Line { Id = 19,  Sequence = "2.2.1", Title = "Line19", HasChildren = false, ParentId = 18 }
             }
        }
    };

в веб-приложении мне удалось создать представление в виде дерева (развернуть / свернуть), которое выглядит следующим образом

[1] Stage #1
     1.1
     1.2
     1.3
   + 1.4
       1.4.1
       1.4.2
       1.4.3
   + 1.5
       1.5.1
       1.5.2
     1.6
     1.7
     1.8
[2] Stage #2
   + 2.1
     + 2.1.1
       + 2.1.1.1
           2.1.1.1.1
   + 2.2
       2.2.1

Затем мне нужно экспортировать эту модель в формат Excel с помощью библиотеки epplus с возможностью расширяться и сворачиваться. это лучшее, что я пробовал.

  private static void ExportToExcel(List<Stage> stages)
        {
            //Create a test file
            var fi = new FileInfo(@"C:\Temp\sample.xlsx");
            if (fi.Exists)
                fi.Delete();

            using (var pck = new ExcelPackage(fi))
            {
                var worksheet = pck.Workbook.Worksheets.Add("Sheet1");
                var list = stages.SelectMany(x => x.Lines).ToList();
                worksheet.Cells[1, 1].Value = "Sequence";
                worksheet.Cells[1, 2].Value = "Title";
                worksheet.Cells[1, 3].Value = "Parent";
                worksheet.Cells[1, 4].Value = "HasChildren";

                // Create the grouping
                var outlineLevel = 1;
                var row = 2;

                for (int i = 0; i < stages.Count; i++)
                {
                    worksheet.Row(row+1).OutlineLevel = 1;
                    worksheet.Row(row+1).Collapsed = true; 
                    worksheet.Cells[row, 1].Value = stages[i].Sequence;
                    worksheet.Cells[row, 2].Value = stages[i].Title;
                    worksheet.Cells[row, 3].Value = " ";
                    worksheet.Cells[row, 4].Value = "True";
                    ++row;
                    for (int j = 0; j < stages[i].Lines.Count; j++)
                    {
                        worksheet.Row(row + 1).OutlineLevel = 1;
                        worksheet.Row(row + 1).Collapsed = true;
                        worksheet.Cells[row, 1].Value = stages[i].Lines[j].Sequence;
                        worksheet.Cells[row, 2].Value = "Line";
                        worksheet.Cells[row, 3].Value = stages[i].Lines[j].ParentId;
                        worksheet.Cells[row, 4].Value = stages[i].Lines[j].HasChildren;
                        ++row;
                    }
                }

                pck.Save();
                pck.Dispose();
            }
        }

любая помощь очень ценится, заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...