2015-03-05 3 views
1

У меня есть список <> с разными записями, каждая из которых существует из нескольких элементов. (Марка, версия, вариант)Заполните лист Excelsheet со списком <> записей

List<car> carList = new List<car>(); 

Карлистские включает в себя элементы: бренд, версия, вариант Это мой код на самом деле:

public partial class MainForm 
{ 
    public void ProtokollToolStripMenuItemClick(object sender, EventArgs e) 
    { 
     Excel.Application ExcelApplication; 
     Excel._Workbook ExcelWorkbook; 
     Excel._Worksheet ExcelWorksheet; 

     try 
     { 
      //Start Excel 
      ExcelApplication = new Excel.Application(); 
      ExcelApplication.Visible = true;     
      //New Workbook/Worksheet 
      ExcelWorkbook = (Excel._Workbook)(ExcelApplication.Workbooks.Add(Missing.Value)); 
      ExcelWorksheet = (Excel._Worksheet)ExcelWorkbook.ActiveSheet;    
      //Counter 
      int countplus1 = 0; 
      int countplus4 = 0; 

      foreach (car A in carList) 
      {    
       //Fill the List 
       countplus1 += 1; 
       countplus4 += 4; 
       ExcelSheet.Cells[3 + countplus4, 2] = "Brand:"; 
       ExcelSheet.Cells[3 + countplus4 + 1, 2] = "Version:"; 
       ExcelSheet.Cells[3 + countplus4 + 2, 2] = "Variant:"; 
       ExcelSheet.Cells[3 + countplus4, 3] = A.CarBrand; 
       ExcelSheet.Cells[3 + countplus4 + 1, 3] = A.CarVersion; 
       ExcelSheet.Cells[3 + countplus4 + 2, 3] = A.CarVariant; 
      } 
     } 
     catch 
     { 
     } 
    } 

На данный момент мой Excelsheet выглядит так:

{ 
    Brand:  Audi 
    Version: A4 
    Variant: Limousine 

    Brand:  VW 
    Version: Golf 
    Variant: Limousine 

    Brand:  Audi 
    Version: A3 
    Variant: Wagon 

    Brand:  Audi 
    Version: A4 
    Variant: Limousine 
} 

Теперь я хочу, что excelsheet выглядит следующим образом:

{ 
    Brand:  Audi 
    Version: A4 
    Variant: Limousine 
       Wagon 
       Coupe 

    Version: A3 
    Variant: Limousine 
       Wagon  

    Brand:  VW 
    Version: Golf 
    Variant: Limousine 
       Coupe 
} 

Может кто-нибудь мне помочь, я не сейчас, как это сделать? Может быть, попробуйте & cath?

Спасибо всем

+0

Может никто мне помочь? – Excelsharper

+0

Я вижу, что вам нужна многоуровневая группировка, и это нормально, но ваша публикация неясна в отношении отступов. – Dai

+0

Что именно неясно? – Excelsharper

ответ

0

Поскольку вы не отправляли, что Car класса выглядит, я буду нуждаться предположить, что Car выглядит следующим образом:

public class Car 
{ 
    public String CarBrand{ get; set; } 
    public String CarVersion{ get; set; } 

    //if this is only a single string, you will need to change it. 
    public List<String> Variants { get; set; } 
} 

вы можете сделать это :

public void ProtokollToolStripMenuItemClick(object sender, EventArgs e) 
{ 
    Excel.Application ExcelApplication; 
    Excel._Workbook ExcelWorkbook; 
    Excel._Worksheet ExcelWorksheet; 

    try 
    { 
     //Start Excel 
     ExcelApplication = new Excel.Application(); 
     ExcelApplication.Visible = true;     
     //New Workbook/Worksheet 
     ExcelWorkbook = (Excel._Workbook)(ExcelApplication.Workbooks.Add(Missing.Value)); 
     ExcelWorksheet = (Excel._Worksheet)ExcelWorkbook.ActiveSheet;    
     //Counter 

     int countplus1 = 0; 
     int countplus4 = 0; 

     foreach (Car A in carList) 
     {    
      //Fill the List 
      countplus1 += 1; 
      countplus4 += 4; 
      ExcelSheet.Cells[3 + countplus4, 2] = "Brand:"; 
      ExcelSheet.Cells[3 + countplus4 + 1, 2] = "Version:"; 
      ExcelSheet.Cells[3 + countplus4 + 2, 2] = "Variant:"; 

      ExcelSheet.Cells[3 + countplus4, 3] = A.CarBrand; 
      ExcelSheet.Cells[3 + countplus4 + 1, 3] = A.CarVersion; 

      if(A.Variants == null) continue; 

      foreach(String variant in A.Variants) 
      { 
       ExcelSheet.Cells[3 + countplus4 + (A.Variants.IndexOf(variant)+2), 3] = variant; 
      } 
     } 
    } 
    catch 
    { 
    } 
} 
0

Вы хотите группировать данные по марке, а затем по версии. Вы можете сделать это с помощью Linq.

Чтобы сделать одноуровневый группировку (например, марки) вы хотите:

IGrouping<String,Car> carsByBrand = cars.GroupBy(car => car.Brand); 

Но сделать многоуровневую группировку, мы первые группы по внутреннему критерию (Version) затем объединить все их вместе (SelectMany), а затем группу по Brand:

var carsByBrandByVersion = 
    cars.GroupBy(car => car.Version). 
    SelectMany(
     g => g.GroupBy(g2 => g2.Brand) 
    ); 

Когда эта коллекция перечисляется вы получите результат вы после:

foreach(var brandGroup in carsByBrandByVersion) { 
    Console.WriteLine("Brand: {0}", brandGroup.Key); 
    foreach(var versionGroup in brandGroup) { 
     Console.WriteLine(" Version: {0}", versionGroup.Key); 
     foreach(Car car in versionGroup) { 
      Console.WriteLine("  Variant: {0}", car.Variant); 
     } 
    } 
} 

Это дает вам утешать выход в нужном формате, преобразовав его использовать Excel должна быть тривиальной :)

Смежные вопросы