bir简单报表动态定义排序及自定义显示、隐藏列,报表宽度

小厂,用的开源birt做报表,不太符合用户对报表的操作习惯。

用户对报表希望:

  1. 自定义显示、隐藏列;
  2. 自定义报表列的显示顺序;
  3. 自定义报表列宽度;
  4. 按用户选择的列对表格数据排序
  5. 固定表头


解决这类问题,有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);}

猜你喜欢

转载自blog.csdn.net/wh_xia_jun/article/details/80691994