将GridView导入到Excel和word完全可实现Word格式文档下载.docx
《将GridView导入到Excel和word完全可实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《将GridView导入到Excel和word完全可实现Word格式文档下载.docx(11页珍藏版)》请在冰点文库上搜索。
//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
htmlxmlns="
//www.w3.org/1999/xhtml"
>
headrunat="
server"
<
title>
将Gridview导出到Excel,Word<
/title>
/head>
body>
formid="
form1"
runat="
div>
asp:
GridViewID="
GridView1"
AllowPaging="
True"
AutoGenerateColumns="
False"
CellPadding="
4"
DataKeyNames="
stuid"
DataSourceID="
SqlDataSource1"
ForeColor="
#333333"
GridLines="
None"
FooterStyleBackColor="
#5D7B9D"
Font-Bold="
White"
/>
Columns>
BoundFieldDataField="
HeaderText="
编号"
InsertVisible="
ReadOnly="
SortExpression="
stuname"
姓名"
CheckBoxFieldDataField="
stusex"
性别"
stuaddress"
地址"
stuage"
年龄"
stutuition"
学费"
stuaveragescore"
成绩"
/Columns>
RowStyleBackColor="
#F7F6F3"
EditRowStyleBackColor="
#999999"
SelectedRowStyleBackColor="
#E2DED6"
PagerStyleBackColor="
#284775"
HorizontalAlign="
Center"
HeaderStyleBackColor="
AlternatingRowStyleBackColor="
/asp:
GridView>
/div>
SqlDataSourceID="
ConnectionString="
%$ConnectionStrings:
myTestGridViewConnectionString%>
"
SelectCommand="
SELECT*FROM[stu]"
SqlDataSource>
ButtonID="
Button1"
Text="
导出到Excel"
OnClick="
Button1_Click"
br/>
Button2"
Button2_Click"
导出到Word"
Width="
108px"
/form>
/body>
/html>
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Collections;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingSystem.IO;
publicpartialclass将GridView导出到Excel_excel:
System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
publicvoidExportToExcel(stringFileType,stringFileName)
Response.Charset="
GB2312"
;
Response.ContentEncoding=System.Text.Encoding.UTF8;
Response.AppendHeader("
Content-Disposition"
"
attachment;
filename="
+HttpUtility.UrlEncode(FileName,System.Text.Encoding.UTF8).ToString());
Response.ContentType=FileType;
this.EnableViewState=false;
StringWritertw=newStringWriter();
HtmlTextWriterhw=newHtmlTextWriter(tw);
GridView1.RenderControl(hw);
Response.Write(tw.ToString());
Response.End();
//导出到Excel
protectedvoidButton1_Click(objectsender,EventArgse)
ExportToExcel("
application/ms-excel"
"
学生信息.xls"
);
//导出到Word
protectedvoidButton2_Click(objectsender,EventArgse)
学生信息.doc"
//ExportToExcel("
application/ms-word"
//都可以
//这个事件必须加
publicoverridevoidVerifyRenderingInServerForm(Controlcontrol)
}
当然上面的这些东东也是我从CSDN上面学来的,有一篇是看的青青月儿的,还有一篇,忘了是谁的啦,反正挺感谢的。
2.重载VerifyRenderingInServerForm
今天在做一个AjaxPro的应用时,VerifyRenderingInServerForm给我带来了麻烦,在网上找了找,发现大多数人的解决方法就是重载VerifyRenderingInServerForm,然后让它什么也不做。
public
override
void
VerifyRenderingInServerForm(Control
control)
//base.VerifyRenderingInServerForm
(control);
这样做的确解决了我遇到的问题,但我看帮助对这个方法的说明,强调没有必要不要重写。
备注
如果该页当前不处于页处理中的呈现阶段,且位于
form
runat=server>
标记内,则该方法将引发异常。
需要位于服务器窗体内的控件可以在呈现期间调用该方法,以便在它们被放置到外面时显示明确的错误信息。
发送回或依赖于注册的脚本块的控件应该在
Control.Render
方法的重写中调用该方法。
呈现服务器窗体元素的方式不同的页可以重写该方法以在不同的条件下引发异常。
如果回送或使用客户端脚本的服务器控件没有包含在
HtmlForm
服务器控件
(<
runat="
)
中,它们将无法正常工作。
这些控件可以在呈现时调用该方法,以在它们没有包含在
控件中时提供明确的错误信息。
开发自定义服务器控件时,通常在为任何类型的输入标记重写
Render
方法时调用该方法。
这在输入控件调用
GetPostBackEventReference
或发出客户端脚本时尤其重要。
复合服务器控件不需要作出此调用。
除非要创建替换页框架,否则请不要重写此方法。
于是我跟踪了一下,发现页面的每个服务器端控件都会执行这个方法,结合我自己的实际情况,做了点小修改
if
(!
control.GetType().Name.Equals("
DataGridLinkButton"
))
base.VerifyRenderingInServerForm
因为我需要在AjaxMethod中获得一个控件的HTML输出到画面上,而这个控件是我new出来的,显然不可能在<
formrunat=server>
标记内,于是我就加了个判断,虽然还是没有做到十全十美(就是如果画面上本来就有的DataGridLinkButton也不做验证了。
)但感觉比起直接把base方法调用注释掉还是合情合理些。
木野狐对这个问题也有篇文章描述了下。
3.Page.VerifyRenderingInServerForm返回什么,怎样结合他确定是否将自定义控件写到页面上?
saucer(思归)回复于2004-12-0909:
09:
38
try
to
override
AddAttributesToRender,
for
example,
this
is
how
it
done
with
LinkButton
if
you
use
Reflector
see
the
implementation:
protected
void
AddAttributesToRender(HtmlTextWriter
writer)
{
(this.Page
!
=
null)
this.Page.VerifyRenderingInServerForm(this);
}
base.AddAttributesToRender(writer);
....
}
包含自定义控件GridView如何导出到Excel
作者:
陆地
时间:
2009-01-15
我们常常会用到GridView导出到Excel的功能,我之前也有一些文章做了介绍。
可以参考的文章:
GridView导出到Excel和开源图表工具
GridView导出为Excel后,导出的.xls文件无法作为源文件导入的问题
今天有人问我,如果Girdview模板列里使用了自定义控件,那导出的时候如何处理?
比如该自定义控件包含一个Dropdownlist和三个Label控件,其中用来在页面上显示数据的是其中一个Label控件,现在的问题是,如果不在PrepareControlForExport()中对该自定义控件进行处理,那么导出的Excel文件的对应Gridview中使用了自定义控件的列的内容全部相同(为Dropdownlist控件的第一个Item),但是对该自定义控件进行处理的话,不知道该如何才能正确的取出它的值(用来显示的label中的值),试图无法把自定义控件转换成Dropdowlist和Label中的任何一种,但强制转换的话运行到该语句会报错。
我们首先来看看在GridView导出到Excel和开源图表工具提到的导出工具中的开发,源文件可以在这里下载:
ExportGridViewtoExcel
在GridViewExportUtil.cs中,函数PrepareControlForExport是这样的:
1///<
summary>
2///Replaceanyofthecontainedcontrolswithliterals
3///<
/summary>
4///<
paramname="
control"
/param>
5privatestaticvoidPrepareControlForExport(Controlcontrol)
6{
7for(inti=0;
i<
control.Controls.Count;
i++)
8{
9Controlcurrent=control.Controls[i];
10if(currentisLinkButton)
11{
12control.Controls.Remove(current);
13control.Controls.AddAt(i,newLiteralControl((currentasLinkButton).Text));
14}
15elseif(currentisImageButton)
16{
17control.Controls.Remove(current);
18control.Controls.AddAt(i,newLiteralControl((currentasImageButton).AlternateText));
19}
20elseif(currentisHyperLink)
21{
22control.Controls.Remove(current);
23control.Controls.AddAt(i,newLiteralControl((currentasHyperLink).Text));
24}
25elseif(currentisDropDownList)
26{
27control.Controls.Remove(current);
28control.Controls.AddAt(i,newLiteralControl((currentasDropDownList).SelectedItem.Text));
29}
30elseif(currentisCheckBox)
31{
32control.Controls.Remove(current);
33control.Controls.AddAt(i,newLiteralControl((currentasCheckBox).Checked?
:
));
34}
35
36if(current.HasControls())
37{
38GridViewExportUtil.PrepareControlForExport(current);
39}
40}
41}
这一段代码是遍历传入control的所有子control,对于每一个子control,根据子control的类型生成一个LiteralControl,并用这个LiteralControl代替当前的子control。
对于LinkBtton,使用它的文本代替,对于ImagaButton,是使用它的Alternate文本代替。
函数针对LinkButton,ImageButton,HyperLink,DropDwonList,CheckBox做了处理,如果当前控件不是这其中的任何一种,就判断是否有子控件,并递归调用。
回到我们之前的问题,如果GridView中有一个自定义的控件,那我们怎么办?
其实解决的办法就按原思路来就可以,判断是不是自定义控件,使用某种方式把这个自定义控件中的某个希望导出的文本信息读取出,转换为一个Literalcontrol就可以。
我们可以写一个函数来处理这种比较复杂的情况,示范代码如下:
42elseif(currentisMyWebController)
43{
44control.Controls.Remove(current);
45control.Controls.AddAt(i,GetLiteralController(current));
46}
至于GetLiteralControler的写法,可以遍历自定义控件中的所有子控件,根据控件的特点,比如位置,ID选定一个控件,转换为Literal控件并返回。
本文是个随笔,记录了一下思路,没有进行实际检验,如果问题,还请大家指出,逐步充实。