分享 - 动态分组项及汇总列报表实现

| 注:本分享主要说明客户需求及实现的 demo(api 及报表文件),并未在理论文字上描述太多。

客户需求

页面任意勾选用于分析的维度字段,另外也可以选择用于统计的汇总维度, 两者共同形成分组分析报表。
如集算报表 demo 数据库的订单表,汇总维度可以用“订单金额”、“运货费”等字段,而其他字段均可作为分析维度。由客户自主选择后,可形成类似报表结果
如“图 1“

实现方法

本需求采用 api 生成报表方式,web 端以 reportBean 方式发布展现。  – 效果请按照后面的部署方式在集算报表的 demo 下
1、参数表单部分,帮助客户选择分析维度及汇总维度。
2、生成报表及页面展现,可参考附件 jsp 文件,此处仅贴主要代码,包含很详尽的代码说明

    // 参数模版传的值 必须通过从缓冲池中获取,否则拿不到
    String reportParamsId=request.getParameter(“reportParamsId”); // 取得参数缓存的标识号
        String paramValue1 = ““;        
        String paramValue2 = ““;
        // 从参数缓存池中取得的参数保存于一个 Hashtable 中
        Hashtable params = null;
        if(!””.equals(reportParamsId) && reportParamsId != null){
                params = com.raqsoft.report.view.ParamsPool.get(reportParamsId);
                // 接下来我们以参数名为 key,直接从 Hashtable 中取参数模板中的传递的参数值
                paramValue1 = (String) params.get(“cols”); // 分析维度
                paramValue2 = (String) params.get(“cols2”); // 汇总维度
                // 依次将各维度拆分,并放到 list 备用
                List list = new ArrayList();
               
                String[] p1 = paramValue1.split(”,”);
                String[] p2 = paramValue2.split(“,”);
               
                int p1l = p1.length;   // 分析维度个数
                int p2l = p2.length;   // 汇总维度个数
               
        for(int i=0;i<p1l;i++){
                        list.add(p1_);
                }
                for(int i=0;i<p2l;i++){
                        list.add(p2_);
                }
        int hh = p1l+p2l;

                // 按总的维度生成 3 行,hh 列的报表对象
                rd = new ReportDefine2(3,hh);
            // 设置为普通报表
                rd.setReportType(ReportDefine.RPT_NORMAL);//
                // 设置报表按行分页,可改成不分页等。PrintSetup.PAGER_ROW     PrintSetup.PAGER_NONE 不分
                PrintSetup ps = new PrintSetup();
                ps.setPagerStyle(PrintSetup.PAGER_ROW);
                rd.setPrintSetup(ps);

                // 边框设置
                        for(int i1=1;i1<4;i1++){
                        for(int j1=1;j1<=hh;j1++){
                                // 下边
                                rd.setBBColor(i1,(short)j1, -16763905); // 设定下边框线色
                                rd.setBBStyle(i1,(short)j1, INormalCell.LINE_SOLID); // 设定下边框类型
                                rd.setBBWidth(i1,(short)j1, (float) 0.75); // 设定下边框线粗
                                // 左边框
                                rd.setLBColor(i1,(short)j1, -16763905);
                                rd.setLBStyle(i1,(short)j1, INormalCell.LINE_SOLID);
                                rd.setLBWidth(i1,(short)j1, (float) 0.75);
                                // 右边框
                                rd.setRBColor(i1,(short)j1, -16763905);
                                rd.setRBStyle(i1,(short)j1, INormalCell.LINE_SOLID);
                                rd.setRBWidth(i1,(short)j1, (float) 0.75);
                                // 上边框
                                rd.setTBColor(i1,(short)j1, -16763905);
                                rd.setTBStyle(i1,(short)j1, INormalCell.LINE_SOLID);
                                rd.setTBWidth(i1,(short)j1, (float) 0.75);
                        }
                }

        // 还需要合并 cols 对应列所在行的单元格(汇总项),第三行
        Area area=new Area(3,(short)1,3,(short)p1l);
                try {
                        ReportUtils.mergeReport(rd,area);
                } catch (Exception e1) {
                        e1.printStackTrace();
                }
                // 处理第一行,标题行
                for(int i=0;i<p1l+p2l;i++){
                                INormalCell inc1=rd.getCell(1,(short)(i+1));
                                inc1.setValue(list.get(i));        // 分别放置维度名称        
                                // 设置下列宽 35
                                IColCell colCell = rd.getColCell((short)(i+1));
                                colCell.setColWidth(35);
                }  
                // 设置第一行为表头行
                IRowCell rowcell=rd.getRowCell(1);
                rowcell.setRowType(IRowCell.TYPE_TABLE_HEADER);
        // 处理第二行,单元格表达式  分析维度用 group   汇总维度用 sum                                
                for(int i=0;i<p1l;i++){
                        // 分析维度部分
                        INormalCell inc3=rd.getCell(2,(short)(i+1));
                        IByteMap map1=new ByteMap();
                        map1.put(INormalCell.VALUE,“ds1.group(”+p1_+“)”);
                        inc3.setExpMap(map1);        
            }
                for(int i=p1l;i<hh;i++){
                        // 汇总维度部分
                        INormalCell inc3=rd.getCell(2,(short)(i+1));
                        IByteMap map1=new ByteMap();
                        map1.put(INormalCell.VALUE,“ds1.sum(”+p2[i-p1l]+“)”);
                        inc3.setFormat(“#0.00”);
                        inc3.setHAlign(INormalCell.HALIGN_RIGHT);
                        inc3.setExpMap(map1);
            }
                // 处理第三行第一个格子数值 及第三行汇总单元格
                INormalCell inc2=rd.getCell(3,(short)1);
                inc2.setValue(“数据合计汇总:”);
                inc2.setLeftHead(“A2”);
                for(int i=p1l;i<hh;i++){
                        INormalCell inc3=rd.getCell(3,(short)(i+1));
                        IByteMap map1=new ByteMap();
                        char c=(char) (i+65);
                        map1.put(INormalCell.VALUE,“sum(”+c+“2{})”);
                        inc3.setFormat(“#0.00”);
                        inc3.setHAlign(INormalCell.HALIGN_RIGHT);
                        inc3.setExpMap(map1);
            }
                // 增加参数,reportBean 方式发布的前提下用不到 设置参数
                /*
                ParamMetaData pmd=new ParamMetaData();
                Param param2 = new Param();
                param2.setParamName(“cols1”);
                param2.setDataType(Types.DT_STRING_SERIES);
                param2.setParamType(Param.PARAM_NORMAL);
                param2.setValue(paramValue1);  
                Param param1 = new Param();
                param1.setParamName(“cols2”);
                param1.setDataType(Types.DT_STRING_SERIES);
                param1.setParamType(Param.PARAM_NORMAL);
                param1.setValue(paramValue2);
                pmd.addParam(param2);
                pmd.addParam(param1);
                rd.setParamMetaData(pmd);
        */
                // 增加数据集
                // 设定 ,stringbuffer 更好, 演示时连上 demo 数据源,此处未设置数据源
                String qsql = “select “+paramValue1+”,”+paramValue2+"from 订单 where 货主地区 is not null order by"+paramValue1;
                DataSetMetaData dsmd=new DataSetMetaData();
                SQLDataSetConfig sdc=new SQLDataSetConfig();  
                sdc.setName(“ds1”);  
                sdc.setSQL(qsql);
                dsmd.addDataSetConfig(sdc);
                rd.setDataSetMetaData(dsmd);


3、部署方式
     文件见附件,其中:rpx 文件为参数表单部分,jsp 为生成报表及展现报表页面,展现采用 reportBean 方式。  
     rpx 部署在 reportFiles 下,jsp 路径为 reportJsp。
     部署好后直接访问 jsp 路径即可。

|

图 1.png(7.12 KB, 下载次数: 0)

图1.png

rfzip