报表页面设计思路

应用情景:

一、简单型

只有一个数据列表,从数据库读取表数据,在程序端构造DataTable,格式化为中文(同时处理合计结果),前台页面绑定(使用中文字段绑定),后台调用NOPI导出到EXCEL;

二、复杂型

在一的基础上增加:

1、存在多个数据列表(例如:汇总、明细);

2、可按行进行合计;

3、列名可能是动态增加的(例如支付方式:微信、支付宝、现金、刷卡);

解决方案:

(一)定义页面全局DataTable

    private DataTable dtTicketSumReport = new DataTable();

    protected Dictionary<string, decimal> dcTicketSum = new Dictionary<string, decimal>(); //用作合计

( 二)初始化字典对象

private void InitDictionary()
{
        this.dcTicketSum.Add("数量", 0);
        this.dcTicketSum.Add("手续费", 0);
        this.dcTicketSum.Add("优惠金额", 0);
        this.dcTicketSum.Add("合计", 0);
        this.dcTicketSum.Add("成本合计", 0);

     foreach (UserOperatorMoneyPaymentType item in Enum.GetValues(typeof(UserOperatorMoneyPaymentType)))
        {
            this.dcTicketSum.Add(item.ToString(), decimal.Zero); //动态添加字典项;
        }
}

(三)初始化全局Datatable

private void InitGlobalTable()
{

       DataTable dtMoneyDetail = ds.Tables[0]; //从数据库获取数据

        //格式化列名(使用中文,导出时也是使用同一个Table)
        this.dtTicketSumReport.Columns.Add("OperatorId", typeof(int));
         //.....
        this.dtTicketSumReport.Columns.Add("成本", typeof(decimal));        

        dcMoney = new DataColumn("手续费", typeof(decimal)); //增加列
        dcMoney.DefaultValue = "0.00";
        this.dtTicketSumReport.Columns.Add(dcMoney);

        Dictionary<byte, string> dcPaymentType = new Dictionary<byte, string>();
        //根据数据库的实际记录,把要增加的列先添加到字典dcPaymentType中
        foreach (DataRow dr in dtMoneyDetail.Rows)
        {
           byte paymentType = (byte)dr["PaymentType"];
            if (!dcPaymentType.ContainsKey(paymentType))
            {
                string columnName = null;
                UserOperatorMoneyPaymentType paymentTypeEnum;
                if (!Enum.TryParse<UserOperatorMoneyPaymentType>(paymentType.ToString(), out paymentTypeEnum))
                {
                    Response.Write("未定义支付方式" + paymentType.ToString());
                    Response.End();
                }

                columnName = paymentTypeEnum.ToString();
                dcPaymentType.Add(paymentType, columnName);
            }
        }

        foreach (DataRow dr in dtOrderTicketNumSum.Rows)
        {
            //读取列名
            string amountColumnName = dcPaymentType[paymentType];

            //合计:
            Dictionary<string, decimal> dcTicketSum = new Dictionary<string, decimal>();
            this.dcTicketSum["合计"] = this.dcTicketSum["合计"] + realAmount + poundage;
            this.dcTicketSum[amountColumnName] = this.dcTicketSum[amountColumnName] + realAmount;

            DataRow drFind = this.dtTicketSumReport.Rows.Find(new object[] { operatorId, scheduleId });

            //检查是否已经添加过要新增加的列
            if (!this.dtTicketSumReport.Columns.Contains(amountColumnName))
            {
                //增加列
                dcMoney = new DataColumn(amountColumnName, typeof(decimal));
                dcMoney.DefaultValue = "0.00";
                this.dtTicketSumReport.Columns.Add(dcMoney);
            }

            if (drFind == null)
            {
                drFind = this.dtTicketSumReport.NewRow();
                //......
                this.dtTicketSumReport.Rows.Add(drFind);
            }
            else
            {
                drFind["合计"] = (Convert.ToDecimal(drFind["合计"]) + realAmount + poundage).ToString();
            }
        }

        if (this.dtTicketSumReport!= null)
        {
            this.dtTicketSumReport.PrimaryKey = null;
            this.dtTicketSumReport.Columns.Remove("TicketId");
            //去掉不再需要的列(前台页面不用绑定;导出时不用显示);
        }
}

四、绑定前台页面、

 private void InitControl()
{
        this.InitGlobalTable();

        this.rpTicketSum.DataSource = this.dtTicketSumReport;
        this.rpTicketSum.DataBind();
}  

五、导出EXCEL

 private void ProcessExport()
    {
        this.InitGlobalTable();
        DateTime beginDate = DateTime.Parse(this.dpBeginDate.Text);
        DateTime endDate = DateTime.Parse(this.dpEndDate.Text);

        DataTable[] dtArr = null;
        string[] dtArrTips = null;

        if (true)
        {
            dtArr = ....
            dtArrTips = new string[] { ........ };
        }
        else
        {
            dtArr = ......
            dtArrTips = new string[] { .......};
        }

        string fileName = (beginDate == endDate ? beginDate.ToString("yyyy-MM-dd") : string.Format("{0}至{1}", beginDate.ToString("yyyy-MM-dd"), endDate.ToString("yyyy-MM-dd"))) + salerName + ".....";
        string excelSubTitle = fileName;

        string[] sumColumnNameArray = new string[] { ....... };

        SSM_EC.Site.NpoiExcel.ExportExcel(dtArr, dtArrTips, fileName, AspxHelper.GetExcelHeader(), excelSubTitle, false, AspxHelper.GetExcelProtectPassword(), sumColumnNameArray, null, false, null);
    }
时间: 2024-11-06 09:36:31

报表页面设计思路的相关文章

今日工作总结:jquery轮转效果的集成与前台页面banner的设计思路总结

今日做了两个项目中的两个问题,现在特来总结一下,以便分享给更多的朋友们. 1.jquery轮转效果的集成 涉及到jquery的不同版本问题,解决办法是在后缀用jQuery代替$.项目地址在:121.40.62.79 可以访问,并通过查看源代码获取到. jquery代码如下: <script type="text/javascript" src="js/jquery-1.7.2.min.js"></script> <script type

JS表格分页组件:fupage的设计思路和具体用法(未来考虑开源,争取在2015年)

一.背景         之前在秒针工作的时候,某js高级工程师写了很多自己的组件,其中一套是分页组件,叫做st-grid.不过在我看来,bug太多,我经常给他反馈bug,我也不清楚为啥别人没有发现.    回到武汉工作后,我自己利用业余实践完善自己的官网,从前端到后端,都是自己一个人亲自搞定.    第1个分页的需求是,文章下方的评论,异步加载.第2个需求是,表格管理,比如后台管理系统,经常需要列出user.log等表的记录.   二.实例 <table class="table tab

用MongoDB数据库来管理办公系统中文档型的表单和信息——通用流程化应用审批单设计思路(二,续)

1.办公系统中文档的定义 办公系统中的文档就是指对数据不敏感的业务,例如流程中的审批单.信息专栏.数据上报.信息记录等.而对于这些信息的管理,特别是时效性较强的管理记录,仍采用关系型数据库进行管理. (1)流程中审批单 流程中审批单由功能按钮区.特殊功能区.业务表单区.附件区.审批意见区等区域构成,其中,业务表单区理论上包含附件和意见,但是由于附件和意见的业务特殊性,需要单独进行管理,剩下的业务表单就可以看作文档了. 在一些流程审批业务中,业务信息有的是以Excel或word文件等方式专递,这样

UI设计之页面设计的九个要点!

刚入行的UI设计师,会做一些辅助的工作,大多数时间做的都是等待安排,完成工作.主要就是根据主设计师的设计和规范来制作下层页面,而在这个过程中有很多需要注意的地方,今天就和大家一起细数下层页面设计过程中必须要注意的要点.希望今天的UI设计教程能够帮助到大家. 在平时的工作中,会接触到很多"下层页面设计".下层页面设计就是,根据主设计师设计的主页面进行下层页面的制作.对于页面较多的网站,会经常这样分工协作.在拿到首页设计时,首先要对整体仔细确认.如果这一步没有认真做,接下来的页面就会陷入不

Backbone设计思路和关键源码分析

一. Backbone的江湖地位: backbone作为一个老牌js框架为大规模前端开发提供了新的开发思路:前端MVC模式,这个模式也是前端开发演变过程中的一个重要里程碑,也为MVVM和Redux等开发思路奠定了夯实的基础,后来的react,vue无不是在backbone的影响下开创出来的经典模式.为什么这么说呢?我们先来回顾下Web前端开发的大概演变流程,本过程纯粹个人理解,抛砖引玉,共同探讨,如有偏差请看官指出错误: 1. 无前端:最早的网页就是HTML,还只是静态页面,当时的脚本含量极少甚

这个用js写的“智能推荐”插件设计思路别具一格啊

现在"智能推荐"几乎成了一个内容网站的标配,为了提高用户的滞留时间,就需要想办法搞些新花样.比如用户文章读到最后时,把用户感兴趣的文章列出来,美其名曰:猜你喜欢. 现在,如果小编出10000美刀,让你来实现这个智能推荐功能,你会怎么去做呢?根据常理,思路是不是应该是这样的? 1.设计一张tag表,每篇文章都有相应的tag,这样就可以根据tag给读者推荐相似的文章. 2.给每个用户设计一张用户自画像算法,根据算法去分析每篇文章,然后把相关文章推荐给用户. 实话说,要做好的话非常不容易,估

跟张小龙学习做优秀产品经理的设计思路

提起张小龙,大家都非常熟悉这位极度优秀的产品经理,不仅仅是因为Foxmail,更因为目前深刻改变你我移动生活的移动互联网产品 - 微信,其江湖地位的确定已经让众多国内立志于做优秀产品经理的人顶礼膜拜了,我们首先借助互联网材料回顾一下微信的创立历程: 一.微信的演化历程: 2010年11月19日23时58分,张小龙在腾讯微博上写下了这么一句话: 我对iPhone5的唯一期待是,像iPad(3G)一样,不支持电话功能.这样,我少了电话费,但你可以用kik跟我短信,用googlevoice跟我通话,用

二、 面向云的.net core开发框架的主要设计思路

为满足性能.扩展性.业务快速交付等方面的要求,新.net core云开发框架改造的主要思想是:高内聚.低耦合,即进一步实现纵向和横向分层,提高可伸缩性和可扩展性,实现弹性部署: 采用领域驱动设计进行架构横向分层,同时业务功能纵向分割 在代码和数据库设计上充分考虑云架构要素,提高可伸缩性.可扩展性.高性能性和安全性 采用诸如分布式缓存.分布式存储.并行数据库.消息队列.ESB等多种可伸缩技术实现松耦合 采用上述设计思路后的新架构搭建的综合业务管理系统如下图.其中HL.HB等是外部系统,通过ESB与

商城产品分类设计思路

问题的提出:网上商城对产品进行了很多分类,不同的分类产品又有不同的属性,比如,电脑的属性有:CUP,内存,                   主板,硬盘等等,服装的属性有:布料,尺寸,颜色等等,那么产品表以及产品分类表应该如何设计才能满足                   不同类型产品的区别呢? 解决方案:      产品分类表的设计      第一种设计思路:使用树形结构,递归的形式,可以对产品进行N种     分类,只要你喜欢,树形结构在数据库的设计中