2015-05-26 2 views
1

У меня есть рабочий лист Epplus Excel, который выглядит так.Выбор сгруппированных max и min в листе Epplus с Linq

enter image description here

Хочу группы по столбцу Group (в колонке А), а затем выбрать макс и мин. Что-то в моей статье group by не совсем верно, и я получаю сообщение об ошибке: Cannot apply indexing with [] to ExcelRangeBase.

var maxMinGrouped = from cells in _dataSheet.Cells["A:H"] 
        group cells by cells["A:A"].Value into g //pull "Group" column into group 
        select new 
        { 
         Group = cells["A:A"].Value, 
         MaxDailyIndex = g.Max(c => c.Value), 
         MinDailyIndex = g.Min(c => c.Value) 
        }; 

SQL, которого я пытаюсь достичь.

SELECT Group 
    ,MAX(Col_E) AS MaxDailyIndex 
    ,MIN(Col_E) AS MinDailyIndex 
FROM Worksheet 
GROUP BY Group 

ответ

2

Помните, что коллекция ячеек представляет собой матрицу 2x2, поэтому вам нужно будет группировать ячейки в строки, прежде чем вы сможете группировать их в группы строк. Я путь ржавый на обозначении запроса LINQ, но вот как это сделать, используя точечную нотацию:

[TestMethod] 
public void Grouped_Row_Test() 
{ 
    //http://stackoverflow.com/questions/30466257/selecting-grouped-max-and-min-in-a-epplus-worksheet-with-linq 

    var existingFile = new FileInfo(@"c:\temp\Grouped.xlsx"); 
    using (var pck = new ExcelPackage(existingFile)) 
    { 
     var _dataSheet = pck.Workbook.Worksheets.First(); 

     //Group cells by row 
     var rowcellgroups = _dataSheet 
      .Cells["A:H"] 
      .GroupBy(c => c.Start.Row); 

     //Now group rows the column A; Skip the first row since it has the header 
     var groups = rowcellgroups 
      .Skip(1) 
      .GroupBy(rcg => rcg.First().Value); 

     //Reproject the groups for the min/max values; Column E = 5 
     var maxMinGrouped = groups 
      .Select(g => new 
      { 
       Group = g.Key, 
       MaxDailyIndex = g.Select(o => o.First(rc => rc.Start.Column == 5)).Max(rc => rc.Value), 
       MinDailyIndex = g.Select(o => o.First(rc => rc.Start.Column == 5)).Min(rc => rc.Value) 
      }); 

     maxMinGrouped 
      .ToList() 
      .ForEach(mmg => Console.WriteLine("{{Group: \"{0}\", Min={1}, Max={2}}}", mmg.Group, mmg.MinDailyIndex, mmg.MaxDailyIndex)); 
    } 
} 

Что дает это в консоли после того, как я бросил в некоторых случайных данных вашей таблицы Excel:

{Group: "3", Min=0, Max=88} 
{Group: "4", Min=6, Max=99}