分享 - 动态分组项及汇总列报表实现
| 注:本分享主要说明客户需求及实现的 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)