一种将GridView的内容导出到Excel中的方法

360影视 2025-01-06 22:10 3

摘要:让我们从基础的导出方法开始。首先,我们需要用一些数据填充GridView。我创建了一个自定义的数据表,它包含了多个字段。你可以在下面的截图中看到。

让我们从基础的导出方法开始。首先,我们需要用一些数据填充GridView。我创建了一个自定义的数据表,它包含了多个字段。你可以在下面的截图中看到。

现在,下一步的任务是使用数据库中的数据来填充GridView。试一试下面的代码,它使用DataSet来填充GridView。

privatevoid 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现在已经填充了数据。接下去的任务就是将GridView导出到Excel。你可以在button的click事件中使用下面的代码。

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;

你同时还要重载VerifyRenderingInServerForm方法。参照下面的代码。

publicoverridevoid VerifyRenderingInServerForm(Control control)

{

}

当你点击Export to Excel按钮之后,将会弹出一个对话框让你选择打开或者是保存导出的文件。选择打开文件,你会看到导出的数据显示在Excel的页面中。看一看下面的截图,它显示了GridView已导出到Excel中。

注意以下注意(我今天运行代码时报错,报了以下错误)

当用GridView导出Execl的时候,会发生只能在执行 Render 的过程中调用 RegisterForEventValidation的错误提示。
有两种方法可以解决以上问题:
1.修改web.config(不推荐)


2.直接在导出Execl的页面修改

CodeFile="ExportGridView.aspx.cs" Inherits="ExportGridView" %>

你有没有发现上面导出代码的问题?对了,开头的0都被截去了。这表示如果ID是000345,它会显示为345。你可以在输出的数据流中添加CSS描述来解决该问题。为了能正确的显示ID列,你要把它存储为文本。文本格式在Excel中用“mso-number-format:"\@”来表示。只要你知道了这个格式,你就可以将这个样式添加到输出的数据流中。看看下面的代码吧。

protectedvoid Btn_ExportClick(object sender, EventArgs e)

{

string style = @" .text { mso-number-format:\@; } ";

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;

}

{

}

正如你在上面的代码中所看到的,我使用字符串变量“style”来存放GridView中列的样式。同时,我使用Response.Write方法来将样式写入到输出流中。最后你要做的就是将样式添加到ID列。这可以在GridView控件的RowDataBound事件中完成。

protectedvoid gvUsers_RowDataBound(object sender, GridViewRowEventArgs e)

{

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

{

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

}

}


现在,当你导出GridView到Excel,该文件的内容会类似于下图。

查看表格栏的样式

你打开导出后的Excel文件就可以轻而易举的找到GridView中数据栏的正确样式。现在点击标题栏并选择“设置单元格格式”,它将显示一些参数用来格式化单元格。选择“文本”并把文件保存为.htm文件。现在,用浏览器打开这个Web文件,然后查看它的源文件。你会在样式段落发现不同的单元格所对应的样式。使用查找功能定位到ID栏。你将发现类似于下面的一行内容:

ID

正如你所看到上面的单元格使用样式类.x127。现在转到样式部分,找到.x127。

1.xl27

3{mso-style-parent:style0;

5font-weight:700;

7mso-number-format:"\@";

9text-align:center;
10
11vertical-align:middle;
12
13border:.5pt solidblack;
14
15white-space:normal;}
16
17

当你找到.x127样式之后,你会发现单元格格式定义为:mso-number-format:"\@"

当你尝试导出包含带链接按钮与分页功能的GridView时,大概会看到下列错误:

你可以转到该页面的源代码中,将EnableEventValidation改为false,这样即可解决该问题。

现在,让我们来看看导出的文件:

和你看到的一样,LinkButton与DropDownList控件也和GridView一起导出了。虽然DropDownList也能正确的显示用户的选项,但是它在Excel中并不好看。所以,让我们看看如何来显示选中的文本并去除DropDownList。

我创建了一个简单的方法:DisableControls,它遍历了GridView中的控件,并用Literal控件代替LinkButton与DropDownList控件。

privatevoid DisableControls(Control gv)

{

LinkButton lb = new LinkButton;

Literal l = new Literal;

string name = String.Empty;

for (int i = 0; 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);

}

elseif (gv.Controls[i].GetType == typeof(DropDownList))
24

{

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

if (gv.Controls[i].HasControls)

{

DisableControls(gv.Controls[i]);

}

}

}

这个方法很简单,用Literal控件来替换所有的LinkButton和DropDownList控件,并把它们的选择内容赋给Literal控件的Text属性。你必须在导出之前调用该方法。

1protectedvoid Btn_ExportExcelPaging(object sender, EventArgs e)
2{

4DisableControls(gvUsers);

6Response.ClearContent;

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

10Response.ContentType = "application/excel";
11
12StringWriter sw = new StringWriter;
13
14HtmlTextWriter htw = new HtmlTextWriter(sw);
15
16gvUsers.RenderControl(htw);
17
18Response.Write(sw.ToString);
19
20Response.End;
21
22}

最后,当你导出GridView时,只会看到选中的文本内容。看一看下面的截图所显示的效果。

来源:未来之星教育

相关推荐