把Gridview的ItemsSource 输出到excel ,ItemsSource含 AnonymousType ,table 或DataView。(WPF C#)

把Gridview的ItemsSource  输出到excel 

ItemsSource含 AnonymousType ,table 或DataView。(WPF C#)

 

TABLE: 在这里称表里面放着一组二维数据

LIST:  在这里称列表里面放着一组具有相同类型的一维数据,我们可以说LIST<T>

AnonymousType:  存的是不同类型的一维数组,什么都行,乱来。当然他附带了对各位的类型说明。

 

WPFsilverlight 可以将一组有序数赋给ItemsSource” 或者绑定到”ItemsSource”, 从而使数据显示在”dataview”中。 数据的来源可以是table 也和可以是 Dataview。  当然用LINQ 建一个新表是一件很方便的事。你用 select new 建立的数据是以AnonymousType的格式,存在ItemsSource”中的。

比如

   var qqq = setss.Employees.

            Select(p => new { ww = p.FirstName.Replace("A", " "), we = p.LastName, p.BirthDate });

            gridview_1.ItemsSource = qqq.ToList();

你得到

AnonymousType 是一种很泛的类型在C#3 以后被广泛使用。其实它就是一个带不同数据类型的列表(LIST)。当然我们谈的表是含有相同数据类型分布的的列表。在这里我给出一个方法Anony2tab”,转换列表”AnonymousType” 到一个表(TABLE)。

 

无论是用绑定还是直接赋值,我们都可以把一组二维的数据通过ItemsSource” 显示在”gridview”里面。所以首先我要判断”temsSource”的类型, 然后把它转换成表。 下面是一个判断及转换的语句。

 

DataTable tb = new DataTable();

 

  if (gridview_1.ItemsSource.GetType().IsSubclassOf(typeof(DataTable)))

            {

                tb = (DataTable)gridview_1.ItemsSource;

            }

            else if (gridview_1.ItemsSource.GetType().Name == "List`1")

            {

                tb = g2e.Anony2tab(gridview_1.ItemsSource);

 

            }

            else if (gridview_1.ItemsSource.GetType().IsSubclassOf(typeof(DataView)))

            {

                var qq = (DataView)gridview_1.ItemsSource;

                tb = qq.ToTable();

            }

            else

            {

                MessageBox.Show("for type...  " + gridview_1.ItemsSource.GetType().Name);

                return;

                

            }

 

这里 gridview_1 是一个“gridview”控件。 别的方法给它的“itemSource”赋了值,当然也许是绑定。

GetType() 得到的是一个类,而不是一个简单的属性。所以它有很多方法和属性。“If“ 语句首先判断他是否属于”datatable“, 如果属于,只直接赋给tb。

如果属于dataview 也和容易住换成表,然后赋给tb。

如果名字是"List`1",就调用Anony2tab的方法把它转成表,然后赋给tb。

 如果不是这三种类, 你在接着写一个方法,把它做成表。

 

有了表就可以调用“TableToExcel“ 把这个表住换成excel了。 转换过程稍加修饰就可得到你所需要的excel文件。

方法“nony2tab“

  public DataTable Anony2tab(System.Collections.IEnumerable gd)

        {

            var tb = new DataTable();

            foreach (var r_c in gd)

            {

                var prop_s = r_c.GetType().GetProperties();

                if (tb.Columns.Count==0)

                {

                 foreach (var prop in prop_s)

                 {

                     var t_type = prop.PropertyType;

                     var t_name = prop.Name;

                     tb.Columns.Add(t_name, t_type);

                 }

                }

                var n_row = tb.NewRow();

                foreach (var prop in prop_s)

                {

                     var t_name = prop.Name;

                     var t_value = prop.GetValue(r_c, null);

                  

                    n_row[t_name] = t_value;

                }

                tb.Rows.Add(n_row);

            }

            return tb;

        }

 

 

 

先建立一个空表  “tb”

然后读ItemsSource每一个列表,并把他们的值取出来放在表里。在读第一个列表时,需要建立 “tb“ 的列。”tb.Columns.Count==0“ 是说tb还没有列。

t_type 得到的是数据类型

t_name得到的是名字,我们把这个名字作为“tb“表的列的名字。

var n_row = tb.NewRow(); 建立一个新点的表行

t_value得到的是数据的值。

n_row[t_name] = t_value; 是将值赋给具有这个名字的列。

这样转下来, 一个新的表就建好了。

 

“TableToExcel“是一个将表转成excel的方法, 网上有很多的例子我就不在细述了。如果想看,可看我的演示程序。

 看一下代码就明白了

 https://skydrive.live.com/redir?resid=2C6E0E5397AEA764!658

 

翁谦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值