简体   繁体   English

使用Linq在Epplus工作表中选择分组的最大值和最小值

[英]Selecting grouped max and min in a Epplus worksheet with Linq

I have an Epplus Excel Worksheet that looks like this. 我有一个看起来像这样的Epplus Excel工作表。

在此输入图像描述

I want to group by the Group column (in column A), and then select the max and the min. 我想按Group列分组(在A列中),然后选择max和min。 Something in my group by clause isn't quite right and I'm getting an error: Cannot apply indexing with [] to ExcelRangeBase . 我的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)
                    };

The SQL I'm trying to achieve. 我想要实现的SQL。

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

Remember that the cells collection is a 2x2 matrix so you will need to group cells into rows before you can group into groups of row. 请记住,单元格集合是2x2矩阵,因此您需要将单元格分组为行,然后才能分组为行组。 I am way rusty on the query notation of linq but here is how to do it using the dot notation: 我对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));
    }
}

Which gives this in the console after I threw in some random data to your excel table: 在我向excel表中输入一些随机数据后,在控制台中给出了这个:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM