该文记录了asp.net里头如何将DataTable中的数据导出为Excel表格,这里的做法是通过一个iframe指向下载页,当选择导出时,将DataTable数据以Session的方式传给iframe指向的下载页面,然后原页面只要刷新该iframe即可.下面就以实例说明
假定有两个页面data.aspx和download.aspx
1.添加iframe至data.aspx页面,该iframe默认不指向任何页面
3.需要一个刷新ifame的javascript方法提供给下载按钮调用
假定有两个页面data.aspx和download.aspx
1.添加iframe至data.aspx页面,该iframe默认不指向任何页面
<iframe id="downPage" height="0px" width="0px" frameborder="0" src=""></iframe>
2.data.aspx有个触发下载的服务器端按钮,下面是该按钮事件:Session["ExportTable"] = dtNewSource;
Page.ClientScript.RegisterStartupScript(GetType(), "", "<script>RefIframe();</script>");
注:dtNewSource为需要导出的数据源,为DataTable类型Page.ClientScript.RegisterStartupScript(GetType(), "", "<script>RefIframe();</script>");
3.需要一个刷新ifame的javascript方法提供给下载按钮调用
<script type="text/javascript">
function RefIframe() {
document.getElementsByTagName("iframe")[0].src = "/ContactsManage/Pages/exportData.aspx";
}
</script>
4.当按钮事件被触发后,download.aspx页面需要接收数据function RefIframe() {
document.getElementsByTagName("iframe")[0].src = "/ContactsManage/Pages/exportData.aspx";
}
</script>
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Session["ExportTable"] != null)
{
DataTable dataList = Session["ExportTable"] as DataTable;
ExportExcel("联系人详细信息", dataList);
}
}
}
5.上面的方法中有调用到一个名为ExportExcel的方法,这就是导出数据的核心方法了,代码如下:{
if (!IsPostBack)
{
if (Session["ExportTable"] != null)
{
DataTable dataList = Session["ExportTable"] as DataTable;
ExportExcel("联系人详细信息", dataList);
}
}
}
public void ExportExcel(string fileName, DataTable dataSource)
{
System.Web.UI.WebControls.GridView dgExport = null;
//当前对话
System.Web.HttpContext curContext = System.Web.HttpContext.Current;
//IO用于导出并返回excel文件
System.IO.StringWriter strWriter = null;
System.Web.UI.HtmlTextWriter htmlWriter = null;
if (dataSource != null)
{
//设置编码和附件格式
curContext.Response.Clear();
curContext.Response.Buffer = true;
//System.Web.HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8)作用是方式中文文件名乱码
curContext.Response.AddHeader("content-disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) + ".xls");
curContext.Response.ContentType = "application/vnd.ms-excel";
//解决输出的内容为乱码问题
curContext.Response.Write("<meta http-equiv=Content-Type content=text/html;charset=UTF-8>");
//导出Excel文件
strWriter = new System.IO.StringWriter();
htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter);
//为了解决dgData中可能进行了分页的情况,需要重新定义一个无分页的GridView
dgExport = new System.Web.UI.WebControls.GridView();
dgExport.DataSource = dataSource;
dgExport.AllowPaging = false;
dgExport.DataBind();
//下载到客户端
dgExport.RenderControl(htmlWriter);
curContext.Response.Write(strWriter.ToString());
curContext.Response.End();
}
}
需要说明一点的是download.aspx是一个空页面,只不过这个页面载入时如果data.aspx传过来的不是空值,那么就提供下载.
{
System.Web.UI.WebControls.GridView dgExport = null;
//当前对话
System.Web.HttpContext curContext = System.Web.HttpContext.Current;
//IO用于导出并返回excel文件
System.IO.StringWriter strWriter = null;
System.Web.UI.HtmlTextWriter htmlWriter = null;
if (dataSource != null)
{
//设置编码和附件格式
curContext.Response.Clear();
curContext.Response.Buffer = true;
//System.Web.HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8)作用是方式中文文件名乱码
curContext.Response.AddHeader("content-disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) + ".xls");
curContext.Response.ContentType = "application/vnd.ms-excel";
//解决输出的内容为乱码问题
curContext.Response.Write("<meta http-equiv=Content-Type content=text/html;charset=UTF-8>");
//导出Excel文件
strWriter = new System.IO.StringWriter();
htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter);
//为了解决dgData中可能进行了分页的情况,需要重新定义一个无分页的GridView
dgExport = new System.Web.UI.WebControls.GridView();
dgExport.DataSource = dataSource;
dgExport.AllowPaging = false;
dgExport.DataBind();
//下载到客户端
dgExport.RenderControl(htmlWriter);
curContext.Response.Write(strWriter.ToString());
curContext.Response.End();
}
}