随笔-67  评论-522  文章-0  trackbacks-0
    上一篇主要介绍了使用jxl生成报表的代码模板以及获取报表数据的一种处理方式,本篇将通过两个复杂报表案例的分析,来告诉大家如何实现。
    案例1
    车站区间材料供应情况报表,它的查询条件为年度,工程,材料类别,报表的标题会加上这些查询条件作为最终报表标题。无图无真相,让我们来看看生成后的效果:
    
    该报表有这样几个特点:1)表头的从5月计量到12月计量是根据查询条件的年度和工程动态取出来的,因此模板中不会定义6-13列。2)数据显示上有好几个分类,首先按供货商分,每个供货商下面,再按月根据实际的供货数量再进行划分。3)需要对每个供货商每个月的材料进行小计,如果有多个供货月,还要将本月与之前月的供货数量进行合计。
    这是大象2008年做的一个工程项目,是该项目中比较有代表性的一个报表,所有与工程相关的项目在业务上还是比较相似的,因为它有一套非常成熟的标准与规范。至于这些业务数据的表设计是什么样的,大家不需要了解,我主要根据它的业务特点来说说思路。
    我将这个报表进行分解,看看到底要准备什么数据,特别注意这些数据是和年度,工程,材料类别这些查询条件紧密关联的。PS:甲供材料与甲控材料都是工程上的名词,不写清楚会对了解该行业的人产生误解。
    1、表头的计量月份。
    2、甲供材料供应商信息。
    3、甲供材料供应月份(2)
    4、甲供材料数据(3-5)
    5、甲供材料每个月的计量值(与表头的计量月份对应)
    6、每月的小计和合计。
    处理这类复杂报表,首先需要搞清楚它的业务关系,这个非常关键,如果你连这些业务都没弄明白就开始动手做,最后肯定是会有问题的。只有在明白这些关联关系之后,我们才能接着做第二步工作,分解数据,研究数据来源,比如我上面写的1-6点,这些业务数据都分别在哪些表里面,哪些是可以直接取到的,哪些又必须是要经过计算才能得到的。比如那个剩余数量,小计,合计这些明显都是在基础数据上计算出来的。要清楚的知道,每个Cell里面是不是有内容,并且内容来源是不是正确的?就算你对自己非常有信心,还是请多核对检查,认真对待工作是不会有错的。
    前两步的思想是比较通用的,但第三步,也就是最重要也是最麻烦的获取数据,我不想针对案例报表说具体的步骤,那样就太狭隘了。这一步的解决办法有很多,我在第一篇里也曾经提到过,不管是代码式还是SQL式还是分而治之式,总之要尽可能的减少数据库访问次数。看到这里,可能有人要吐槽了,这不是说了跟没说一样吗?大象根据多年的经验,很真诚很真诚的告诉你,如果你能够做好第一步和第二步工作,那么你离完成报表也差不了多少了,其实第三步只是需要一些编程能力与SQL能力,以及在运用这些能力之前结合业务与报表的数据做一些优化方面的工作。永远记住,尽可能的减少访问数据库次数。
    最后一步当然是生成报表了,这里我想多说一句,报表的样式一般都是客户给的,因为在用系统导出报表前,肯定是先手动做的,因此样式上一定要跟用户的保持一致,这些东西最后客户那里会归档,领导也会看还要签字,作批示什么的。就像案例1的报表,它的样式就是完全按照客户给的来设定。
    在写填充数据的代码之前,先确保表头已经没问题,像案例1这种动态表头就必须要用代码来实现,在模板中是不可能预先定义好的。然后就是你所准备的数据模型是否能够帮助你处理逻辑上的一些控制。比如像供应商填充,小计,合计,还有普通数据,要让for循环里面的代码知道,每循环一次,相应的数据应该出现在哪些单元格中,你需要时刻计算一下当前数据与所对应的Cell是否一致。最后就是注意一些常识性的细节,比如上面留空白的地方,对于12月份供应的材料来说,它之前的月份是肯定不会有使用记录的,如果最后生成的报表中,像这类位置出现了数值,那你就要好好检查一下了,这里留白也是因为客户的报表是这样做的。
    案例2
    xx市城建局工程招标结果汇总表,查询条件为工程编号,工程名称,工程科室。大标题可以预先填好,但第2行用xxx标示的内容就是动态修改的,而且报表最终打印出来后是要给领导签字的,这就是明显的要按用户格式来。
    
    这个报表来自于2009年的一个项目,相比第1个我认为要简单一些,从业务上讲,就是工程项目的招投标流程的归纳与体现。可以把数据分解为:
    1、工程项目信息(工程编号与工程名称)
    2、招投标信息(分中标和流标再中标两种)
    3、合同信息(合同签订时间,原报表还有好几列关于合同的数据,如果都保留图显得太大了)
    这个报表的处理步骤和前一个一样,就不再赘述了。需要注意的是,在准备数据的时候,想想类似工程编号与工程名称这种Cell,如何知道要合并几行单元格(或者不合并)。完成之后多找些有效数据来测试。
    另外我还想谈下查询条件,比如案例1中的年度、工程、材料类别,案例2的工程编号,工程名称,工程科室。因为查询条件的多少以及对条件的限制情况会直接影响到报表数据的获取。这些东西是可以和客户沟通的,千万不要把客户的诉求当需求,他们因为不懂开发,只从业务的角度考虑问题,而且很多时候提出的要求是直接拍脑袋说的,他们要么希望大而全,恨不得把报表里面所有的列都作为查询条件;要么希望少而精,很少条件或不要查询条件。不管哪一个都不是我们希望的,这时候需要多沟通,在需求与系统之间找到一个平衡。
    感谢大家耐着性子看到这里,期望通过这两篇文章的介绍,能够对大家有所帮助,对于开发复杂报表起到一个抛砖引玉的作用。如果大象有说的不对的地方,还请各位指出来,在下感激不尽!
    本文为菠萝大象原创,如要转载请注明出处。http://www.blogjava.net/bolo
posted on 2014-01-09 14:16 菠萝大象 阅读(2668) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: