gridview数据导出到Excel的研究

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

GridView Export the Excel (Basic Code):
首先看一个基础的应用。创建一个表格,见截图

单击显示全图,Ctrl+滚轮缩放图片

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


单击显示全图,Ctrl+滚轮缩放图片

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

单击显示全图,Ctrl+滚轮缩放图片


Exporting GridView to Excel With Style:


您是否注意到了以上代码存在一些的问题?是的,ID列开头的0都被截去了。如果你的ID是000345,导出后就编程了345。这个问题可以通过把css添加到输出流中来解决。为了使ID列正确显示,您需要将其储存为文本格式。Excel中的文本格式表示为"mso-number-format:"/@"。
复制 保存
protected void Btn_ExportClick(object sender, EventArgs e)
{
    string style = @"<style> .text { mso-number-format:/@; } </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");
    }
}

修改的结果如下:
单击显示全图,Ctrl+滚轮缩放图片


Exporting GridView With LinkButtons and Paging:


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

单击显示全图,Ctrl+滚轮缩放图片


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

通过修改页文件可以修正这个问题:EnableEventValidation = "false".
看一下导出的文件

单击显示全图,Ctrl+滚轮缩放图片

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


我写了一个DisableControls函数,用使循环的方法将linkbutton和dropdownlist替换成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]);
        }
    }
}

方法非常简单,只需将linkbuton和dropdownlist替换成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中就只剩下选中文本了

单击显示全图,Ctrl+滚轮缩放图片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值