把Gridview的ItemsSource 输出到excel
ItemsSource含 AnonymousType ,table 或DataView。(WPF C#)
TABLE: 在这里称表里面放着一组二维数据
LIST: 在这里称列表里面放着一组具有相同类型的一维数据,我们可以说LIST<T>。
AnonymousType: 存的是不同类型的一维数组,什么都行,乱来。当然他附带了对各位的类型说明。
WPF或silverlight 可以将一组有序数赋给 “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
翁谦