• [转]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);
  • 相关阅读:
    性能测试理论知识
    接口测试笔试题
    测试计划与测试报告
    java基础面试题
    软件测试人员必备的linux命令
    tomcat各目录(文件)作用
    常见的面试题
    LoadRunner中怎么设置密码参数化与用户名关联
    数据库索引总结(二)
    数据库索引总结(一)
  • 原文地址:https://www.cnblogs.com/lishengpeng1982/p/1135490.html
Copyright © 2020-2023  润新知