zoukankan      html  css  js  c++  java
  • GridView导出Excel研究

    GridView导出Excel研究

    Introduction:

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

    GridView Export the Excel (Basic Code): 

    .

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

    <!--[if !vml]--> <!--[if !vml]-->


    <!--[endif]--> 

    然后将数据库中的数据绑定到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();

    }

    <!--[if !vml]-->
    <!--[endif]--> <!--[if !vml]--><!--[endif]-->

    现在,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的结果如下图:

    <!--[if !vml]-->
    <!--[endif]--> <!--[if !vml]--><!--[endif]-->

    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");

    }

    }

     修改的结果如下:

    <!--[if !vml]--><!--[endif]--> <!--[if !vml]-->
    <!--[endif]-->


    Exporting GridView With LinkButtons and Paging: 

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

    <!--[if !vml]--><!--[endif]--> <!--[if !vml]-->
    <!--[endif]-->

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

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

    看一下导出的文件

    <!--[if !vml]-->
     

    在导出的文件中可以看见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中就只剩下选中文本了

    <!--[if !vml]-->
    <!--[endif]--> <!--[if !vml]--><!--[endif]-->

  • 相关阅读:
    hibernate框架的搭建与简单实现增删改
    $.ajax();详解
    利用json实现数据传输
    利用ajax实现数据传输
    错误:Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp;的解决
    简单使用jstl实现敏感字替换
    实用jstl实现未登录时不能绕过登录界面的效果
    简单实用jstl实现“登录|注册”
    简单实用jstl实现代码编写
    简单使用EL进行标签的替换
  • 原文地址:https://www.cnblogs.com/tangself/p/1653853.html
Copyright © 2011-2022 走看看