zoukankan      html  css  js  c++  java
  • c# 行转列

    将下面表(1)格式的数据转换为表(2)格式的数据。很明显,这是一个行转列的要求,本想在数据库中行转列,因为在数据库中行转列是比较简单的,方法可以参考本站SQLServer中(行列转换)行转列及列转行且加平均值及汇总值,但因其它需求,最终需将该转化搬到C#中进行了。

    (表1)

     

    表(2)

     

    不多说了,下面开始在DataTable行转列示例:

    //DataTable行转列

    private DataTable RCC(DataTable _outDataSource)

    {

        //从DataTable中读取不重复的日期行,用来构造新DataTable的列

        DataTable distinct_date = _outDataSource.DefaultView.ToTable(true, "日期");

        DataTable new_DataTable = new DataTable();

        //将客户名称列添加到新表中

        DataColumn new_d_col = new DataColumn();

        new_d_col.ColumnName = "客户名称";

        new_d_col.Caption = "";

        new_DataTable.Columns.Add(new_d_col);

        StringBuilder str_sum = new StringBuilder();

        //开始在新表中构造日期列

        foreach (DataRow dr in distinct_date.Rows)

        {

            new_d_col = new DataColumn();

            new_d_col.DataType = typeof(decimal);

            new_d_col.ColumnName = dr["日期"].ToString();

            new_d_col.Caption = dr["日期"].ToString();

            new_d_col.DefaultValue = 0;

            new_DataTable.Columns.Add(new_d_col);

            //这个的目的是为合计列构造expression

            str_sum.Append("+[").Append("日期").Append("]");

        }

        //将合计列添加到新表中

        new_d_col = new DataColumn();

        new_d_col.DataType = typeof(decimal);

        new_d_col.ColumnName = "Sum";

        new_d_col.Caption = "合计";

        new_d_col.DefaultValue = 0;

        new_d_col.Expression = str_sum.ToString().substring(1);

        new_DataTable.Columns.Add(new_d_col);

        /*好了,到此新表已经构建完毕,下面开始为新表添加数据*/

        //从原DataTable中读出不重复的客户名称,以客户名称为关键字来构造新表的行

        DataTable distinct_object = _outDataSource.DefaultView.ToTable(true, "客户名称");

        DataRow[] drs;

        DataRow new_dr;

        foreach (DataRow dr in distinct_object.Rows)

        {

            new_dr = new_DataTable.NewRow();

            new_dr["客户名称"] = dr["客户名称"].ToString();

            foreach (DataRow _dr in distinct_date.Rows)

            {

                drs = _outDataSource.Select("客户名称='" + dr["客户名称"].ToString() + "' and 日期='" + _dr["日期"].ToString() + "'");

                if (drs.Length != 0)

                {

                    new_dr[_dr["日期"].ToString()] = Math.Round(Convert.ToDecimal(drs[0]["金额"]), 2);

                }

            }

            new_DataTable.Rows.Add(new_dr);

        }

         return new_DataTable;

    }

    从上面的代码中看到我们并没有为新表"合计"这一列赋值,这是因为该列具有表达式str_sum.Append("+[").Append("日期").Append("]"),所以这列的值是会自动填充的。

    注意,在上面的表达式中,我们加了[],在DataTable的表达式中,如果列名是中文,一定要为列名加上[],要不然会报错的,这也是我调试了好久才发现的。

  • 相关阅读:
    java中的 equals 与 ==
    String类的内存分配
    SVN用命令行更换本地副本IP地址
    npoi 设置单元格格式
    net core 微服务框架 Viper 调用链路追踪
    打不死的小强 .net core 微服务 快速开发框架 Viper 限流
    net core 微服务 快速开发框架 Viper 初体验20201017
    Anno 框架 增加缓存、限流策略、事件总线、支持 thrift grpc 作为底层传输
    net core 微服务 快速开发框架
    Viper 微服务框架 编写一个hello world 插件02
  • 原文地址:https://www.cnblogs.com/AbelAngelo/p/9359115.html
Copyright © 2011-2022 走看看