轻车熟路
书接上文,如何在使用ExtAspNet控件库的页面将Grid内容导出为Excel文件?

1. 页面声明

    <ext:PageManager ID="PageManager1" runat="server" />Grid Control in ExtAspNet:<ext:Grid ID="Grid1" Title="表格" ShowBorder="true" ShowHeader="true" Width="900px"AutoHeight="true" runat="server" EnableCheckBoxSelect="true" DataKeyNames="Id,Year,MyText"EnableRowNumber="True"><Columns><ext:BoundField DataTooltipField="MyText" Width="200px" DataField="MyText" DataFormatString="{0}"HeaderText="MyText" ExpandUnusedSpace="True" /><ext:BoundField ColumnId="column1" Width="100px" DataField="MyValue" HeaderText="MyValue" /><ext:BoundField Width="60px" DataField="Year" HeaderText="Year" /><ext:CheckBoxField DataTooltipField="MyText" Width="60px" RenderAsStaticField="true"DataField="MyCheckBox" HeaderText="CheckBox" /><ext:HyperLinkField DataTooltipField="MyText" Width="200px" HeaderText="HyperLink"DataTextField="MyText" DataTextFormatString="{0}" DataNavigateUrlFields="Id,MyValue"DataNavigateUrlFormatString="http://www.google.com/?id={0}&page={1}" Target="_blank"NavigateUrl="~/alert.aspx" Text="链接" /><ext:TemplateField HeaderText="TemplateField"><ItemTemplate><%# GetMyValue(DataBinder.Eval(Container.DataItem, "[MyValue]")) %></ItemTemplate></ext:TemplateField><ext:ImageField DataTooltipField="MyText" Width="60px" DataImageUrlField="MyValue"DataImageUrlFormatString="~/images/16/{0}.gif" HeaderText="Image"></ext:ImageField></Columns></ext:Grid><br /><ext:Button ID="Button1" EnableAjax="false" runat="server" Text="导出ExtAspNet控件Grid到Excel文件" OnClick="Button1_Click"></ext:Button>

这里需要说明一点:因为点击“导出”按钮会改变响应消息头,使用AJAX就不合适了。所以我们设置Button的EnableAjax="false",当然你也可以设置PageManager的这个属性,那会影响整个页面。

2. 后台数据绑定。这个同样省略,无非是从数据库读出一个DataTable或者List绑定到Grid控件。

3. 生成的页面: 

4. 点击导出按钮的事件处理

    protected void Button1_Click(object sender, EventArgs e){Response.ClearContent();Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");Response.ContentType = "application/excel";StringWriter sw = new StringWriter();HtmlTextWriter htw = new HtmlTextWriter(sw);Grid1.RenderControl(htw);Response.Write(sw.ToString());Response.End();}

5. 生成的MyExcelFile.xls文件(用记事本打开):

    <div id="Grid1_wrapper" style="display:inline;"></div>

问题出现

如果你理解Extjs的工作原理的话,这个结果并不奇怪。
Grid渲染到页面中的只有一个简单的DIV标签,至于内部的所有的内容都是通过JavaScript来生成的,这个JavaScript就隐藏在页面的底部,如果你观察过ExtAspNet生成的页面的话,你能看到类似的Grid初始化代码: 

看来对于使用extjs的ExtAspNet控件而言,我们不能照搬Asp.Net中的GridView的模式,我们需要...

另辟蹊径

仔细观察Button1_Click事件处理函数,它做的事情很简单 - 向输出流写入一个字符串,这个字符串就是一个HTML的表格。那我们何不手工来生成这个表格?

不用怕,问题没有你想的那么复杂:

    protected void Button1_Click(object sender, EventArgs e){Response.ClearContent();Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");Response.ContentType = "application/excel";Response.Write(GetGridTableHtml(Grid1));Response.End();}private string GetGridTableHtml(Grid grid){StringBuilder sb = new StringBuilder();sb.Append("<table cellspacing=\"0\" rules=\"all\" border=\"1\" style=\"border-collapse:collapse;\">");sb.Append("<tr>");foreach (GridColumn column in grid.Columns){sb.AppendFormat("<td>{0}</td>", column.HeaderText);}sb.Append("</tr>");foreach (GridRow row in grid.Rows){sb.Append("<tr>");foreach (object value in row.Values){string html = value.ToString();sb.AppendFormat("<td>{0}</td>", html);}sb.Append("</tr>");}sb.Append("</table>");return sb.ToString();}

不就是生成一个HTML的表格嘛,这个事情我做过无数次了,拍拍手来看下成果: 

继续优化

还是两个地方不满意,我们看下CheckBox的那个地方生成的HTML代码:

    <!-- 选中的CheckBox --><div ext:qtip="item2" class="box-grid-static-checkbox"></div><!-- 没有选中的CheckBox --><div ext:qtip="item3,我是一个很厉害的程序员。" class="box-grid-static-checkbox box-grid-static-checkbox-uncheck"></div>

可见这里并没有像Asp.Net的GridView那样生成 input type="checkbox" 的标签,而是通过CSS样式来控制是否选中(说白了就是不同的背景图片)。

有了这些认识后,优化也很简单:

    private string GetGridTableHtml(Grid grid){StringBuilder sb = new StringBuilder();sb.Append("<table cellspacing=\"0\" rules=\"all\" border=\"1\" style=\"border-collapse:collapse;\">");sb.Append("<tr>");foreach (GridColumn column in grid.Columns){sb.AppendFormat("<td>{0}</td>", column.HeaderText);}sb.Append("</tr>");foreach (GridRow row in grid.Rows){sb.Append("<tr>");foreach (object value in row.Values){string html = value.ToString();// 处理CheckBoxif (html.Contains("box-grid-static-checkbox")){if (html.Contains("box-grid-static-checkbox-uncheck")){html = "×";}else{html = "√";}}// 处理图片if (html.Contains("<img")){html = html.Replace("src=\"/extaspnet/", "src=\"http://localhost/extaspnet/");}sb.AppendFormat("<td>{0}</td>", html);}sb.Append("</tr>");}sb.Append("</table>");return sb.ToString();}

再来看下生成的XLS文件,这已经是我们想要的结果了。

修正一个小BUG

还有一个小问题,就是在导出文件之后,按钮不可点击了,如下所示: 

其实这是ExtAspNet的一个内置特性,是为了防止重复点击同一个按钮两次。一般情况下在AJAX之后系统会自动让此按钮可点击(非AJAX页面会刷新)。

但是这里有点特殊,导出Excel文件并没有导致页面刷新,所以我们需要给Button设置一个属性,使其在点击时不要变灰。

    <ext:Button ID="Button1" EnableAjax="false" DisableControlBeforePostBack="false"runat="server" Text="导出ExtAspNet控件Grid到Excel文件" OnClick="Button1_Click"></ext:Button>

全部源代码可以从这里下载,在文件夹data\grid_excel_run.aspx中。
注意:如果想运行本章中提到的程序,ExtAspNet版本需大于v2.0.6。

转载于:https://www.cnblogs.com/sanshi/archive/2009/08/24/1552804.html

ExtAspNet应用技巧(十) - Grid导出为Excel文件(续)相关推荐

  1. 怎样用XMind 8将思维导图导出为Excel文件

    XMind 8是一款思维导图软件,然而思维导图文件却不是一个通用格式.所以它提供了许多其他导出格式,方便用户以合适的文件格式进行分享或使用.XMind目前支持的文件导出格式有PDF.SVG.MS Ex ...

  2. oracle导出表为excel文件路径,Oracle导出数据为excel或文本文件

    将oracle中表的数据导出为excel文件保存,在网上看了很多方法,总的来说有两种. 一是运用excel工具中通过ODBC连接oracle数据库,将文本导出. 一是通过oracle的命令导出.基本上 ...

  3. java导出为excel文件_java导出数据到excel文件

    有的时候,将一些有用的数据导出到excel是很有必要的.比如说,我现在在做一个学校的在线教学平台,有一个需求是:将学生成绩导出到excel文件中去. 那怎样实现用java导出数据到excel文件呢?? ...

  4. node爬取app数据_node爬取拉勾网数据并导出为excel文件

    前言 之前断断续续学习了node.js,今天就拿拉勾网练练手,顺便通过数据了解了解最近的招聘行情哈!node方面算是萌新一个吧,希望可以和大家共同学习和进步. 一.概要 我们首先需要明确具体的需求: ...

  5. Pl/sql 如何将oracle的表数据导出成excel文件?

    oracle将表数据导出成excel文件的方法 1)在SQL窗体上,查询需要导出的数据 --查询数据条件--select MID,CODE,NAME from Dxc_Goods_Cate where ...

  6. python将字典导入excel_python将字典列表导出为Excel文件的方法

    将如下的字典列表内容导出为Excel表格文件形式: 关于上图字典列表的写入,请参考文章:https://www.jb51.net/article/169088.htm python将字典列表导出为Ex ...

  7. python 导出大量数据到excel_怎么在python中将大量数据导出到Excel文件

    怎么在python中将大量数据导出到Excel文件 发布时间:2021-01-16 11:09:40 来源:亿速云 阅读:76 作者:Leah 这期内容当中小编将会给大家带来有关怎么在python中将 ...

  8. java导出 elsx 文件,如何获取java导出的excel文件,发送请求导出excle文件

    如何获取java导出的excel文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 request.setCharacterEncoding("utf-8"); ...

  9. ASP.NET 2.0中将 GridView 导出到 Excel 文件中

    下面代码实现将 GridView 导出到 Excel文件中. 值得注意的是VerifyRenderingInServerForm重载方法: MSDN上的 VerifyRenderingInServer ...

最新文章

  1. PostgreSQL 的 MVCC 机制解析
  2. python Appium安装及环境配置 mitmproxy安装配置
  3. 证券回购市场repo market
  4. 电脑操作系统维护10条实用建议!
  5. 安卓最新系统_成纺移动校园(移动办公系统)V3.2.1 安卓最新版
  6. Windows 系统补丁管理策略
  7. C语言的声明的优先级规则
  8. linux复制文件中内容吗,Linux中实现对文件内容的复制。。。
  9. 服务器控件下拉框显示隐藏,演练:在 GridView Web 服务器控件中编辑时显示下拉列表...
  10. php图片大小怎么改,如何批量修改图片大小/尺寸
  11. 【PAT乙】1030 完美数列 (25分) 枚举
  12. HDU-1002 A + B Problem II Java大数
  13. Easytrader 超简单的股市自动交易神器
  14. 宽度学习系统:一种不需要深度结构的高效增量学习系统
  15. 计算机绘画社团活动教案,电脑绘画社团教案
  16. 视觉-相机图像质量测试
  17. 除尘器选型需要考虑的因素
  18. 如何在香港主机上尽可能多的建站
  19. 从文本进度条开始:谈谈自己缺失的Python基础知识
  20. 图解PKCS#1(合)

热门文章

  1. MySQL Workbench 使用 (3):数据库备份与恢复
  2. bzoj 1002: [FJOI2007]轮状病毒
  3. python学习之文件处理
  4. C++的STL标准库学习(deque)双向队列
  5. 80X86CPU独立编址方式的两种寻址方式——直接寻址直接写和间接寻址DX
  6. [codewars] - int32 to IPv4 二进制十进制 ip地址转换
  7. Monkey软件测试工具介绍
  8. 编程数学(A-2)-次方
  9. NOIP2010 提高组 机器翻译
  10. 重新理解“失败是成功他妈”