该文记录了asp.net里头如何将DataTable中的数据导出为Excel表格,这里的做法是通过一个iframe指向下载页,当选择导出时,将DataTable数据以Session的方式传给iframe指向的下载页面,然后原页面只要刷新该iframe即可.下面就以实例说明
假定有两个页面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类型
3.需要一个刷新ifame的javascript方法提供给下载按钮调用
<
script type
=
"
text/javascript
"
>
function
RefIframe() {
document.getElementsByTagName(
"
iframe
"
)[
0
].src
=
"
/ContactsManage/Pages/exportData.aspx
"
;
}
<
/
script>
4.当按钮事件被触发后,download.aspx页面需要接收数据
protected
void
Page_Load(
object
sender, EventArgs e)
{
if
(
!
IsPostBack)
{
if
(Session[
"
ExportTable
"
]
!=
null
)
{
DataTable dataList
=
Session[
"
ExportTable
"
]
as
DataTable;
ExportExcel(
"
联系人详细信息
"
, dataList);
}
}
}
5.上面的方法中有调用到一个名为ExportExcel的方法,这就是导出数据的核心方法了,代码如下:
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传过来的不是空值,那么就提供下载.