zoukankan      html  css  js  c++  java
  • 关于ASP.NET 将数据导出成Excel 的总结[上]

    关于ASP.NET 将数据导出成Excel 的总结[上]

     

    由于项目需要,必须实现将ASP.NET 中的网格数据或者数据集中的数据导出成Excel 文件。

     

     在博客园里寻找了一阵子,发现几篇不错的文章:

    A. 林子的“Excel读写管理类库ExcelManager” 对Excel文件的读写不错

        ExcelManager -- 基于.Net的Excel读写管理类库(一)

        ExcelManager--基于.Net的Excel读写管理类库(二)

    B. henry基于EXCEL 的WEB 报表输出组件 也不错,

        只是IE的安全设置不允许运行未标记为安全的activeX控件,需要更改IE的安全设置。

    C. 如果只是将页面“网格控件”当前页所显示的数据导出成Excel 文件,那GridView 导出Excel 研究 非常不错了。

    全文如下:

    =========================================================================================

    GridView导出Excel研究

     

    Introduction:

    GridView中的数据导出为Excelweb应用中的常见功能。在不同的应用场景下有不同的导出技术。在本文中我将介绍一些导出的技术,希望对您有所帮助

    GridView Export the Excel (Basic Code): 

     

    首先看一个基础的应用。创建一个表格,见截图

     

    然后将数据库中的数据绑定到GridView中的数据,代码如下:

    private void BindData()

    {

    SqlConnection myConnection = new SqlConnection("Server=localhost;Database=School;Trusted_Connection=true");

    SqlDataAdapter ad = new SqlDataAdapter("SELECT * FROM Users", myConnection);

    DataSet ds = new DataSet();

    ad.Fill(ds);

    gvUsers.DataSource = ds;

    gvUsers.DataBind();

    }


     

    现在,GridView中已经绑定了数据,接下来的任务就是导出到Excel。下面是button事件中的代码

    Response.ClearContent();

    Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");

    Response.ContentType = "application/excel";

    StringWriter sw = new StringWriter();

    HtmlTextWriter htw = new HtmlTextWriter(sw);

    gvUsers.RenderControl(htw);

    Response.Write(sw.ToString());

    Response.End();

     

    并且还需要override一下VerifyRenderingInServerForm方法(这一点非常重要,否则在点击按钮后会报错,译者注)代码如下:

    public override void VerifyRenderingInServerForm(Control control)

    {

    }

     

    点击导出按钮后会弹出对话框,询问您打开或保存。选择打开文件,导出到Excel的结果如下图:


    Exporting GridView to Excel With Style:

    您是否注意到了以上代码存在一些的问题?是的,ID列开头的0都被截去了。如果你的ID000345,导出后就编程了345。这个问题可以通过把css添加到输出流中来解决。为了使ID列正确显示,您需要将其储存为文本格式。Excel中的文本格式表示为"mso-number-format:"\@"

    protected void Btn_ExportClick(object sender, EventArgs e)

    {

    string style = @"<style> .text { } </script> ";

    Response.ClearContent();

    Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");

    Response.ContentType = "application/excel";

    StringWriter sw = new StringWriter();

    HtmlTextWriter htw = new HtmlTextWriter(sw);

    gvUsers.RenderControl(htw);

    // Style is added dynamically

    Response.Write(style);

    Response.Write(sw.ToString());

    Response.End();

    }

    public override void VerifyRenderingInServerForm(Control control)

    {

    }

     在上面的代码中,我通过”style”变量来控制GridView列的样式。并通过Respnose.Write方法将其添加到输出流中。最后把样式添加到ID列。这一步需要在RowDataBound事件中完成

    protected void gvUsers_RowDataBound(object sender, GridViewRowEventArgs e)

    {

    if (e.Row.RowType == DataControlRowType.DataRow)

    {

    e.Row.Cells[1].Attributes.Add("class", "text");

    }

    }

     修改的结果如下:


     

    Exporting GridView With LinkButtons and Paging: 

     

    如果要导出的GridView中包含LinkButton或者分页(出现分页码时,译者注) 则将出现错误:


    通过修改页文件可以修正这个问题:EnableEventValidation = "false".

    <%@ Page Language="C#" EnableEventValidation="false" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

    看一下导出的文件


     

    在导出的文件中可以看见linkbuttondropdownlist控件,虽然dropdownlist控件显示的数据的确是用户所选的项,但怎么看也不像是一个导出文件(我倒是觉的挺cool的:)译者注),现在应如何移除dropdownlist并显示选择的文字呢?

     
    我写了一个
    DisableControls函数,用使循环的方法将linkbuttondropdownlist替换成literal控件

    private void DisableControls(Control gv)

    {

    LinkButton lb = new LinkButton();

    Literal l = new Literal();

    string name = String.Empty;

    for (int i = 0; i < gv.Controls.Count; i++)

    {

    if (gv.Controls[i].GetType() == typeof(LinkButton))

    {

    l.Text = (gv.Controls[i] as LinkButton).Text;

    gv.Controls.Remove(gv.Controls[i]);

    gv.Controls.AddAt(i, l);

    }

    else if (gv.Controls[i].GetType() == typeof(DropDownList))

    {

    l.Text = (gv.Controls[i] as DropDownList).SelectedItem.Text;

    gv.Controls.Remove(gv.Controls[i]);

    gv.Controls.AddAt(i, l);

    }

     

    if (gv.Controls[i].HasControls())

    {

    DisableControls(gv.Controls[i]);

    }

    }

    }

     

    方法非常简单,只需将linkbutondropdownlist替换成literal控件,并将选择项赋值给literal控件的文本属性。该方法需要在导出前调用

    protected void Btn_ExportExcelPaging(object sender, EventArgs e)

    {

    DisableControls(gvUsers);

    Response.ClearContent();

    Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");

    Response.ContentType = "application/excel";

    StringWriter sw = new StringWriter();

    HtmlTextWriter htw = new HtmlTextWriter(sw);

    gvUsers.RenderControl(htw);

    Response.Write(sw.ToString());

    Response.End();

    }

     

    现在的Excel中就只剩下选中文本了


     

    原文:http://gridviewguy.com/ArticleDetails.aspx?articleID=197

    代码下载:GridViewExportToExcelAllYouNeed.zip

    作者: XuGang   网名:钢钢
    出处: http://xugang.cnblogs.com
    声明: 本文版权归作者和博客园共有!转载时必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    topcoder srm 320 div1
    topcoder srm 325 div1
    topcoder srm 330 div1
    topcoder srm 335 div1
    topcoder srm 340 div1
    topcoder srm 300 div1
    topcoder srm 305 div1
    topcoder srm 310 div1
    topcoder srm 315 div1
    如何统计iOS产品不同渠道的下载量?
  • 原文地址:https://www.cnblogs.com/stevenjson/p/2454607.html
Copyright © 2011-2022 走看看