来源:http://www.cnblogs.com/lishengpeng1982/archive/2008/04/03/1135490.html
原文出处:http://blog.csdn.net/cpp2017/article/details/2244368
asp.net导出到Excel也是个老生常谈的问题,在此归纳一下。
第一种是比较常用的方法。是利用控件的RenderControl功能,得到该控件生成的HTML,然后以Excel文件的类型输出到客户端。这种方法生成的其实是个HTML文件,只不过Excel支持HTML格式,所以使用起来似乎和真正的Excel文件没什么两样,但它终究不是Excel格式,它不能当作数据源供其他程序调用。
这种实现起来比较简单,就不多述,请看代码。
1 public void ExportExcel( System.Web.UI.WebControls.WebControl objControl, string strFileName) 2 { 3 4 strFileName = System.Web.HttpUtility.UrlEncode(strFileName, System.Text.Encoding.UTF8); 5 6 7 8 System.Web.HttpContext.Current.Response.Clear(); 9 System.Web.HttpContext.Current.Response.Buffer = true; 10 System.Web.HttpContext.Current.Response.Charset = "gb2312"; 11 System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "online; filename=" + strFileName + ".xls"); 12 System.Web.HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312"); 13 System.Web.HttpContext.Current.Response.ContentType = "application/ms-excel"; 14 15 System.Globalization.CultureInfo myCItrad = new System.Globalization.CultureInfo("zh-CN", true); 16 System.IO.StringWriter oStringWriter = new System.IO.StringWriter(myCItrad); 17 System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter); 18 19 objControl.RenderControl(oHtmlTextWriter); 20 21 objControl = null; 22 System.Web.HttpContext.Current.Response.Write(oStringWriter.ToString().Replace("<td", "<td STYLE='MSO-NUMBER-FORMAT:\@'")); 23 System.Web.HttpContext.Current.Response.Buffer = false; 24 System.Web.HttpContext.Current.Response.End(); 25 }
可能出现的错误:
1、只能在执行 Render() 的过程中调用 RegisterForEventValidation;
解决办法:修改页面选项<%@ Page EnableEventValidation = "false"
还有一种办法是修改web.config的,但影响全局,这里就不推荐了。
2...必须放在具有 runat=server 的窗体标记内。
解决办法:
在页面中重写VerifyRenderingInServerForm方法,不对控件要求form容器进行验证
public override void VerifyRenderingInServerForm(Control control)
{
//这里没有内容。
}
第二种方法是利用Excel的Com接口库来完成,这种方法的优点是功能强大,可像使用Excel程序一样来操作Excel文件,缺点是需要服务器安装Excel程序,且需要一定的安全配置。
一、准备工作:
1)安装Microsoft Excel
2)Com的安全设置。
在命令行输入DCOMCNFG ,进入组件服务设置界面,如图:
右键点击属性,然后点击“安全”,将“启动和激活权限”、“访问权限”、“配置权限”都选择自定义,然后添加运行ASP.NET的用户(IIS6以上是NETWORK SERVICE以下是ASPNET),给予全部权限,如图所示:
3)配置文件目录权限,因为可能要保存文件到某目录中,所以要将该目录对ASP.NET用户予以写入权限。
二、使用
在VS.NET的工程中添加引用,如图:
如果添加引用后Excel组件不能正常使用(excel组件的左边显示一个黄色的感叹号),可以使用.Net工具进行组件转换。
转换方法,运行vs.net的命令行工具,进入Office目录,输入TlbImp Excel.exe即可,然后删除有问题的引用重新添加引用,这次使用浏览,然后引用Excel.DLL。
根据我的经验,vs2003可以直接引用Microsoft Excel x.0 ObjectLibary,而vs2005就需要使用工具转换成DLL才可使用。
然后即可以使用Excel.Application对象来操作它了。
以下就一段简单的将GirdView的数据导出到Excel的代码,功能较简单,权当抛砖引玉了。
1 this.GridView1.DataBind(); 2 3 Excel.ApplicationClass oExcel = new Excel.ApplicationClass(); 4 object oMissing = System.Reflection.Missing.Value; 5 6 oExcel.Workbooks.Add(oMissing); 7 Excel.Workbook oBook = oExcel.Workbooks[1]; 8 Excel.Worksheet oSheet = (Excel.Worksheet)oBook.Sheets[1]; 9 oSheet.Name = this.Title; 10 11 Excel.Range rg; 12 13 for (int j = 0; j < this.GridView1.HeaderRow.Cells.Count; j++) 14 { 15 rg = ((Excel.Range)oSheet.Cells[ 1, j + 1]); 16 rg.FormulaR1C1 = this.GridView1.HeaderRow.Cells[j].Text; 17 } 18 19 for(int i = 0;i<this.GridView1.Rows.Count;i++) 20 { 21 for (int j = 0; j < this.GridView1.Rows[0].Cells.Count; j++) 22 { 23 rg = ((Excel.Range)oSheet.Cells[i + 2, j+1]); 24 rg.FormulaR1C1 = this.GridView1.Rows[i].Cells[j].Text; 25 } 26 } 27 rg = null; 28 29 string VirFileName = Guid.NewGuid().ToString() + ".xls"; 30 oBook.SaveAs(Server.MapPath(VirFileName), Excel.XlFileFormat.xlExcel9795, oMissing, oMissing, oMissing, oMissing, Excel.XlSaveAsAccessMode.xlExclusive, 31 oMissing, oMissing, oMissing, oMissing, oMissing); 32 oExcel.Workbooks.Close(); 33 oExcel.Quit(); 34 35 oSheet = null; 36 oBook = null; 37 oExcel = null; 38 39 GC.Collect(); 40 41 Response.Redirect(VirFileName);
说明一下:为了Excel进程在使用完成后能彻底退出,需要将所有对象在使用完成后清空,像代码中的rg,oSheet,oBook,oExcel等。
第三种方法是利用OELDB数据访问对象操作Excel文件,达到将数据导出到Excel的目的,这种方法可能用的人不太多,缺点是必须有一个存在的Excel文件。优点是服务器不需要安装Excel,且生成的Excel是标准的Excel格式可以当作数据源使用。
准备工作:
1)先用准备一个Excel文件,这个Excel文件可以是空的,或是有一定格式的当做数据模板使用。
2)将操作的目录给ASP.NET用户(ASPNET 或NETWORK SERVICE)写入权限。
以下是示例:
说明一下:如果这个模板文件是个空文件,则需要使用Create Table创建一个工作表,否则只需使用已有的表进操作就可以了。
1 DataTable dt = new DataTable(); 2 dt.Columns.Add("name"); 3 dt.Columns.Add("age", typeof(int)); 4 dt.Columns.Add("phone"); 5 dt.Rows.Add("老张", 40,"99213812"); 6 dt.Rows.Add("小李", 28,"a21313"); 7 dt.Rows.Add("小王", 22,"2131434"); 8 9 10 string FileName = Guid.NewGuid().ToString()+".xls"; 11 12 string sNewFullFile = Server.MapPath(FileName); 13 try 14 { 15 File.Copy(Server.MapPath("format.xls"), sNewFullFile); 16 } 17 catch (Exception er) 18 { 19 Response.Write(er.Message); 20 return; 21 } 22 string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=True;Data Source=" + sNewFullFile + ";Extended Properties=Excel 8.0;"; 23 System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(strConn); 24 OleDbCommand cmd = null; 25 26 bool bRet = false; 27 try 28 { 29 conn.Open(); 30 cmd = new OleDbCommand("create table [sheet4]([姓名] Text,[年龄] int,[电话] Text)",conn); 31 cmd.ExecuteNonQuery(); 32 string strSQL = "INSERT INTO [Sheet4$] ([姓名], [年龄],[电话]) VALUES (?, ?, ?)"; 33 cmd = new OleDbCommand(strSQL, conn); 34 for (int i = 0; i < 3; i++) 35 { 36 cmd.Parameters.Add(i.ToString(), OleDbType.VarChar); 37 } 38 DataView dv = dt.DefaultView; 39 foreach (DataRowView row in dv) 40 { 41 cmd.Parameters[0].Value = row["name"].ToString(); 42 cmd.Parameters[1].Value =(int) row["age"]; 43 cmd.Parameters[2].Value = row["phone"].ToString(); 44 cmd.ExecuteNonQuery(); 45 } 46 bRet = true; 47 } 48 catch (Exception er) 49 { 50 Response.Write(er.Message); 51 } 52 finally 53 { 54 if (cmd != null) 55 { 56 cmd.Dispose(); 57 } 58 conn.Dispose(); 59 } 60 if(bRet) 61 Response.Redirect(FileName);