标签:
之前做过winfrom程序的导出excel文件的功能,感觉非常简单。现在试着做asp.net中导出excel的功能,之前用的是Microsoft.Office.Interop.Excel这个对象来实现数据导出excel,在asp.net上完全被它给恶心到了。首先是不能弹出保存对话框,然后又是在代码执行到Microsoft.Office.Interop.Excel.Application myexcel = new Microsoft.Office.Interop.Excel.Application();这一句的时候,莫名其妙的不动了,这个问题在调试的时候没有出现,在发布后才出来了,后来找到一个方法给解决了,就是中配置文件的<system.web>下添加<identity impersonate="true" userName="administrator" password="0"/>,其中的用户名和密码就是本机的用户名和密码。这个问题解决之后,又遇到了令人痛苦的SaveAs保存异常,错误提示是:Exception from HRESULT: 0x800A03EC。在网上找遍了资料,都没能解决问题。不得已,只好尝试其他的导出excel的方案了。
下面的方案才是我最想要的,就简单明了的介绍一下:
首先是建一个web页,里面就一个按钮用来实现导出excel,代码如下:
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script type="text/javascript"> //Excel DownLoad function excelExport() { // var hidText = document.getElementById("hidParam"); // hidText.value = "some params"; document.getElementById("ExcelOutput").click(); } </script> </head> <body> <form id="form1" runat="server"> <input type="button" value="EXCEL下载" style="width:100px;" onclick="excelExport()" id="excelBut" /> <%--<input id="hidParam" type="text" runat="server" style="display:none;"/> --%> <asp:Button runat="server" ID="ExcelOutput" style="display:none" Text= "EXCEL出力" Width="0px" onclick="btnExcel_Click" UseSubmitBehavior="false"/> <asp:GridView ID="gvExcel" runat="server" Height="95px" Visible="False"></asp:GridView> </form> </body> </html>
其中注释掉部分可以用于向后台代码传递你想要的数据。
后台代码如下:
public partial class WebForm2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnExcel_Click(object sender, EventArgs e) { string strExcelName = "MyExcel.xls"; strExcelName = strExcelName.Replace(@"/", ""); DataTable dt = new DataTable(); DataColumn dc = null; dc = dt.Columns.Add("编号", Type.GetType("System.Int32")); dc = dt.Columns.Add("产品", Type.GetType("System.String")); dc = dt.Columns.Add("版本", Type.GetType("System.String")); dc = dt.Columns.Add("描述", Type.GetType("System.String")); DataRow dr = dt.NewRow(); dr["编号"] = 1; dr["产品"] = "这个地方是单元格的值"; dr["版本"] = "2.0"; dr["描述"] = "这个地方是单元格的值"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["编号"] = 2; dr["产品"] = "这个地方是单元333格的值"; dr["版本"] = "3.0"; dr["描述"] = "这个地方是单元格的33值"; dt.Rows.Add(dr); gvExcel.Visible = true; gvExcel.DataSource = null; gvExcel.DataSource = dt; gvExcel.DataBind(); ExportToExcel(this.Page, gvExcel, strExcelName); } public void ExportToExcel(System.Web.UI.Page page, GridView excel, string fileName) { try { foreach (GridViewRow row in excel.Rows) { for (int i = 0; i < row.Cells.Count; i++) { excel.HeaderRow.Cells[i].BackColor = System.Drawing.Color.Yellow; } } excel.Font.Size = 10; excel.AlternatingRowStyle.BackColor = System.Drawing.Color.LightCyan; excel.RowStyle.Height = 25; //page.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); //如果出现中文乱码,就用这句 page.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName); page.Response.Charset = "utf-8"; page.Response.ContentType = "application/vnd.ms-excel"; page.Response.Write("<meta http-equiv=Content-Type content=text/html;charset=utf-8>"); excel.Page.EnableViewState = false; excel.Visible = true; excel.HeaderStyle.Reset(); excel.AlternatingRowStyle.Reset(); System.IO.StringWriter oStringWriter = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter); excel.RenderControl(oHtmlTextWriter); page.Response.Write(oStringWriter.ToString()); page.Response.End(); excel.DataSource = null; excel.Visible = false; } catch (Exception e) { } } }
这里为了突出介绍的重点,对于数据的获取就没有介绍了。这里面有个问题,就是当程序执行到
excel.RenderControl(oHtmlTextWriter); 这一句的时候,报了个错:控件必须放在具有 runat=server 的窗体标记内,这个只需要重写方法VerifyRenderingInServerForm就是了。
public override void VerifyRenderingInServerForm(Control control) { // 这个方法必须要的,不然在下面的代码excel.RenderControl(oHtmlTextWriter); 处会报错:控件必须放在具有 runat=server 的窗体标记内 }
之前我中vs2010 中做这个导出功能的时候是没有遇到这个问题的,但是中vs2013 中却遇到了。
好了,这种方式就介绍完了,它的好处就在于没有哪些乱七八糟的异常,同时也会弹出一个提示框用于选择保存的路径。
标签:
原文地址:http://www.cnblogs.com/jin-/p/4683573.html