假定有两个页面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();
}
}