对于大量的数据,有时候导出到Excel中将更加方便进行数据统计分析,而对于排版打印则导出到World文档中更加方便。在ASP.NET可以通过少量代码实现这两种导出。
新建一页面,该页面布局Html源码如下:
<form id="form1" runat="server"><div> <asp:Button ID="cmdOpen" runat="server" Text="在线打开" CommandName="open" OnCommand="Button_Click" /> <asp:Button ID="cmdSave" runat="server" Text="本地保存" CommandName="save" OnCommand="Button_Click" /> <asp:DropDownList ID="listType" runat="server"> <asp:ListItem Value="excel">Excel</asp:ListItem> <asp:ListItem Value="word">Word</asp:ListItem> </asp:DropDownList><br /> <br /> 数据源:<br /> <br /> <asp:GridView ID="myGW" runat="server"> </asp:GridView> </div></form>
这里没有什么特别的,只需要注意在线打开与本地保存两个按钮通过CommandName进行检验并触发相应的动作,DropDownList控件存放了可以导出的格式,可以自己添加如txt、html等格式。准备工作就绪以后,可以进行代码的书写,以完成我们需要的功能:
protected void Page_Load(object sender, EventArgs e) { FillGridView(); } private void OutPut(string fileType, string strType) { Response.Clear(); Response.Buffer = true; Response.Charset = "GB2312"; Response.AppendHeader("Content-Disposition", fileType); Response.ContentType = strType; this.EnableViewState = false; System.IO.StringWriter swOut = new System.IO.StringWriter(); HtmlTextWriter hTw = new HtmlTextWriter(swOut); myGW.RenderControl(hTw); Response.Write(swOut.ToString()); Response.End(); } protected void Button_Click(object sender, CommandEventArgs e) { switch (e.CommandName) { case "save": switch (listType.SelectedValue) { case "excel": OutPut("attachment;filename=out.xls", "application/ms-excel"); break; case "word": OutPut("attachment;filename=out.doc", "application/ms-word"); break; } break; case "open": switch (listType.SelectedValue) { case "excel": OutPut("online;filename=out.xls", "application/ms-excel"); break; case "word": OutPut("online;filename=out.doc", "application/ms-word"); break; } break; } } public override void VerifyRenderingInServerForm(Control control) { } private void FillGridView() { string strConn = "server=localhost//sqlexpress;database=Northwind;user id=sa;password=sa123"; SqlConnection conn = new SqlConnection(strConn); SqlCommand comm = new SqlCommand(); comm.Connection = conn; string strSql = "select * from Categories"; comm.CommandText = strSql; conn.Open(); this.myGW.DataSource = comm.ExecuteReader(); this.myGW.DataBind(); conn.Close(); }
在以上的程序中,最主要的就是函数OutPut(string fileType, string strType),它完成导出或在线打开的动作,这里接受两个参数其中fileType指定是保存或在线打开,并且指名了文件的名字如:attachment;filename=out.xls(作为附件保存,文件名为out.xls)、online;filename=out.xls(在线打开);strType指定了带出文档的格式如application/ms-excel。
注意如果想要导出GridView中的数据并且要我们的程序顺利执行,则必须重写VerifyRenderingInServerForm(Control control),否则会报错的。
如果我们想要将整个页面导出到Excel中,则不需要重写VerifyRenderingInServerForm,只需要将OutPut函数中的myGW.RenderControl(hTw)改为this.RenderControl(hTw)就可以了。