根据原文链接: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;
}