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

标签 c# linq epplus

我有一个如下所示的 Epplus Excel 工作表。

enter image description here

我想按组列(在 A 列中)进行分组,然后选择最大值和最小值。我的 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

最佳答案

请记住,单元格集合是一个 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}

关于c# - 使用 Linq 在 Epplus 工作表中选择分组的最大值和最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30466257/

相关文章:

c# - 当我实现一个基类也实现的接口(interface)时,为什么我没有收到编译器警告?

c# - 需要有关正则表达式的帮助,而不是替换表达式的所有实例

c# - 你如何在 Linq 中加入/组/最大/最小?

c# - 如何在 LINQ 中使用 GroupBy 查找丢失的项目?

excel - 从 Excel 单元格读取

c# - 执行 MySqlDataReader::Read() 时发生超时

c# - 如何通过 C# 运行 mysqlcheck

.net - Entity Framework 中主细节/多表插入的最佳实践/方法

c# - EPPlus AutoRisize 单元格以适合内容 - 删除不需要的间距

excel - 如何使用epplus循环读取excel中的列标题