[英]Selecting grouped max and min in a Epplus worksheet with Linq
我有一个看起来像这样的Epplus Excel工作表。
我想按Group列分组(在A列中),然后选择max和min。 我的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}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.