我们有时候会遇到这种需求:将导出的XX数据增加合计行,或者在页面增加合计行等等,遇到这种需求,如果要加合计的内容比较多怎么办,有点要疯了的感觉。这时候就想能不能有一个通用的方法,一次性都加上。
我想到加工已经获取到的数据源,一下是我写的两个方法,第一个方法用来给Datatable加合计行,第二个方法用来给List<T>泛型对象加合计行
/// <summary>
/// 添加合计行
/// 2019-04-02
/// </summary>
/// <param name="dataTable"></param>
public static void AddSumRowToDataSource(DataTable dataTable)
{
if (dataTable == null || dataTable.Rows.Count == 0)
{
return;
}
DataRow sumRow = dataTable.NewRow();
foreach (DataColumn item in dataTable.Columns)
{
try
{
string typeName = item.DataType.Name;
switch (typeName)
{
case "Decimal":
sumRow[item] = dataTable.AsEnumerable().Sum(e => e.Field<decimal>(item)).ToString("N2");
break;
case "Int":
sumRow[item] = dataTable.AsEnumerable().Sum(e => e.Field<int>(item)).ToString("N2");
break;
case "Double":
sumRow[item] = dataTable.AsEnumerable().Sum(e => e.Field<double>(item)).ToString("N2");
break;
case "String":
sumRow[item] = dataTable.AsEnumerable().Sum(e => Convert.ToDecimal(e.Field<string>(item))).ToString("N2");
break;
default:
break;
}
}
catch
{
continue;
}
}
sumRow[0] = "合计";
dataTable.Rows.Add(sumRow);
}
/// <summary>
/// 添加合计行
/// 2019-04-02
/// </summary>
/// <param name="dataSource"></param>
public static void AddSumRowToDataSource<T>(List<T> dataSource) where T : new()
{
if (dataSource == null || dataSource.Count() == 0)
{
return;
}
T sumItem = new T();//创建一个对象,用来存合计的值
Type type = sumItem.GetType(); //对象类型
IEnumerable<System.Reflection.PropertyInfo> properties = from pi in type.GetProperties() select pi; //获取此对象所有的属性
foreach (System.Reflection.PropertyInfo propertyInfo in properties)
{//对每个属性尝试合计,如果能合计就跳过
try
{
decimal sumValue = dataSource.Sum(e =>
{
Type etype = e.GetType();
IEnumerable<System.Reflection.PropertyInfo> eproperty = from pi in etype.GetProperties() where pi.Name == propertyInfo.Name select pi;
return Convert.ToDecimal(eproperty.First().GetValue(e, null));
});
propertyInfo.SetValue(sumItem, sumValue);
}
catch
{
continue;
}
}
dataSource.Add(sumItem);
}