Мне нужно экспортировать родительскую дочернюю модель 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();
}
}
любая помощь очень ценится, заранее спасибо