首先,先上下图片,好理解一下今天要讲内容:

第一张图:

第二张图:

说明:

在很多系统中,或者是一些网站的后台,包括秋色园的后台,通过都会有一些相同的工具栏目,比如上面的“导出”按钮,由于分布在系统大量的列表中,

因此,如何以最简洁快速的方式实现这种功能,节省开发时间,就是今天以下要介绍的内容了。

接着我们再看一下点击“导出”按钮时出现的导出功能:

打开导出的Excel:

说明:

从以上四张图片中,所要说明的问题是:

“导出”功能在N个界面中重复出现,如何实现“导出”功能的代码只写一次,就能在任意的界面中,实现导出当前页面列表的功能。

下面正文讲解如何实现:

一:实现思路

对于列表的导出,有以下两种方式:

1:从客户端取数据导出:

在我的同事负责的一个基于ExtJs开发的系统中,是在客户端进行导出形成报表的,

当然,使用这种方式,他有他的系统使用场景前提,

即是:每次查询都显示所有信息,不进行分页,所以不需要再提交到服务端再次查询,直接从客户端取数据即可以导出。

当然缺点就是:对于分页显示的数据,只能导出当前页,因此只适用于一次显示所有数据的场景下。

2:从服务端取数据导出:

由于相当多的时候,列表总是分页的,因此,需要重新提交到服务端查询所有数据,然后进行输出,如果只针对一个页面进行处理,通常写代码考虑的可以少一点,

不过今天要实现的功能,只需要把控件往里一拖,即可自动实现导出功能,无需在页面写任何代码,因此,需要有一些标准的约定出来配合一下。

那具体实现的思路方式如何?

其实思路很简单,只要约定绑定列表的方法名称和列表控件默认的ID即可。

简单的说,点击“导出”按钮时,可以通过反射,进行重新绑定,然后通过重新绑定后的控件ID,取得内部生成的html,进行Excel导出即可。

二:实现步骤

具体的实现步骤如下:

1:新建用户控件,往里拉一个“导出”按钮。

2:在“导出”按钮点击事件中:寻找约定的列表控件如"rptList",找到后反射调用约定的方法如“BindList",调用后rptList将被填充完内容。

3:读取rptList控件的内部html,进行导出。

三:完整示例实现代码

1:新建示例网站项目如:ExcelExportDemo

2:往里新建用户控件:Export.ascx 示例中只放一个“导出”按钮

html如下:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Export.ascx.cs" Inherits="Export" %>
<asp:Button ID="btnExportToXLS" runat="server" Text="导出" OnClick="btnExportToXLS_Click" />

点击时的后台代码如下:

    protected void btnExportToXLS_Click(object sender, EventArgs e)
    {
        Control ct = this.Page.FindControl("rptList");
        if (ct != null)
        {
            MethodInfo mi = this.Page.GetType().GetMethod("BindList", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
            if (mi != null)
            {
                mi.Invoke(this.Page, null);
            }
            Toolkit.ExcelHelper.ExportToXLS(ct);
        }
    }

代码相当简洁,有两个约定的名称分别为:"rptList"与"BindList"

接下来是分解的导出Excel的代码:

    public class ExcelHelper
    {
        public static void ExportToXLS(params Control[] ctList)
        {
            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
            HttpContext.Current.Response.Write("<meta http-equiv=Content-Type content=text/html;charset=gb2312>");
            HttpContext.Current.Response.AppendHeader("content-disposition", "attachment;filename=report.xls");
            HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
            StringBuilder sb = new StringBuilder();
            sb.Append("<head><style>table td,th{vnd.ms-excel.numberformat:@;text-align: center;} table th{color:red}</style></head>");//先增加格式化td为文本格式
            System.IO.StringWriter sw = new System.IO.StringWriter();
            HtmlTextWriter htw = new HtmlTextWriter(sw);
            ctList[0].RenderControl(htw);
            sb.Append(sw.ToString());
            sw.Close();
            HttpContext.Current.Response.Write(sb.ToString());
            HttpContext.Current.Response.End();
        }
    }

注意下编码,以防乱码即可。

OK,以上的代码就已完成了一个通用的导出列表按钮了,接下来我们继续完善这个示例,增加列表展示并把列表导出来。

3:直接拿了上节 带线的无限级下拉树列表-完整示例篇 中的数据库,用来展示数据

为方便示例,仍用Access数据库,还是上次的Product表,并为之添加了几行数据,如图:

接着项目添加引用 CYQ.Data 数据框架 来实现数据库操作列表展示:

由于只是示例展示列表应用,就不生成枚举了。

引用后项目结构如下图所示:

4:在Default.aspx页面中,添加一个GridView控件,同时将导出的用户控件拉进去:

html如下:

<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="rptList" runat="server"></asp:GridView>
        <br />
        <uc1:Export ID="Export1" runat="server" />
    </div>
    </form>
</body>

后台实现列表绑定代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindList();
        }
    }
    protected void BindList()
    {
        using (MAction action = new MAction("Product"))
        {
            action.Select().Bind(rptList);
        }
    }
    public override void VerifyRenderingInServerForm(Control control)
    {
        //不引发"控件必须放在具有 runat=server 的窗体标记内“验证
        //---------这个可以放在PageBase中处理
    }

至此,整个示例就结束了,我们浏览看一下结果,如下图:

点击导出按钮,出来Excel文件:

打开Excel文件,就是当前列表的数据了。

四:总结

从以上的整体示例中,具体页面并没有导出按钮相关的后台代码,而只要按约定将列表控件的ID写成rptList,同时负责绑定数据所方法名称为BindList。

即可以实现导出功能。

五:扩展与其它说明

1:也许要导出一个页面中并不止一个列表,可能是多个列表,这个的扩展,其实并不难:

思路:只要在BindList里绑定N个列表控件,同时把约定控件名称设为多个,加个循环而已。

2:当前示例中没有分页,那分页如何处理?其实也不难:

思路:只要在分页控件中,通过判断是否“导出”事件,来定位分页的索引即可。

比如用下面常见的带分页的代码:

    protected void BindList()
    {
        using (MAction action = new MAction("Product"))
        {
            int count;
            action.Select(Pager1.PageIndex,Pager1.PageSize,string.Empty,out count).Bind(rptList);
        }
    }

页面中没有任何代码变化,只要在Pager1这个分页控件中,通过判断来定位PageIndex和PageSize即可。

比如在获取PageIndex时,判断是否“导出”事件,然后将索引返回1或0,具体看应用的框架需要返回值。

同样在获取PageSize时,判断是否“导出”事件,然后将索引返回0或无穷大,具体也看应用的框架需要返回值。

最后是示例下载:点击进入下载页面

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2011/01/21/1940836.html

实战篇-通用的页面列表导出Excel控件相关推荐

  1. JAVA导出Excel通用工具类——第一篇:详细介绍POI 导出excel的多种复杂情况,包括动态设置筛选、动态合并横向(纵向)单元格等多种复杂情况——保姆级别,真的不能再详细了,代码拿来即用)

    JAVA导出Excel通用工具--第一篇:详细介绍POI 导出excel的多种复杂情况,包括动态设置筛选.动态合并横向(纵向)单元格等多种复杂情况--保姆级别,真的不能再详细了,封装通用工具类,代码拿 ...

  2. SAP UI5 应用开发教程之五十八 - 使用工厂方法在运行时动态创建不同类型的列表行项目控件试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  3. PyQt5快速开发与实战 5.2 容器:装载更多的控件

    PyQt5快速开发与实战 文章目录 PyQt5快速开发与实战 5. 第5章 PyQt5 高级界面控件 5.2 容器:装载更多的控件 5.2.1 QTabWidget 5.2.2 QStackedWid ...

  4. [Ext JS 4] 实战之 带week(星期)的日期选择控件(二)

    前言 JavaScript 中的日期和时间 [Ext JS 4] 实战之 带week(星期)的日期选择控件(一) 如对本篇的一些预备知识需详尽了解,可参考以上两篇. Javascript 有提供Dat ...

  5. MFC学习--下拉框、列表、树控件、选项卡

    下拉框.列表.树控件.选项卡 下拉框 属性 代码操作 列表控件 属性 代码操作 树控件 属性 代码操作 选项卡 属性 代码操作 文化建设 下拉框 属性 Data: 下拉可选项,用分号分隔( ; ) T ...

  6. 关于从页面中获取用户控件中的其它控件(如DropDownList)事件的方法

    在项目中经常把一些经常使用的代码做成用户控件以提高代码的可重用性, 一个经常遇到的就是在页面中调用用户控件中的服务器控件的事件,下面给出简单的代码示列. 我们在一个用户控件(MaterialRepor ...

  7. WinForm中使用Excel控件

     最近项目中要在WinForm中使用Excel控件,经过几天的研究,现在总结一下成果. 在WinForm中使用Excel控件主要有三种方法:WebBrowser.DSOFramer.OWC.下面分别 ...

  8. aspx 页面,master页面与ascx用户控件传值的问题

    aspx 页面与ascx用户控件传值的问题 1.建立ascx控件 2.给ascx加上属性 3.将控件拖入aspx中 4.在aspx的代码中按控件ID访问属性 如: <uc3:left_Repas ...

  9. VC MFC列表视图(CListCtrl)控件

    VC MFC列表视图(CListCtrl)控件 列表视图控件 图标风格 CListCtrl类里要了解的函数 SetImageList为列表控件关联一个图像列表 InsertItem插入一项 GetSe ...

最新文章

  1. 计算机视觉图像处理机器学习压缩感知等论文代码大全
  2. matlab设置数组输出到文件中,Matlab将元胞数组输出到txt或者dat文件中
  3. 求给定精度的简单交错序列部分和_单个神经元的简单模型:Leaky integrate and fire (LIF) model...
  4. Excel学习使用教程
  5. 华为笔试题-磁盘容量排序
  6. C#中的矩阵乘法——对图像应用变换
  7. 7月共处理钓鱼网站1921个:非CN域名达1911 个
  8. 【java】方法中参数列表的应用
  9. js事件---事件流
  10. spring boot开发环境搭建
  11. Rtsp之rtp包解析
  12. 清华大学计算机学教授招,清华大学计算机系网络所刘斌教授招收2015年入学博士生...
  13. dbf转成excel_DBF Converter将DBF文件转换成Excel表格教程
  14. 毛星云Opencv之图像修补综合示例程序
  15. 拉格朗日插值的优缺点_对拉格朗日插值法与牛顿插值法的学习和比较
  16. dos攻击防范 php,DOS攻击和DDOS攻击的区别
  17. 分享超好用的截动图工具ScreenToGif
  18. _corrupted_rollback_segments参数解决UNDO表空间损坏无法启动数据库的故障
  19. windows10更新服务器修改,Windows 10彻底关闭自动更新(Windows Update和Windows Update Medic Service)...
  20. docker update修改内存/cpu

热门文章

  1. 巴鲁夫使用CAE数据扩展其产品目录
  2. 用Web标准进行开发[转]
  3. 网络安全!顶级大佬进行鱼叉式钓鱼攻击?手把手教学
  4. 链表实现电话簿(C++)
  5. Base64解码过程必须关注的问题
  6. python和anaconda安装顺序_Anaconda详细安装步骤图文教程
  7. ARM通用中断控制器GIC之中断处理状态机 Interrupt handling state machine
  8. html p代码的效果,html元素 p 标签的使用方法及作用
  9. python atm作业详解_Python小案例--ATM系统
  10. 【scala】练习题