小厂,用的开源birt做报表,不太符合用户对报表的操作习惯。
用户对报表希望:
- 自定义显示、隐藏列;
- 自定义报表列的显示顺序;
- 自定义报表列宽度;
- 按用户选择的列对表格数据排序
- 固定表头
解决这类问题,有3种思路,
第一种,是全动态的,根据设置动态生成报表文件。
第二种:在beforefactory等函数当中,动态修改相关对象及其属性
第三种:设置相关函数,绑定在特定的元素上。
我们先采取第2种思路实现。
实现列的排序的做法:关键是通过birt设计句柄,获得明细区单元格及头部区单元格,把特定的单元格移动到指定位置,为简单起见,采取全部列重排方式实现。
importPackage(Packages.net.sf.json);
importPackage(Packages.java.io );
importPackage(Packages.org.eclipse.birt.chart.model.data.impl);
importPackage(Packages.org.eclipse.birt.chart.model.component.impl);
importPackage(Packages.org.eclipse.birt.chart.model.type.impl);
importPackage(Packages.org.eclipse.birt.chart.model.attribute);
importPackage(Packages.org.eclipse.birt.chart.model.attribute.impl);
importPackage(Packages.org.eclipse.birt.report.model.api.elements.table);
//******获取表名
var table1= reportContext.getDesignHandle().findElement("table1");
/************排序明细***************/
var details=table1.getDetail();
var detail1=details.getContents().get(0);
//获取明细行的所有单元格
var dcells=detail1.getCells();
//通过前端参数 列出所有明细单元格--获取的是初始位置
var dcell1=dcells.get(position1);//position1 是原来的位置
decell1.moveTo(pos2); //把cell1 挪动到pos2指定位置
......
显示、隐藏列,通过报表设计元素获取表格的列对象,代码直接操作列对象的属性即可。
var table1= reportContext.getDesignHandle().findElement("table1");
var cols=table1.getColumns();
cols.get(pos1).setProperty("display", "none");
设置报表的宽度:
var dynamicHeight=20+"in"; //don't forget the unit
reportContext.getDesignHandle().findMasterPage("Simple MasterPage").setProperty("width", dynamicHeight);
reportContext.getDesignHandle().findMasterPage("Simple MasterPage").pageType="custom";
按特定列对报表数据排序,需要在dataset脚本的beforeOpen中,动态拼接sql
this.queryText ="select * from ("+this.queryText+") order by "+col+" "+sort;
固定表头的实现:
//初始化表头位置
var doc = document.getElementById('Document');
var ras=doc.getElementById('ra'); //ra 是自己定义的表头行的标签
var th=ras.childNodes
for(var i=0;i<th.length;i++){
if(th[i].tagName=="TH"){
th[i].style.position = "absolute";
th[i].style.top = '25px';
th[i].style.width = 103+"px";
th[i].style.height = 17+"px";
}
}
//绑定滚动
if (document.attachEvent) { //IE 中
document.attachEvent('onscroll',function () {
var scrollVal = document.getElementById('Document').scrollTop;
for(var i=0;i<th.length;i++){
if(th[i].tagName=="TH"){
th[i].style.position = "absolute";
th[i].style.top = scrollVal+'px';
}
} });
}else {//firefox googleChorme
doc.addEventListener('scroll', function () {
var scrollleft = document.getElementById('Document').scrollLeft;
var scrolltop = document.getElementById('Document').scrollTop;
if(scrolltop<25){
for(var i=0;i<th.length;i++){
if(th[i].tagName=="TH"){th[i].style.top = '25px';
}
}
}else{for(var i=0;i<th.length;i++){
if(th[i].tagName=="TH"){
th[i].style.top = scrolltop+"px";
}}}}, false);}