GridView既强大又好用。为了让它更强大、更好用,我们来写一个继承自GridView的控件。
[索引页]
[源码下载]
扩展GridView控件(8) - 导出数据源的数据为Excel、Word或Text
作者:
webabcd
/*正式版的实现 开始*/
介绍
扩展GridView控件:
导出数据源的数据为Excel、Word或Text(应保证数据源的类型为DataTable或DataSet)
使用方法:
为SmartGridView添加的方法
Export(string fileName)
Export(string fileName, ExportFormat exportFormat)
Export(string fileName, ExportFormat exportFormat, Encoding encoding)
Export(string fileName, int[] columnIndexList, ExportFormat exportFormat, Encoding encoding)
Export(string fileName, int[] columnIndexList, string[] headers, ExportFormat exportFormat, Encoding encoding)
Export(string fileName, string[] columnNameList, ExportFormat exportFormat, Encoding encoding)
Export(string fileName, string[] columnNameList, string[] headers, ExportFormat exportFormat, Encoding encoding)
关键代码
using System;
using System.Collections.Generic;
using System.Text;

using System.Data;
using System.Web.UI.WebControls;

namespace YYControls


{

/**//// <summary>
/// SmartGridView类的属性部分
/// </summary>
public partial class SmartGridView

{

/**//// <summary>
/// 导出SmartGridView的数据源的数据
/// </summary>
/// <param name="fileName">文件名</param>
/// <param name="exportFormat">导出文件的格式</param>
/// <param name="encoding">编码</param>
public void Export(string fileName, ExportFormat exportFormat, Encoding encoding)

{
DataTable dt = GetDataTable();
Helper.Common.Export(dt, exportFormat, fileName, encoding);
}


/**//// <summary>
/// 导出SmartGridView的数据源的数据
/// </summary>
/// <param name="fileName">文件名</param>
/// <param name="exportFormat">导出文件的格式</param>
public void Export(string fileName, ExportFormat exportFormat)

{
Export(fileName, exportFormat, Encoding.GetEncoding("GB2312"));
}


/**//// <summary>
/// 导出SmartGridView的数据源的数据为Excel
/// </summary>
/// <param name="fileName">文件名</param>
public void Export(string fileName)

{
Export(fileName, ExportFormat.CSV);
}


/**//// <summary>
/// 导出SmartGridView的数据源的数据
/// </summary>
/// <param name="fileName">输出文件名</param>
/// <param name="columnIndexList">导出的列索引数组</param>
/// <param name="exportFormat">导出文件的格式</param>
/// <param name="encoding">编码</param>
public void Export(string fileName,int[] columnIndexList, ExportFormat exportFormat, Encoding encoding)

{
DataTable dt = GetDataTable();

Helper.Common.Export(dt, columnIndexList, exportFormat, fileName, encoding);
}


/**//// <summary>
/// 导出SmartGridView的数据源的数据
/// </summary>
/// <param name="fileName">输出文件名</param>
/// <param name="columnNameList">导出的列的列名数组</param>
/// <param name="exportFormat">导出文件的格式</param>
/// <param name="encoding">编码</param>
public void Export(string fileName, string[] columnNameList, ExportFormat exportFormat, Encoding encoding)

{
DataTable dt = GetDataTable();

Helper.Common.Export(dt, columnNameList, exportFormat, fileName, encoding);
}


/**//// <summary>
/// 导出SmartGridView的数据源的数据
/// </summary>
/// <param name="fileName">输出文件名</param>
/// <param name="columnIndexList">导出的列索引数组</param>
/// <param name="headers">导出的列标题数组</param>
/// <param name="exportFormat">导出文件的格式</param>
/// <param name="encoding">编码</param>
public void Export(string fileName, int[] columnIndexList, string[] headers, ExportFormat exportFormat, Encoding encoding)

{
DataTable dt = GetDataTable();

Helper.Common.Export(dt, columnIndexList, headers, exportFormat, fileName, encoding);
}


/**//// <summary>
/// 导出SmartGridView的数据源的数据
/// </summary>
/// <param name="fileName">输出文件名</param>
/// <param name="columnNameList">导出的列的列名数组</param>
/// <param name="headers">导出的列标题数组</param>
/// <param name="exportFormat">导出文件的格式</param>
/// <param name="encoding">编码</param>
public void Export(string fileName, string[] columnNameList, string[] headers, ExportFormat exportFormat, Encoding encoding)

{
DataTable dt = GetDataTable();

Helper.Common.Export(dt, columnNameList, headers, exportFormat, fileName, encoding);
}


/**//// <summary>
/// 获取数据源(DataTable)
/// </summary>
private DataTable GetDataTable()

{
DataTable dt = null;

if (this._dataSourceObject is DataTable)
dt = (DataTable)this._dataSourceObject;
else if (this._dataSourceObject is DataSet)
dt = ((DataSet)this._dataSourceObject).Tables[0];
else
throw new InvalidCastException("若要导出SmartGridView,应保证其数据源为DataTable或DataSet类型");

if (dt == null)
throw new ArgumentNullException("数据源", "数据源不能为NULL");

return dt;
}
}
}

/*正式版的实现 结束*/
/*测试版的实现 开始*/
介绍
把GridView导出为一个Excel文件算是一个经常要用到的功能,也比较简单,我们来扩展一个GridView以实现这样的功能。
控件开发
1、新建一个继承自GridView的类。

/**//// <summary>
/// 继承自GridView
/// </summary>
[ToolboxData(@"<{0}:SmartGridView runat='server'></{0}:SmartGridView>")]
public class SmartGridView : GridView


{
}
2、重写OnRowCommand,以实现把GridView导出为Excel的功能

/**//// <summary>
/// OnRowCommand
/// </summary>
/// <param name="e"></param>
protected override void OnRowCommand(GridViewCommandEventArgs e)

{
if (e.CommandName.ToLower() == "exporttoexcel")

{
System.Web.HttpContext.Current.Response.ClearContent();
// e.CommandArgument用“;”隔开两部分,左边的部分为导出Excel的文件名称
System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + e.CommandArgument.ToString().Split(';')[0] + ".xls");
System.Web.HttpContext.Current.Response.ContentType = "application/excel";

System.IO.StringWriter sw = new System.IO.StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);

// e.CommandArgument用“;”隔开两部分,右边的部分为需要隐藏的列的索引(列索引用“,”分开)
if (e.CommandArgument.ToString().Split(';').Length > 1)

{
foreach (string s in e.CommandArgument.ToString().Split(';')[1].Split(','))

{
int i;

if (!Int32.TryParse(s, out i))

{
throw new ArgumentException("需要隐藏的列的索引不是整数");
}

if (i > this.Columns.Count)

{
throw new ArgumentOutOfRangeException("需要隐藏的列的索引超出范围");
}

this.Columns[i].Visible = false;
}
}

// 隐藏“导出Excel”按钮
((Control)e.CommandSource).Visible = false;

// 如果HeaderRow里的控件是button的话,则把它替换成文本
foreach (TableCell tc in this.HeaderRow.Cells)

{
// TableCell里的每个Control
foreach (Control c in tc.Controls)

{
// 如果控件继承自接口IButtonControl
if (c.GetType().GetInterface("IButtonControl") != null && c.GetType().GetInterface("IButtonControl").Equals(typeof(IButtonControl)))

{
// 如果该控件不是“导出Excel”按钮则把button转换成文本
if (!c.Equals(e.CommandSource))

{
tc.Controls.Clear();
tc.Text = ((IButtonControl)c).Text;
}
}
}
}

// 将服务器控件的内容输出到所提供的 System.Web.UI.HtmlTextWriter 对象中
this.RenderControl(htw);

System.Web.HttpContext.Current.Response.Write(sw.ToString());
System.Web.HttpContext.Current.Response.End();
}

base.OnRowCommand(e);
}

控件使用
添加这个控件到工具箱里,然后拖拽到webform上,在GridView内加一个按钮,把CommandName属性设置为“ExportToExcel”,CommandArgument属性的值用“;”做分隔符分为两部分,左边的部分为导出Excel的文件名称,右边的部分为需要隐藏的列的索引(列索引用“,”分开)
ObjData.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.ComponentModel;


/**//// <summary>
/// OjbData 的摘要说明
/// </summary>
public class OjbData


{
public OjbData()

{
//
// TODO: 在此处添加构造函数逻辑
//
}

[DataObjectMethod(DataObjectMethodType.Select, true)]
public DataTable Select()

{
DataTable dt = new DataTable();
dt.Columns.Add("no", typeof(string));
dt.Columns.Add("name", typeof(string));

for (int i = 0; i < 30; i++)

{
DataRow dr = dt.NewRow();
dr[0] = "no" + i.ToString().PadLeft(2, '0');
dr[1] = "name" + i.ToString().PadLeft(2, '0');

dt.Rows.Add(dr);
}

return dt;
}
}

Default.aspx

<%
@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>SmartGridView测试</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<yyc:SmartGridView ID="SmartGridView1" runat="server" AutoGenerateColumns="False"
DataSourceID="ObjectDataSource1">
<Columns>
<asp:TemplateField ItemStyle-Width="50px">
<headertemplate>
<asp:Button id="btnExportToExcel" runat="server" Text="Excel" CommandName="ExportToExcel" CommandArgument="ExcelFileName;5,6" />
</headertemplate>
<itemtemplate>

<%
# Container.DataItemIndex + 1 %>
</itemtemplate>
</asp:TemplateField>
<asp:BoundField DataField="no" HeaderText="序号" SortExpression="no" ItemStyle-Width="100px" />
<asp:BoundField DataField="name" HeaderText="名称" SortExpression="name" ItemStyle-Width="100px" />
<asp:BoundField DataField="no" HeaderText="序号" SortExpression="no" ItemStyle-Width="100px" />
<asp:BoundField DataField="name" HeaderText="名称" SortExpression="name" ItemStyle-Width="100px" />
<asp:BoundField DataField="no" HeaderText="序号" SortExpression="no" ItemStyle-Width="100px" />
<asp:BoundField DataField="name" HeaderText="名称" SortExpression="name" ItemStyle-Width="100px" />
</Columns>
</yyc:SmartGridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="Select"
TypeName="OjbData"></asp:ObjectDataSource>
</div>
</form>
</body>
</html>

注:为了防止出错要在.cs代码中加上下面这句
public override void VerifyRenderingInServerForm(Control control)

{

}
另外,如果你的GridView中含有命令按钮的话要在.aspx页面的头部中加上下面这个属性
EnableEventValidation="false"
/*测试版的实现 结束*/
OK
[源码下载]
Feedback
我刚做了个用datatable导出Excel的功能,但还是以对话框的形式找开,问是保存还是打开的,这种方法可能不能在showModalDialog窗口模式导出。
如果传到新的页面里导出,能把datatable转过去吗?还是在新页面重新select一次啊?
我用C#.NET写了个系统,目前能简单地把datagrid中的数据导出为Excel格式。但是,我想按企业要求的格式导出,例如页眉有企业名称,页脚有联系人,该怎么办啊?通宵在线等,急!!!请邮qiaohui@gdqy.edu.cn。叩谢!
@ivw
我试了,可以在showModalDialog窗口模式中导出
如果传到新的页面里导出,那就在新页面重新select一次,或者用session之类的传值
@老刘
简单的生成excel的方法就是把一个table转成excel,因为大家其实都是表格,只要你能用在网页中用table展现的就能Response出相应的excel
如果需要一些高级应用可以在项目中引入Excel的对象库Excel9.olb,也可以把它转成dll引入,然后对excel进行操作即可
详细的请参看
http://www.microsoft.com/downloads/details.aspx?familyid=401878B1-E03A-4FDC-8079-4344D574313B&displaylang=en
提供的示例程序
我想在Render里的层下面加多一个分页栏,但不知为什么定义的控件事件不能调用,是什么原因啊?
private ImageButton imb = new ImageButton();
Label la = new Label();
la.CssClass = "t_label";
writer.Write("<span>");
la.Text = "总页数:"+pageCount+"";
la.RenderControl(writer);
imb.RenderControl(writer);
imb.Click += new ImageClickEventHandler(imb_Click);
writer.write("</span>");
大概是这样,后面定义了imb_click的事件,但不知为什么在运行时不能调用这事件。
@ivw
我也不晓得你为啥导不出啊
你是要重写GridView的分页吗?那应该重写OnRowCreated
下个礼拜我会把分页重写一遍发上来的,你可以参考一下
重写已经做好了,没问题,我是想在层的下面加多一个,这样就不怕滚动时看不到分页栏了。
@ivw
那就把分页写到GridView的外面,不就好了
是啊,我想在Render里的层下面加多一个分页栏,但是不知为什么里面的按钮调用不了事件
@ivw
用不了是因为Render就管呈现啊
要加事件的话要在OnRowCreated里加啊
那我想把新的分页栏放到层的下面啊,不是在Page里啊。在OnRowCreated里添加一样可以吗?
@ivw
如果想增加事件处理的话,肯定要写在OnRowCreated里的
还是不太明白你想实现什么效果?
你不是在gridview外面加了一个层吗?如果在校准的分页栏(Page)里自定义分页,那么你就要把滚动条拉到最下面才能看到分页栏,我是想在层的外面新加一条分页栏,就不用滚动到最下面才能看到分页啦。这不是更方便吗?
@ivw
ok 明白
那就需要把分页写到GridView的外面
因为为了实现冻结列和冻结行,我把整个GridView都包含到一个<div>下了
是啊,如果不加滚动,冻结就变得没意义了,所以我开始问你的就是这个问题,新定义一个分页栏放到div下面,再加上首页,上一页,等功能,但我自己做的就是能加上这些,就是加上的按钮不能执行定义的事件。Q有上线吗?我发给你看看
@ivw
现在我这里q和msn都上不去啊,不知道啥问题
如果没理解错,你想实现的就是GridView的自定义分页的功能
google or baidu一下
gridview自定义分页
有好多信息
查过,没找到想要的,你有做过在div外面加一条分页栏吗?
这个看过啊,如果在后台写自定义分页就很简单,但如果把这功能集成到你这个gridview控件里就出现我刚问你的问题了。
@ivw
如果想写成控件的话,不要放到GridView里
而是要单独再开发一个分页控件
@ivw
放在div外就意味着要放在GridView外,所以应该是两个控件,等我把这个GridView扩展写完后,打算再写一个分页控件,到时候你可以参考一下
但我看到过一些封好的grid控件,分页都是在滚动条外面的。而且他们都是集成在一个控件,还有就是不用另外拉个数据源出来,我想已经集成了。不知用什么办法实现的呢?你有试过吗?
@ivw
没见过阿,不过应该是重新开发的grid控件吧,而不是从DataGrid或GridView扩展出来的吧
这个不清楚了,但有些不用数据源直接拉控件进来能用的自定义grid不知道是不是把数据源控件也加进去呢?
@ivw
不用数据源控件,至少也要有数据源阿,就是DataSet或DataTable之类的这些实现了IListSource、IEnumerable或ICollection接口的类的实例,然后绑定到grid控件
@ivw
我没有啊,我所想到的办法就只有再做一个分页控件,而且我觉得把分页功能单独做成一个控件比较好,通用性高,能Bind的控件就可以使用分页控件,另外如果分页控件是基于存储过程的话,效率也会很高的。
我昨天做了个分页的控件,不过不是用存储过程的。你下会做一个用存储过程的好吗?好让大家做个参考。
请问你知道怎样把ObjectDataSource之类的控件或gridview的DataSource转成一个datatable吗
我发现用ObjectDataSource做数据源时同一个sql语句执行了12次,为什么呢?
@ivw
把数据源转成DataTable?那要看是什么数据源了,数据源要是DataSet,DataTable就好说了,要是其他的就遍历一下数据源然后赋值给你新建的DataTable里
“我发现用ObjectDataSource做数据源时同一个sql语句执行了12次”
我没这问题呀,是不是你多次绑定了?
我现在用的方法是,把ObjectDataSourceg再Select()一次来保存成datatable,觉得这方法不太好。
会出现多次绑定的吗?我在代码里没进行过绑定啊?我在page_load里没写过代码啊,在监视器发现他执行了12次,中断看也是一样。
@ivw
我这里做的是ObjectDataSource的select指向一个返回datatable的方法,所以直接调这个方法就可以了
不晓得你的是什么问题啊,我这里只是一次
你有中断看过吗?
我在数据源里加了个参数。
<SelectParameters>
<asp:Parameter DefaultValue="select * from test" Name="sqltxt" />
</SelectParameters>
但我在中断里看他执行select() 12次,真不知什么原因
@ivw
你用SqlDataSource吗?我只用ObjectDataSource,不过我觉得应该不会执行12次的
我也是用ObjectDataSource啊。
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="Select"
TypeName="OjbData" OnSelected="ObjectDataSource1_Selected">
<SelectParameters>
<asp:Parameter DefaultValue="select * from test" Name="sqltxt" />
</SelectParameters>
</asp:ObjectDataSource>
@ivw
我不明白为什么会有这句DefaultValue="select * from test"
难道你中间层的select方法里用sql语句做参数?
这个是默认的sql语句啊,sqltxt是名,我在select(string sql)加了个变量,用来改变控件绑定的sql数据啊?这有问题?
@ivw
:)
我记得园子里是有人翻译的,你可以搜一下
@ivw
感觉像是,仔细看看那篇系列教程吧,写得很好
我在另一个页面用gridview显示数据,把头部设置成excel格式
可以导出,但数据少这个excel文件可以打开,但数据一多,就显示“读取文件失败”,这是为什么呢,老郁闷了!!
Response.Clear();
Response.Buffer = true;
Response.Charset = "utf-8";
Response.AppendHeader("Content-Disposition", "attachment;filename=AddValueExport.xls");
Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
Response.ContentType = "application/ms-excel";
你好,我按照你的方法设置,但是总是报错
说“必须放在具有 runat=server 的窗体标记内”
行 831:
行 832: // 将服务器控件的内容输出到所提供的 System.Web.UI.HtmlTextWriter 对象中
行 833: this.RenderControl(htw);
行 834:
行 835: System.Web.HttpContext.Current.Response.Write(sw.ToString());
请问是什么原因呢?
谢谢
@吾爱乐乐
是这样的
为了防止出错要在.cs代码中加上下面这句
public override void VerifyRenderingInServerForm(Control control)
{
}
另外,如果你的GridView中含有命令按钮的话要在.aspx页面的头部中加上下面这个属性
EnableEventValidation="false"
为什么我的数据源应用的是objectdatasource,但是在导出excel表的时候,提示说“若要导出SmartGridView,应保证其数据源为DataTable或DataSet类型”不知道,为什么会有这个错误,我现在公布我的代码如下:aspx代码如下
<form id="form1" runat="server">
<div style="margin: 5px 0px">
<asp:Button ID="btnExcel" runat="server" Text="导出为Excel" CommandName="ExportExcel"
OnCommand="btn_Command" />
<asp:Button ID="btnWord" runat="server" Text="导出为Word" CommandName="ExportWord" OnCommand="btn_Command" />
<asp:Button ID="btnText" runat="server" Text="导出为Text" CommandName="ExportText" OnCommand="btn_Command" />
</div>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="dt" TypeName="objds">
</asp:ObjectDataSource>
<yyc:SmartGridView ID="sgv1" runat="server" AllowSorting="True" DataSourceID="ObjectDataSource1">
</yyc:SmartGridView>
</form>
aspx.cs代码如下:
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btn_Command(object sender, CommandEventArgs e)
{
switch (e.CommandName)
{
case "ExportExcel":
sgv1.Export("excel");
break;
case "ExportWord":
sgv1.Export("word", YYControls.ExportFormat.DOC);
break;
case "ExportText":
sgv1.Export("text", YYControls.ExportFormat.TXT);
break;
}
}
public override void VerifyRenderingInServerForm(Control control)
{
}
版主,帮我看看吧。
@nbshiny
要先绑定,再导出
或者看看我提供的几个方法
YYControls.Helper.Common类下的
Export(DataTable dt, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, string[] headers, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataSet ds, string[] headers, string[] fields, ExportFormat exportFormat, string fileName, Encoding encoding)
传进DataTable就可以导出
怎样用.net导出word文档,并且,格式不变,导出之后的word文档上的label控件都隐藏起来!
我也遇到象 nbshiny 的导出错误/
你说看
YYControls.Helper.Common类下的
Export()的方法,就是说要我们修改以下按纽的传递参数吗?
protected void btn_Command(object sender, CommandEventArgs e)
{
switch (e.CommandName)
{
case "ExportExcel":
sgv1.Export("excel");
break;
case "ExportWord":
sgv1.Export("word", YYControls.ExportFormat.DOC);
break;
case "ExportText":
sgv1.Export("text", YYControls.ExportFormat.TXT);
break;
}
}
为什么一定要用objectdatasource控件吗?
我这样子在后面绑定数据,好象那些导出文档不行.
this.SmartGridView1.DataSource = ds.Tables[0];
this.SmartGridView1.DataBind();
@chong
要先绑定,才能导出,因为是全数据集导出,如果不绑定就不知道数据源
如果不想绑定的话就用我提供的相关方法,把数据源传进去
不是要修改按钮的传递参数,而是要修改导出的方法
将导出的方法替换成我在YYControls.Helper.Common类中提供的用于导出的方法
基于分页、排序之类的功能是需要数据源控件支持的
导出这块可以不用数据源控件
建议你做导出的时候用YYControls.Helper.Common类中的关于导出的方法
--引用--------------------------------------------------
webabcd: @chong
要先绑定,才能导出,因为是全数据集导出,如果不绑定就不知道数据源
如果不想绑定的话就用我提供的相关方法,把数据源传进去
不是要修改按钮的传递参数,而是要修改导出的方法
将导出的方法替换成我在YYControls.Helper.Common类中提供的用于导出的方法
基于分页、排序之类的功能是需要数据源控件支持的
导出这块可以不用数据源控件
建议你做导出的时候用YYControls.Helper.Common类中的关于导出的方法
--------------------------------------------------------
楼主,你好,我刚学.net不久,还不太看的懂,现在需要一个dataset导出到excel方法,你能单独提供自这么一个方法吗?谢谢
正式版中导出excel很完美,很想学习这个方法,就是不懂得如何从这个例子里提炼出拉来,楼主帮帮忙啦
@jeems
YYControls.Helper.Common类下的
Export(DataTable dt, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, string[] headers, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataSet ds, string[] headers, string[] fields, ExportFormat exportFormat, string fileName, Encoding encoding)
楼主你好,我想把gridview的数据导出文本文件,字段之间用逗号分开,就是不懂得如何从这个例子里提炼出拉来,楼主帮帮忙啦
谢谢
@yxb
在YYControls.Helper.Common类里已经封装好了,拿出来就可以用
楼主 关于数据源的问题,如果GridView的数据源不用数据源控件,而是在后台代码里用代码绑定,那如何在是控件里能获得数据源 再导出Excel呢?
楼主 关于数据源的问题,如果GridView的数据源不用数据源控件,而是在后台代码里用代码l来绑定,那如何在是控件里能获得数据源 再导出Excel呢?
@libai
可以使用
YYControls.Helper.Common类下的
Export(DataTable dt, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, string[] headers, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataSet ds, string[] headers, string[] fields, ExportFormat exportFormat, string fileName, Encoding encoding)
这几个方法
谢谢楼主,不过这几个方法首先要获得数据源,我现在在获得数据源有点问题,因为不是用数据源控件来给GridView绑定,而是在后台方法里给GridView指定DataSource,再DataBind(),不用这段代码ObjectDataSource ods = this.Parent.FindControl(this.DataSourceID) as ObjectDataSource;
那么现在的问题就是获得不到数据源,刚开始学控件开发,可能这些细节不了解,有时间给点建议,谢谢!
@libai
肯定是要知道数据源的,不然怎么导呢
既然能绑定GridView,那你肯定就是知道数据源的
楼主,请问下啊:
为什么我绑定后在<Columns>。。</Columns>中指定了显示字段后,后面会把这个绑定的表中的数据再重复显示一次呢?
能不能把后面重复显示的去掉呢?
@℡农夫三拳㊣
设置
AutoGenerateColumns="false"
楼主:我遇到有这么一个问题:
我将GridView控件放到ajax中的updatepanel中,发现导出excel不可用,可能是由于response.write在ajax中不兼容,所以,我将导出按钮放在updatepanel外,但是点击导出时,GridView控件的_dataSourceObject为null,但是我在Page_load事件中将他的datasource进行赋值后就可以了,是不是控件的datasource每次刷新页面就没有了?
另外,在ajax中不能导出excel有什么好的解决办法?谢谢!!
@6224409
是的,要先绑定,才能导出
或者直接用方法
YYControls.Helper.Common类下的
Export(DataTable dt, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, string[] headers, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataSet ds, string[] headers, string[] fields, ExportFormat exportFormat, string fileName, Encoding encoding)
ajax的问题
可以把导出按钮放在UpdatePanel外
我的问题是为什么非得把绑定放在Page_load事件里才行,难道每次刷新,控件的datasource都为NULL了?
@6224409
不一定要在Page_Load啊
只要先绑定再导出即可,否则找不到数据源
楼主幸苦了,写的很非常的好,好很实用
你的实例运行都好用,但是我写的和你一样
唯一一个功能导出 一运行就错误
“ 若要导出SmartGridView,应保证其数据源为DataTable或DataSet类型”
可是我的ObjectDataSource 指向的也是DataTable类型
不是到是为什么?
上面我说错了
private DataTable GetDataTable()
{
DataTable dt = null;
if (this._dataSourceObject is DataTable)
我这是的this._dataSourceObject一直是null
可是我的ObjectDataSource 指向的也是DataTable类型
这是为什么呢
希望楼主帮助 谢谢
@徐.百川
从你提供的信息中看不出来啊
你可以一步一步跟一下程序,看看问题到底出在哪
另外,如果是用导出excel的话
可以用如下的方法即可
YYControls.Helper.Common类下的
Export(DataTable dt, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataTable dt, int[] columnIndexList, string[] headers, ExportFormat exportFormat, string fileName, Encoding encoding)
Export(DataSet ds, string[] headers, string[] fields, ExportFormat exportFormat, string fileName, Encoding encoding)
请教个问题,你的导出方法中,为什么要替换掉那些特殊字符??
input = input.Replace(" ", "_x0020_")
.Replace("%", "_x0025_")
.Replace("#", "_x0023_")
.Replace("&", "_x0026_")
.Replace("/", "_x002F_");
谢谢。
@holyrong
这个导出是通过xslt转换xml得出的
所以要替换掉xml特殊字符
再问个导出的问题:
如果导出的数据中有些是数字前面有0的怎么处理。
导出的csv文件用记事本打开是有0的,但用excel打开后就没有了,设置excel当列为 文本 也看不到 0.
@holyrong
以我所知csv文件的规则就是,每格都不能以"0"开头
所以没办法了。。。
@holyrong
昨天做梦,突然想到了
可以不导出csv,而是导出xls,然后设置样式
"<style> .text { mso-number-format:\@; } </script>"
即可
导出的EXCEL没有网格线的?怎样才能显示网格线呢?
@kevinzhan
csv是没有的
需要导出xls,导入命名空间xmlns:x="urn:schemas-microsoft-com:office:excel",有太多的功能了
google一下有很多结果的
请问楼主,为什么我在webform里使用导出excl,if (dt == null) 总是提示
转换错误,dt没有值啊,但是我已经成功返回并显示数据了啊
@菜鸟向往肉鸡
是要导出dt的内容吗,他要是null,肯定不会导出来的,除非你的数据源不是dt
查了下,webform里控件绑定的数据源返回完数据并显示之后,就被释放掉了。。