[转]asp.net导出数据到Excel的三种方法
原文出處:asp.net導出數據到Excel的幾種方法(1/3) 、asp.net導出數據到Excel的幾種方法(2/3)、asp.net導出數據到Excel的幾種方法(3/3)?
asp.net導出到Excel也是個老生常談的問題,在此歸納一下。
第一種是比較常用的方法。是利用控件的RenderControl功能,得到該控件生成的HTML,然后以Excel文件的類型輸出到客戶端。這種方法生成的其實是個HTML文件,只不過Excel支持HTML格式,所以使用起來似乎和真正的Excel文件沒什么兩樣,但它終究不是Excel格式,它不能當作數據源供其他程序調用。
這種實現起來比較簡單,就不多述,請看代碼。
???public??void?ExportExcel(?System.Web.UI.WebControls.WebControl?objControl,?string?strFileName)????????...{
?????????????
????????????strFileName?=?System.Web.HttpUtility.UrlEncode(strFileName,?System.Text.Encoding.UTF8);
????????????
???????????
????????????System.Web.HttpContext.Current.Response.Clear();
????????????System.Web.HttpContext.Current.Response.Buffer?=?true;
????????????System.Web.HttpContext.Current.Response.Charset?=?"gb2312";
????????????System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition",?"online;?filename="?+?strFileName?+?".xls");
????????????System.Web.HttpContext.Current.Response.ContentEncoding?=?System.Text.Encoding.GetEncoding("gb2312");
????????????System.Web.HttpContext.Current.Response.ContentType?=?"application/ms-excel";
????????????
????????????System.Globalization.CultureInfo?myCItrad?=?new?System.Globalization.CultureInfo("zh-CN",?true);
????????????System.IO.StringWriter?oStringWriter?=?new?System.IO.StringWriter(myCItrad);
????????????System.Web.UI.HtmlTextWriter?oHtmlTextWriter?=?new?System.Web.UI.HtmlTextWriter(oStringWriter);
???????????
????????????objControl.RenderControl(oHtmlTextWriter);
??????????
????????????objControl?=?null;
????????????System.Web.HttpContext.Current.Response.Write(oStringWriter.ToString().Replace("<td",?"<td?STYLE='MSO-NUMBER-FORMAT:\@'"));
????????????System.Web.HttpContext.Current.Response.Buffer?=?false;
????????????System.Web.HttpContext.Current.Response.End();
????????}
?
可能出現的錯誤:
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 ,進入組件服務設置界面,如圖:
打到Micorosoft Excel應用程序,如圖:
右鍵點擊屬性,然后點擊“安全”,將“啟動和激活權限”、“訪問權限”、“配置權限”都選擇自定義,然后添加運行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的代碼,功能較簡單,權當拋磚引玉了。
?
?
??this.GridView1.DataBind();????Excel.ApplicationClass?oExcel?=?new?Excel.ApplicationClass();
???object?oMissing??=?System.Reflection.Missing.Value;
????????????
???oExcel.Workbooks.Add(oMissing);
???Excel.Workbook?oBook?=?oExcel.Workbooks[1];
???Excel.Worksheet?oSheet?=?(Excel.Worksheet)oBook.Sheets[1];
???oSheet.Name?=?this.Title;
???????????
???Excel.Range?rg;
???for?(int?j?=?0;?j?<?this.GridView1.HeaderRow.Cells.Count;?j++)
??{
??????rg?=?((Excel.Range)oSheet.Cells[?1,?j?+?1]);
??????rg.FormulaR1C1?=?this.GridView1.HeaderRow.Cells[j].Text;
????}
????for(int?i?=?0;i<this.GridView1.Rows.Count;i++)
??{
??????for?(int?j?=?0;?j?<?this.GridView1.Rows[0].Cells.Count;?j++)
????{
???????rg?=?((Excel.Range)oSheet.Cells[i?+?2,?j+1]);
???????rg.FormulaR1C1?=?this.GridView1.Rows[i].Cells[j].Text;
??????}
????}
????rg?=?null;
????string?VirFileName?=?Guid.NewGuid().ToString()?+?".xls";
????oBook.SaveAs(Server.MapPath(VirFileName),?Excel.XlFileFormat.xlExcel9795,?oMissing,?oMissing,?oMissing,?oMissing,?Excel.XlSaveAsAccessMode.xlExclusive,
????oMissing,?oMissing,?oMissing,?oMissing,?oMissing);
????oExcel.Workbooks.Close();
????oExcel.Quit();
???????????
????oSheet?=?null;
????oBook?=?null;
????oExcel?=?null;
?????GC.Collect();
?????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創建一個工作表,否則只需使用已有的表進操作就可以了。
DataTable?dt?=?new?DataTable();???dt.Columns.Add("name");
???dt.Columns.Add("age",?typeof(int));
???dt.Columns.Add("phone");
???dt.Rows.Add("老張",?40,"99213812");
???dt.Rows.Add("小李",?28,"a21313");
???dt.Rows.Add("小王",?22,"2131434");
???string?FileName?=?Guid.NewGuid().ToString()+".xls";
???string?sNewFullFile?=?Server.MapPath(FileName);
???try
???{
???????File.Copy(Server.MapPath("format.xls"),?sNewFullFile);
????}
????catch?(Exception?er)
????{
??????????Response.Write(er.Message);
??????????return;
????}
????string?strConn?=?"Provider=Microsoft.Jet.OLEDB.4.0;Persist?Security?Info=True;Data?Source="?+?sNewFullFile?+?";Extended?Properties=Excel?8.0;";
????System.Data.OleDb.OleDbConnection?conn?=?new?System.Data.OleDb.OleDbConnection(strConn);
????OleDbCommand?cmd?=?null;
????bool?bRet?=?false;
????try
????{
???????conn.Open();
???????cmd??=?new?OleDbCommand("create?table?[sheet4]([姓名]?Text,[年齡]?int,[電話]?Text)",conn);
???????cmd.ExecuteNonQuery();
???????string?strSQL?=?"INSERT?INTO?[Sheet4$]?([姓名],?[年齡],[電話])?VALUES?(?,??,??)";
???????cmd?=?new?OleDbCommand(strSQL,?conn);
???????for?(int?i?=?0;?i?<?3;?i++)
???????{
??????????cmd.Parameters.Add(i.ToString(),?OleDbType.VarChar);
???????}
???????DataView?dv?=?dt.DefaultView;
???????foreach?(DataRowView?row?in?dv)
???????{
????????????cmd.Parameters[0].Value?=?row["name"].ToString();
????????????cmd.Parameters[1].Value?=(int)?row["age"];
????????????cmd.Parameters[2].Value?=?row["phone"].ToString();
????????????cmd.ExecuteNonQuery();?????????????????????
???????}
???????bRet?=?true;
????}
????catch?(Exception?er)
????{
????????Response.Write(er.Message);
????}
?????finally
?????{
???????if?(cmd?!=?null)
???????{
??????????cmd.Dispose();
???????}
??????????conn.Dispose();
???????}
???????if(bRet)
?????????Response.Redirect(FileName);
?
標簽: Asp.Net, Excel 綠色通道:好文要頂關注我收藏該文與我聯系總結
以上是生活随笔為你收集整理的[转]asp.net导出数据到Excel的三种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用JavaScript制作星星金字塔
- 下一篇: centos 升级php5.5_Cent