如何在C#中汇总动态列表?

时间:2016-06-15 20:06:11

标签: c# excel visual-studio epplus

使用下面的代码块,当行数每次都改变时,如何编写求和公式?我把它硬编码为C11:C33和D11:D33,但我试图摆脱它。我知道我可以调用第一个和最后一个值并将其用作范围,但我在语法上苦苦挣扎。
对此非常陌生,所以道歉/先谢谢!

using (FulfillmentEntities DB3 = new FulfillmentEntities())
                            { 
                                TotalRows = results5.Count();

                                foreach (var d in results5)
                                {
                                    int col = 2;

                                    worksheet.Cells[row, col++].Value = d.Category;
                                    worksheet.Cells[row, col++].Value = d.intA;
                                    worksheet.Cells[row, col++].Value = d.intB;

                                    row++;

                                }
                                int TotalCol = 2;

                                worksheet.Cells[row, TotalCol++].Value =  "Total";
                                worksheet.Cells[row, TotalCol++].Formula = "SUM(C11:C33)";
                                worksheet.Cells[row, TotalCol++].Formula = "SUM(D11:D33)";
                            }

2 个答案:

答案 0 :(得分:0)

只需将列表传递给GetRowMinAndMax方法即可。此方法假定列表不为null或为空,并且您要在单列中查找范围

public Tuple<string,string> GetRowMinAndMax(List<string> colRows)
{
   var rowLow = colRows.Min(ExtractRow);
    var rowMax = colRows.Max(ExtractRow);
    var col = ExtractCol(colRows.First());
    return Tuple.Create(col + rowLow, col + rowMax);
}

public int ExtractRow(string colRow)
{
  return int.Parse(new string(colRow.Where(char.IsDigit).ToArray()));
}

public string ExtractCol(string colRow)
{
    return new string(colRow.Where(char.IsLetter).ToArray());
}

修改

实际上这可能是一个过于复杂的问题,因为它不是跨列。 list.First()不起作用的原因是因为列表没有排序,所以你要取出你放入的第一个元素。你可以通过调用

来排序列表
var orderedList = list.orderBy(s=> s);

然后第一个也是最后一个会起作用。

答案 1 :(得分:0)

刚看到你的编辑Alex,谢谢你的帮助。元组解决方案有点过头了。以下是我最后完成的工作,非常简洁。为我想要的总数创建了一个变量,并使用+ =运算符在每次迭代时递增它。然后在我的foreach循环之外调用它。

WorksheetFunction