数据报表开发技巧:自动为数据报表添加【小计】、【总计】行
在开发ERP系统的数据报表时,几乎都是需要看到【小计】、【总计】这样的汇总数据的,在数据报表的显示列表中,最下面的一行通常就是【小计】或者【总计】的汇总行。如果手动为每个报表都增加汇总行,那也是一份不小的工作量。
所以,如果能自动为每个数据报表自动添加【小计】、【总计】汇总行,那将可以节省不少的开发时间。本文将给出实现这种方案的思路原理以及源码。
本文中,报表数据的显示使用的是WinForm的DataGridView控件,如果是Web项目,其原理和思路是一样的。
举个栗子,零售店POS机上查询销售单的效果如下图所示:
在报表的最下面有一行【总计】,对数量和金额项进行了汇总。
下面,我们来详细讲解是如何自动为其添加【总计】这一汇总行的。
一.基本原理
1.一般而言,数据报表的现实的核心数据是DataGridView绑定的一个列表List<T>,每一个T对象对应着报表中的一行数据。
2.在数据报表中,【小计】、【总计】所对应的汇总行与上面列表中的其它普通行,是有区别的,所以,它们对应的T对象也是有区别的。
3.我们通过T的一个名为 IsStatistics 的bool属性来区别普通行与汇总行。如果IsStatistics为true,表示其对应的行就为汇总行。
4.为了达到上面描述的这一目的,我们让T必须实现接口IStatisticabled这个接口。
public interface IStatisticabled{bool IsStatistics { set; get; }}
5.为报表添加汇总行,实际上就是向List<T>列表中添加一个 IsStatistics 为true的 T 对象。
6.然后,通过反射来统计需要汇总的那些项(即T的某些属性),然后将汇总得到的结果赋值给汇总T对象对应的属性。
7.在绑定到DataGridView时,通过判断列表中 T 对象的IsStatistics属性,如果为true,就将该行Row对应的RowHeader的文本设置为【小计】或【总计】。
二.思路实现
就上面描述的思路来看,稍微有点难度的地方在于最后两点,下面我们就详细讲解一下。
1.为List<T>增加汇总行
增加汇总行,所用到的主要技术就是反射Relection。
/// <summary>/// 为数据报表增加一个汇总行。/// </summary>/// <typeparam name="T">报表记录对象的类型</typeparam>/// <param name="list">数据行对象列表</param>/// <param name="statColumns">需要进行统计的列</param>public static void AddSumRow<T>(List<T> list ,params string[] statColumns) where T :IStatisticabled, new(){T sum = new T();sum.IsStatistics = true;foreach (string column in statColumns) //针对每一个汇总项{double total = 0;foreach (T t in list) //统计{object val = ReflectionHelper.GetProperty(t, column);total += double.Parse(val.ToString());}object newTotal = TypeHelper.ChangeType(typeof(T).GetProperty(column).PropertyType, total);ReflectionHelper.SetProperty(sum, column, newTotal);}list.Add(sum);}
(1)为了可以动态new一个统计行,必须要让T有 new() 这个约束。
(2)将统计行的 IsStatistics 标记设置为true。
(3)针对每一个统计项进行统计:通过反射拿到每一行该项的属性值,并转换成double类型(因为double兼容了所有的数值类型),进行累加,然后将累加的结果转换成正确的类型,最后,赋值给统计行对应的属性。
(4)将统计行添加到list列表中,作为最后一个对象。
2.绑定到DataGridView
List<RetailOrder> list = this.GetOrderList();AddSumRow(list, new string[] { "Count", "Money" });this.dataGridView1.DataSource = list;DataGridViewCellStyle style = new DataGridViewCellStyle();style.Font = new Font(this.dataGridView1.DefaultCellStyle.Font.Name, this.dataGridView1.DefaultCellStyle.Font.Size, FontStyle.Bold);this.dataGridView1.RowHeadersDefaultCellStyle = style;this.dataGridView1.Rows[list.Count - 1].HeaderCell.Value = "总计";this.dataGridView1.Rows[list.Count - 1].DefaultCellStyle = style;
(1)通过GetOrderList方法获取到销售单列表后,我们通过AddSumRow方法为其添加一个汇总行,并对【Count】、【Money】进行汇总。
(2)将包含了汇总行的列表绑定到DataGridView。
(3)将最后一行的RowHeader的Cell的value设置为【总计】 。
(4)将【总计】行的所有数据显示都变成粗体。
三.示例源码下载
1.本文Demo源码:DataReportsSample.rar
2.该Demo中用到了ESBasic的反射帮助类ReflectionHelper,这里可以下载我的开源基础类库:ESBasic 源码。
四.后续功能
本文示例是一个【小计】、【总计】汇总功能的基础展示,实际应用中,通常还会牵涉到以下问题:
(1)当报表数据存在分页时,一般会同时存在【小计】、【总计】行,【小计】是本页的汇总,【总计】是所有业的汇总。
(2)当DataGridView绑定的某些列对应着Entity的某个只读属性,并且这个只读属性不会返回null和string.Empty时,汇总行的这一列就会有文字显示(这是一个非汇总行,目标单元格应该是空的),要如何处理?
(3)当DataGridView的某一些是一个操作列,即对应着DataGridViewLinkColumn,如果让汇总行的目标单元格中不出现Link,而是留空了?
(4)有些数据的汇总,可能是要进行绝对值的汇总,那又该如何处理?
这些问题,我们都将在下篇文章的示例中一并解决,敬请期待。
数据报表开发技巧:自动为数据报表添加【小计】、【总计】行相关推荐
- 帆软 JAVA扩展_java报表开发工具FineReport教程之报表设计:单元格扩展
java报表开发工具FineReport教程之报表设计:单元格扩展 报表设计章节适用于对报表业务有一定的了解,需要学习FineReport报表的初学者. 通过该章节的学习,可以掌握设计器的使用,了解报 ...
- access 报表中序号自动_数据报表多种序号生成方式
报表系统中,往往要对数据进行编号处理,从而使数据的条目更加清晰.在 excel 中,我们可以直接在一个单元格中输入 1,然后按住 Ctrl 向下拖拽单元格就可以自动生成连续的序号.不过除了连续的序号, ...
- 在报表开发工具Stimulsoft Report数据透视表的新功能介绍
在本文中,我们将向您介绍自 Stimulsoft Ultimate 2022.3 版本以来可用的数据透视表元素功能. Stimulsoft Ultimate官方正版下载 使用此仪表板元素,您可以通过匹 ...
- 自动化办公之excel教程(2):各种数据的输入,自动填充数据,表格操作小技巧
一.各种类型数据的录入 1.数据输入 加粗样式选中单元格后,左上侧会出现字母和数字,如图中的C9,即可在文中输入数据. 2.货币输入 在某一单元格输入框里右键选中设置单元格格式. 3.数字输入 如果我 ...
- 网新 恒天Reporting COE的报表开发能力和恒天报表云平台
报表覆盖: 1. BIRT / Cognos / Crystal / Jasper报表开发: 2. Actuate与Jasper之间的迁移以及相应的报表开发:Crystal与Jasper之间的迁移 ...
- oracle excel报表开发,深入浅出OracleEBS之Excel报表开发.doc
深入浅出OracleEBS之Excel报表开发 Oracle ERP最佳技术实践 E-Business Suite Oracle核心应用技术 Excel报表开发 Author:黄建华Jianhua.H ...
- birt报表表格边框_选开源报表开发还是商用?2020报表软件产品整理
开源报表却越来越受到程序员热烈追捧,如ireport. Jsper report.jfreechart这样的免费,开源的JAVA报表工具,在一下开源的JAVA报表相关的论坛里面都是热火朝天,发问者众多 ...
- 大数据项目开发案例_大数据开发相关术语解析
Java['dʒɑːvə] 当前软件开发行业应用最广.就业量最大的编程语言,在各类编程语言排行榜长期位列第一.是企业软件开发的首选语言,也是Android系统的开发语言. Java吸取了C++语言的众 ...
- 五、K3 WISE 开发插件《直接SQL报表开发新手指导 - BOM成本报表》
======================== 目录: 1.直接SQL报表 ======================== 1.直接SQL报表 以BOM成本报表为例,在销售模块部署,需要购买[金蝶 ...
最新文章
- c# 垃圾回收是引用类型而言的
- IDEA那些既好用又好玩的30多款宝贝插件,你知道多少?
- 关于CCRANDOM_0_1
- procreate 笔刷_Procreate笔刷怎么用?初学者必看!!!(含笔刷设置)
- IEEE802.11协议栈
- 【自动驾驶】毫米波雷达相关知识专题
- ABAP report的递归submit和在虚拟机里再次启动另一个虚拟机
- fiddler对手机进行抓包
- Python 字典 values() 方法
- ruby hash方法_Ruby中带有示例的Hash.rassoc(obj)方法
- 关于两个list深层遍历
- CF 246E. Blood Cousins Return [dsu on tree STL]
- RedHat 7 更换 yum 源为 CentOS 或网易镜像源
- chrome 迅雷下载 支持插件, 让chrome支持迅雷
- 固态硬盘系统经常假死_Win7固态硬盘假死卡顿解决方法
- 第09课:一网打尽神经序列模型之 RNN 及其变种 LSTM、GRU
- Openstack 高可用部署(Ocata版)
- matlab读取wav文件
- uniapp权限(Android权限)
- 问题解决了,可是为什么呢?could not find the main class.program will exitmain