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) 一、准备工作: 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等。 准备工作: 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); http://www.cnblogs.com/lishengpeng1982/archive/2008/04/03/1135490.html http://topic.csdn.net/u/20090218/13/b5aad1c4-7556-4169-ad58-4063c4c11b7c.html
报表中的Excel操作之Aspose.Cells(Excel模板) :http://www.cnblogs.com/gczhao/archive/2011/03/21/1990036.html |
asp.net导出数据到Excel的三种方法
最新推荐文章于 2021-12-13 09:23:25 发布