DataTable oldDataTable = new DataTable(); oldDataTable.Columns.Add("商品"); oldDataTable.Columns.Add("销售成本"); oldDataTable.Columns.Add("销售利润"); DataRow dr = oldDataTable.NewRow(); for (int i = 0; i < 6; i++) { dr = oldDataTable.NewRow(); dr["商品"] = "A"; dr["销售成本"] = 100+i; dr["销售利润"] = 1000+i; oldDataTable.Rows.Add(dr); }
主要是插入了百分比的列,以及在末尾增加合计行。
注意不能有重复列名的问题。
var oldDataTable = new DataTable(); oldDataTable.Columns.Add("商品"); oldDataTable.Columns.Add("销售成本"); oldDataTable.Columns.Add("销售利润"); DataRow dr = oldDataTable.NewRow(); for (int i = 0; i < 6; i++) { dr = oldDataTable.NewRow(); dr["商品"] = "A"; dr["销售成本"] = 100 + i; dr["销售利润"] = 1000 + i; oldDataTable.Rows.Add(dr); } //步骤1、计算总成本,和总利润 var totalCost = oldDataTable.Rows.Cast<DataRow>().Sum(x => Convert.ToInt32(x["销售成本"] ?? "0")); var totalProfit = oldDataTable.Rows.Cast<DataRow>().Sum(x => Convert.ToInt32(x["销售利润"] ?? "0")); //添加列 oldDataTable.Columns.Add(new DataColumn("成本百分比", typeof(string))); oldDataTable.Columns.Add(new DataColumn("利润百分比", typeof(string))); //写入数据行数据 foreach (DataRow dr1 in oldDataTable.Rows) { dr1["成本百分比"] = (Convert.ToInt32(dr1["销售成本"] ?? "0") / totalCost).ToString("P2"); dr1["利润百分比"] = (Convert.ToInt32(dr1["销售利润"] ?? "0") / totalProfit).ToString("P2"); } //追加最后一行的数据 oldDataTable.Rows.Add("合计", totalCost, "100%", totalProfit, "100%");
你有必要多看看DataTable的操作!
列的顺序要如上图右边那个哦,要创建一个新的DataTable?
The convert type change to "Decimal".
var oldDataTable = new System.Data.DataTable(); var newDataTable = new System.Data.DataTable(); oldDataTable.Columns.Add("商品"); oldDataTable.Columns.Add("销售成本"); oldDataTable.Columns.Add("销售利润"); DataRow dr = oldDataTable.NewRow(); for (int i = 0; i < 6; i++) { dr = oldDataTable.NewRow(); dr["商品"] = "A"+i; dr["销售成本"] = 100 + i; dr["销售利润"] = 1000 + i; oldDataTable.Rows.Add(dr); } //步骤1、计算总成本,和总利润 var totalCost = oldDataTable.Rows.Cast<DataRow>().Sum(x => Convert.ToDecimal(x["销售成本"] ?? "0")); var totalProfit = oldDataTable.Rows.Cast<DataRow>().Sum(x => Convert.ToDecimal(x["销售利润"] ?? "0")); oldDataTable.Columns.Add(new DataColumn("成本百分比", typeof(string))); oldDataTable.Columns.Add(new DataColumn("利润百分比", typeof(string))); //添加列 newDataTable.Columns.Add("商品"); newDataTable.Columns.Add("销售成本"); newDataTable.Columns.Add(new DataColumn("成本百分比", typeof(string))); newDataTable.Columns.Add("销售利润"); newDataTable.Columns.Add(new DataColumn("利润百分比", typeof(string))); //写入数据行数据 foreach (DataRow dr1 in oldDataTable.Rows) { dr1["成本百分比"] = (Convert.ToDecimal(dr1["销售成本"] ?? "0") / totalCost).ToString("P2"); dr1["利润百分比"] = (Convert.ToDecimal(dr1["销售利润"] ?? "0") / totalProfit).ToString("P2"); dr = newDataTable.NewRow(); dr["商品"] = dr1["商品"]; dr["销售成本"] = dr1["销售成本"]; dr["成本百分比"] = dr1["成本百分比"]; dr["销售利润"] = dr1["销售利润"]; dr["利润百分比"] = dr1["利润百分比"]; newDataTable.Rows.Add(dr); } //追加最后一行的数据 newDataTable.Rows.Add("合计", totalCost, "100%", totalProfit, "100%");
ok了,newDataTable就是我想要的。
不过这样的性能是不是很槽糕呢?
@alone2013: 我想说为什么不在数据库做这事呢?sql语句就能搞定的!不需要在客户端来做!
@幻天芒:
主要是因为原table或将绑定在GridView或序列化为json,在sql那处理的话,有些列,行是多余的了。
哪个性能更好呢?
用sql语句也是要通过Declare 变量,
然后用批处理完成?
如果写成存储过程是不是要比在c#里计算 的性能好呢?
@alone2013:
public class Model { public string 商品{get;set;} public string 成本{get;set;} [Newtonsoft.Json.JsonIgnore]//加上特性之后,json序列化,就忽略该字段了 public string 成本占比{get;set;} }
sql语句处理更简洁。性能更好。
关键是你什么不懂?
1、如果是EXCEL的话,合计和百分比,不需要由数据库提供,可以在EXCEL里面用公式完成。
2、如果是要构造在DATATABLE里面的话,ColumnName不一样这是必须的,你可以叫“百分比1”,“百分比2”
3、如果代码不懂,不至于吧?反正不费事,简单说下。
a. 添加两列用于保存百分比
b. 求出6行的合计,放在第7行里面,并放在一个合计变量里面,假设为TotalAmount。
c. 循环1~6行,计算出百分比, Amount/TotalAmount。填入百分比列。
d. 工作完成。