关闭

评论(3/4)编辑删除GridView导出Excel研究

660人阅读 评论(0) 收藏 举报
Introduction:

将GridView中的数据导出为Excel是web应用中的常见功能。在不同的应用场景下有不同的导出技术。在本文中我将介绍一些导出的技术,希望对您有所帮助
GridView Export the Excel (Basic Code): 
.
首先看一个基础的应用。创建一个表格,见截图
<!--[if !vml]--> <!--[if !vml]-->

<!--[endif]-->
然后将数据库中的数据绑定到GridView中的数据,代码如下:
private void BindData()
{
SqlConnection myConnection = new SqlConnection("Server=localhost;Database=School;Trusted_C");
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都被截去了。如果你的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");
}
}
 修改的结果如下:
<!--[if !vml]--><!--[endif]--> <!--[if !vml]-->
<!--[endif]-->
Exporting GridView With LinkButtons and Paging:

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


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

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

看一下导出的文件


 

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




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

代码下载:GridViewExportToExcelAllYouNeed.zip
提供一点小补充:
如果不需要显示其中的部分列,加入一下代码即可
// turn off paging
GridView1.AllowPaging = false;
GridView1.DataBind();
GridView1.Columns[0].Visible = false;
GridView1.Columns[11].Visible = false;



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

Response.ContentType = "application/excel";

这两句改为:
Response.Write("<meta http-equiv=Content-Type content=text/html;charset=gb2312>");
Response.AppendHeader("content-disposition", "attachment;filename=/"" + System.Web.HttpUtility.UrlEncode("中文名", System.Text.Encoding.UTF8) + ".xls/"");
试试,我的中文乱码问题就是这样解决的。不知道你用有没有效? 

 
昨天一个朋友问起如何方便将GridView中的数据导出到EXCEL的问题。发现导出数据也是我们经常会遇到的问题,所以今天把它整理下来,以后寻找/使用时也方便。
1、先在页面中添加一个按钮:
<asp:LinkButton ID="libExcel" runat="server" OnClick="libExcel_Click" >导出Excel</asp:LinkButton>
2、为Gridview绑定数据:
public void BindExpertsData()
    {
        CExpertsInfoCollection xList = cExpertsInfo.Search();

        grdvList.DataKeyNames = new string[] { "ID", "ExpertName" };
        grdvList.DataSource = xList;
        grdvList.DataBind();
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            BindExpertsData();
        }
    }
3、导出数据。在libExcel的单击事件中来完成导出。
protected void libExcel_Click(object sender, EventArgs e)
    {

        Response.Clear();

        Response.AddHeader("content-disposition", "attachment;filename=FileName.xls");
        Response.Charset = "gb2312";
        Response.ContentType = "application/vnd.xls";

        System.IO.StringWriter stringWrite = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);

        grdvList.AllowPaging = false;//导出前先取消分页,以便能将所有数据导出。
        BindExpertsData();//再重新绑定一次数据

        grdvList.RenderControl(htmlWrite);
        Response.Write(stringWrite.ToString());
        Response.End();

        grdvList.AllowPaging = true;//导出后先取消分页,以便能将所有数据导出。
        BindExpertsData();//再重新绑定一次数据
    }
4、重写一个空的VerifyRenderingInServerForm方法。
public override void VerifyRenderingInServerForm(Control control)
    {

            /*以确认在运行时为指定的ASP.NET 控件呈现HtmlForm 控件*/
    }

5、在页面的page属性中加入EnableEventValidation = "false" .如:
<%@ Page Language="C#" AutoEventWireup="true" EnableEventValidation = "false" CodeFile="ExpertsList.aspx.cs" Inherits="ExpertsList" %>
6、注意。
若在GridView中定义了按钮列,在导出可能需要将它隐藏。
 
 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:159977次
    • 积分:2500
    • 等级:
    • 排名:第15291名
    • 原创:63篇
    • 转载:106篇
    • 译文:0篇
    • 评论:38条