java编程中怎样使用jxl生成复杂报表的分析与设计


  java编程中怎么样使用jxl生成复杂报表的分析与设计,编程开发中需要很强的逻辑性,下面笔者就通过一个复杂报表案例进行分析,然后教会大家如何在java中实现这一功能。
    本篇将通过一个复杂报表案例的分析,来告诉大家如何实现。
    案例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月份供应的材料来说,它之前的月份是肯定不会有使用记录的,如果最后生成的报表中,像这类位置出现了数值,那你就要好好检查一下了,这里留白也是因为客户的报表是这样做的。