原文出处: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的三种方法相关推荐

  1. [转]导出数据到Excel的几种方法

    [转]导出数据到Excel的几种方法 [转]C#导出到EXCEL     [原] http://community.csdn.net/Expert/topic/4570/4570895.xml?tem ...

  2. asp.net服务器端跳转页面的三种方法

    asp.net服务器端跳转页面的三种方法 1.Response.Redirect这个跳转页面的方法跳转速度不快,因为它要走2次回发(postback). 它可以跳转到任何页面,没有站点页面限制(可以由 ...

  3. 芯片数据的差异分析主要包括三种方法 ANCOVA进行差异分析 为何不用deseq2

    Shared Gene Expression Alterations in Schizophrenia and Bipolar Disorder Expression of cilium-associ ...

  4. DataTable数据批量写入数据库三种方法比较

    DataTable数据批量写入数据库三种方法比较 标签: it 分类: C# 1)   insert循环插入: 2)   sqldataadapter.update(dataset,tablename ...

  5. oracle数据迁移过程中,把表中数据导出为txt文件的三种方法

    在数据迁过程中需求需要将oracle数据库数据导出程txt格式然后再导入db2库中,经查询实验汇总三种方法: 1.plsqldev 里面有一个选项可以把表以excel格式到时 2.使用spool sq ...

  6. 监控器sd卡初始化怎么恢复数据?有这三种方法可尝试

    sd卡监控器数据能恢复吗?监控器sd卡初始化怎么恢复数据?如果您的监控器sd卡被初始化(格式化)导致数据丢失,建议立即停止使用sd卡,因为如果您继续使用sd卡,它可能会覆盖您要恢复的数据,导致无法恢复 ...

  7. C++中访问类的私有数据成员的第三种方法

    我们知道,C++的类是有封装性的,那么对于私有数据成员我们如果想在类外访问,一般而言无外乎这么两种方法: 1.通过公有的成员函数 2.通过友元 这是两种通常的做法,还有一种是比较"反常&qu ...

  8. 电脑数据怎么恢复?三种方法值得一试

    电脑数据怎么恢复?我们大多数时候都会用电脑作为我们的最主要的办公工具,那么作为我们一直在使用的办公工具,我们一定会出现一些问题,如果电脑不小心出现了数据丢失的情况,我们该怎么找回呢?以下几种方法我推荐 ...

  9. asp.net导出数据到Excel

    Code  1        Sql数据列表导出到EXCEL#region Sql数据列表导出到EXCEL  2        /**////<summary>  3        /// ...

最新文章

  1. samba srver on centos-7
  2. 如何利用 C# 爬取Gate.io交易所的公告!
  3. Varnish3.0中文入门教程-应用篇2
  4. 自学python要下载什么软件-Python学习需要安装的工具
  5. 华为交换机SSH和telnet登录配置
  6. 小程序中使用threejs
  7. 区分Activity的四种加载模式
  8. 被遗忘的图灵:计算机、神经网络、人工智能……他是这一切之父
  9. linux HZ 值_Linux的serial串口控制台
  10. Spring中AOP的使用
  11. PyCharm编辑器的安装
  12. centos6.5 安装mysql5.6多实例(多配置文件)
  13. 2021年中国电动牙刷市场趋势报告、技术动态创新及2027年市场预测
  14. 【总结】Transformer结构及其9中变体汇总!
  15. Mysql insert without auto-increase when duplicate
  16. 淘客十大常用网站,成为大牛的起点
  17. 华为JAVA编程规范
  18. 计算机的管理选项文件错误,如何修复Microsoft Teams错误文件在Windows PC中被锁定...
  19. 【Linux应用】tftp命令
  20. 一位博士在华为的 22 年

热门文章

  1. jj为什么会变大变小_为什么上过太空的种子果实会变大?射线会让生物向大变异吗?...
  2. linux驱动简单介绍
  3. Sublime text3 代码格式化插件vue
  4. springaop----springaop的使用(一)
  5. redis安装与基本配置
  6. javascript之嵌套函数
  7. 浅谈“三层结构”原理与用意(转帖)
  8. mysql 8.0 一条insert语句的具体执行流程分析(三)
  9. 教你精确计算 I2C 上拉电阻阻值
  10. 为什么大家都只谈薪资,却不谈梦想?