`
364434006
  • 浏览: 586761 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

含有动态列的表格在页面上的展现以及通过JXLS导出数据

阅读更多

表结构:
Mytable
(
Point varchar2   --站点
Time timestamp  --时间
Value varchar2   --值
)

Db中的数据存储:
1.站点1,2012-8-1,100.0
2.站点2,2012-8-1,200.0
3.站点3,2012-8-1,250.0
4.站点1,2012-8-2,230.0
5.站点2,2012-8-2,230.0

在前台页面上显示要求做到就数据行转列,如下
时间           站点1       站点2    站点3
2012-8-1        100.0        200.0     250.0
2012-8-2        230.0        230.0      0

这个可以通过oracle的decode函数来实现,如下
Select time,
   decode(point,'站点1',value,0),
   decode(point,'站点2,value,0),
   decode(point,'站点3',value,0)
from mytable group by time;
当然要先明确列站点1,站点2,站点3,这样做也就不满足动态列的需求了(因为这些站点都必须要求硬编码),所以这里可以采用一个存储过程,在里面根据站点分组获取到各个站点迭代可以实现真正的动态列,不过这里的需求没有这么麻烦,我们这里的动态列是通过前台直接传递过来的。所以,在mybatis配置的时候可以如下:
Select time,
  <foreach var ='item' collections="items" sp..=','>
   decode(point,${item},value,0),
  </foreach>
from mytable group by time;
后台sql就这样
前台table展现也是循环动态列
<table>
   <tr>
<td>time</td>
<foreach var="item" collection="items">
   <td>${item}</td>
</foreach>
</tr>
</table>

然后通过jxsl导出,后台数据封装如下:
因为列不固定,所以数据封装使用map
List<Map> lstMap;
lstMap{
    {time:xxx,col1:xxx,col2:xxx,col3:xxx},
    {time:xxx,col1:xxx,col2:xxx,col3:xxx}
}
然后要做如下:
封装动态列到listList<String> lstCol;//这个不多说,前台传递过来的,前台的也是查询db获取到的
封装动态列数据值到lstMap的各个元素中去.
迭代lstMap,获取每个map中的动态列的数据后存储到list中,然后将list存储在map中
Foreach(Map map : lstMap){
List colValues= getDymicColValue(map);
map.put("colValues",colValues);
}

模版配置如下:

Time                                                      <jxl:foreach var="col"  collections="lstCol">${col}</jxl:foreach>
<jxl:foreach var="item" collections="items">
${item.time}                                             <jxl:foreach var="value" collections="item.colValues">${value}</jxl:foreach>
</jxl:foreach>

到这里就已经算是完成了
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics