c# 如何根据dataTable创建透视表

根据原文链接:https://blog.csdn.net/qq_42678477/article/details/104776784的文章进行更改,支持多个透视字段,默认第一个透视字段进行排序。
调用实例:

PivotTableGenerator(dt, new string[] { "字段1", "字段2", "字段3" }, new string[] { "透视字段1", "透视字段2" }, "值字段")
```csharp**加粗样式**


//        ————————————————
        //版权声明:本文为CSDN博主「qq_42678477」的原创文章,遵循CC 4.0 BY - SA版权协议,转载请附上原文出处链接及本声明。
        //原文链接:https://blog.csdn.net/qq_42678477/article/details/104776784
        /// <summary>
        /// 创建透视表
        /// </summary>
        /// <param name="_source">源表</param>
        /// <param name="_fields">行字段列表</param>
        /// <param name="_pivotField">列字段列表</param>
        /// <param name="_valueFileld">值</param>
        /// <param name="dic_renameFields">此字段未用到</param>
        /// <returns></returns>
        public static DataTable PivotTableGenerator(DataTable _source, string[] _fields, string[] _pivotFields, string _valueFileld, Dictionary<string,string> dic_renameFields=null)
        {
            if (null == _source || _fields==null || _pivotFields==null || string.IsNullOrEmpty(_valueFileld))
            {
                throw new Exception(" PivotTableGenerator 初始化错误");
            }
            DataTable _result = new DataTable();

            //fields
            DataTable dt = new DataView(_source).ToTable(true, _fields);
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                DataColumn col = new DataColumn(dt.Columns[i].ColumnName, dt.Columns[i].DataType);
                _result.Columns.Add(col);
            }

            foreach (DataRow dataRow in dt.Rows)
            {
                DataRow dr = _result.NewRow();
                foreach (DataColumn dataColumn in dt.Columns)
                {
                    dr[dataColumn.ColumnName] = dataRow[dataColumn.ColumnName];
                }
                _result.Rows.Add(dr);
            }

            if (0 == _source.Rows.Count)
                return _result;

            //pivot
            List<string> pivotColumns = new List<string>();
            Type valueType = _source.Columns[_valueFileld].DataType;
            dt = new DataView(_source).ToTable(true, _pivotFields);
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                string pivotFieldName = "";
                for (int j = 0; j < _pivotFields.Length; j++) {
                    pivotFieldName += dt.Rows[i][j].ToString()+ "_";
                }
                pivotFieldName = pivotFieldName.Trim('_');
                DataColumn col = new DataColumn(pivotFieldName, valueType);
                _result.Columns.Add(col);
                pivotColumns.Add(pivotFieldName);
            }
            pivotColumns.Sort();
            //fild data  暂时设为无重复数据
            List<string> filter0;

            foreach (DataRow dataRow in _result.Rows)
            {
                filter0 = new List<string>();
                foreach (var item in _fields)
                    filter0.Add(string.Format("{0} = '{1}' ", item, dataRow[item].ToString()));

                foreach (string pivotFieldValue in pivotColumns)
                {
                    List<string> filter1 = new List<string>(filter0);
                    string[] pivotFieldValues = pivotFieldValue.Split('_');
                    for(int j=0;j< pivotFieldValues.Length;j++)
                    {
                        filter1.Add(string.Format("{0} = '{1}' ", _pivotFields[j], pivotFieldValues[j]));
                    }
                    DataRow[] drSources = _source.Select(string.Join(" and ", filter1));
                    if (null != drSources && drSources.Length > 0)
                        dataRow[pivotFieldValue] = drSources[0][_valueFileld];
                }

            }
            return _result;

    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值