问题:看下图,我需要在咸阳前加 【西安】 在西城和商洛之间加【合计】,并且把西城和西县的值累计到西安一栏;然后把除了西安这一栏之外的值都累加到合计一栏?想想怎么做?
说明:这些数据都是可以从后台读取过来的,在这里暂时不讨论如何实现这样的数据结构。
经过一番功夫就是写代码啦,我们会看到如下的效果:
代码稍后会有提点!!
List<Group> dishiNames = new ArrayList<Group>(); //Group是一个实体类,字段主要有name,id等
dishiNames = loginMonthReport.findCityName(groupId); // dishiNames={"咸阳","宝鸡","渭南市","铜川市","延安","榆林","汉中市","安康市","商洛","西城","西县"}; if(groupId == "2") { Group tempxian = new Group(); tempxian.setId("0828"); tempxian.setName("西安"); dishiNames.add(0, tempxian); // 将西安添加到List的第一个位置变成了dishiNames={"西安","咸阳","宝鸡","渭南市","铜川市","延安","榆林","汉中市","安康市","商洛","西城","西县"}; }
//添加合计名称 Group tempgroup = new Group(); tempgroup.setId("1994"); tempgroup.setName("合计"); if(dishiNames.size() < 2) { dishiNames.add(tempgroup); //当dishiNames大小小于2时,直接在后面添加就行 } else { dishiNames.add(dishiNames.size() - 2, tempgroup); //当dishiNames大于2,将合计添加到倒数第3个位置. }
光添加名称还不行,没有添加数据,使出来这样的效果的:
请看这点代码:
说说思路:不关联数据库的话,我们只用来测试,那么我们就让所有的数据都为0,把每一行都看作一个list集合,然后整体是一个大的List集合,在用el进行遍历即可。这里我只说说合计和西安两栏数据的实现:
List<List<Integer>> lsts = new ArrayList<List<Integer>>(); //最大的 List
lsts=[{0,0,0......},{0,0,0......},{0,0,0......},{0,0,0......},{0,0,0......},{0,0,0......},]; //{0,0,0......}表示每一行数据
//此处将合计值放入lsts的倒数第二个位置 List<Integer> heji = new ArrayList<Integer>(); /*for(int i = 0; i < 32; i++) { heji.add(0); }*/
//竖着相加 for(int k = 0; k < 32; k++) { int sum = 0; for(int i = 0; i < lsts.size(); i++) { for(int j = k; j < lsts.get(i).size(); j++) { sum = sum + lsts.get(i).get(j);//实现了每一行list中的数据一一对应的相加,和放在sum中,
//比如说:{0,0,0......}
{1,0,0......},竖着相加 0+1=1 break;//然后跳出,继续下一列的数据相加 } } heji.add(sum);//把一列的数据和放在heji中 } if(lsts.size() < 3) { lsts.add(lsts.size(), heji); //lsts中没有超过3个的,将合计数据直接加在后面即可。 } else { lsts.add(lsts.size() - 2, heji); //lsts中有超过3个的,将合计数据放在倒数第三个位置。 }
然后再看看西安一栏数据如何添加:
//将西城和西县的数据和累计放在西安下 List<Integer> xianheji = new ArrayList<Integer>(); for(int m = 0; m < 32; m++) { int sum = 0; for(int n = lsts.size() - 1; n >= lsts.size() - 2; --n) { //此处要找到最后两行数据,然后实现累加,跟上面的实现类似。 for(int x = m; x < lsts.get(n).size(); x++) { sum = sum + lsts.get(n).get(x);//103 break; } } xianheji.add(sum); } lsts.add(0, xianheji);
总计一栏我就不说了,横着加,很简单。最终效果类似下图:
这个是我在真实项目中做的报表。代码不敢全贴,只能作为参考。感兴趣的试一试,有问题不董或者想交流的,请留言,看到会回复的。