当前位置: 代码迷 >> Web前端 >> ext报表合并单元格的方法
  详细解决方案

ext报表合并单元格的方法

热度:93   发布时间:2012-10-24 14:15:58.0
ext表格合并单元格的方法

//合并表头的方法extjs的官网上有,这里提供的是合并数据单元格的方法

?

//首先在页面上添加以下内容

<style>?
?/*与表头对齐*/
??.x-grid3-row td, .x-grid3-summary-row td{
??????? padding-right: 0px;
??????? padding-left: 0px;
??????? padding-top: 0px;
??????? padding-bottom: 0px;
??? }
??? /*去掉行间空白*/
??? .x-grid3-row {
??? ?border-right-width: 0px;
??? ?border-left-width: 0px;
??????? border-top-width: 0px;
??????? border-bottom-width: 0px;
?}
</style>

?

//然后在表格加载数据时调用下面的函数

//合并单元格的函数,合并表格内所有连续的具有相同值的单元格。调用方法示例:grid.on('load',function(){gridSpan(grid,'row','1px solid #8080FF');});
//参数:grid-需要合并的表格,rowOrCol-合并行还是列,borderStyle-合并后单元格分隔线样式
function gridSpan(grid, rowOrCol, borderStyle){
	var array1 = new Array();
	var count1 = 0;
	var count2 = 0;
	var index1 = 0;
	var index2 = 0;
	var aRow = undefined;
	var preValue = undefined;
	var firstSameCell = 0;
	var allRecs = grid.getStore().getRange();
	
	if(rowOrCol == 'row'){
		count1 = grid.getColumnModel().getColumnCount();
		count2 = grid.getStore().getCount();
	} else {
		count1 = grid.getStore().getCount();
		count2 = grid.getColumnModel().getColumnCount();
	}
	
	for(i = 0; i < count1; i++){
		preValue = undefined;
		firstSameCell = 0;
		array1[i] = new Array();
		for(j = 0; j < count2; j++){
			if(rowOrCol == 'row'){
				index1 = j;
				index2 = i;
			} else {
				index1 = i;
				index2 = j;
			}
			var colName = grid.getColumnModel().getColumnId(index2);
			if(allRecs[index1].get(colName) == preValue){
				allRecs[index1].set(colName, '&nbsp;');
				array1[i].push(j);
				if(j == count2 - 1){
					var index = firstSameCell + Math.round((j + 1 - firstSameCell) / 2 - 1);
					if(rowOrCol == 'row'){
						allRecs[index].set(colName, preValue);
					} else {
						allRecs[index1].set(grid.getColumnModel().getColumnId(index), preValue);
					}
				}
			} else {
				if(j != 0){
					var index = firstSameCell + Math.round((j + 1 - firstSameCell) / 2 - 1);
					if(rowOrCol == 'row'){
						allRecs[index].set(colName, preValue);
					} else {
						allRecs[index1].set(grid.getColumnModel().getColumnId(index), preValue);
					}
				}
				firstSameCell = j;
				preValue = allRecs[index1].get(colName);
				allRecs[index1].set(colName, '&nbsp;');
				if(j == count2 - 1){
					allRecs[index1].set(colName, preValue);
				}
			}
		}
	}
	grid.getStore().commitChanges();
	
	//添加所有分隔线
	for(i = 0; i < grid.getStore().getCount(); i ++){
		for(j = 0; j < grid.getColumnModel().getColumnCount(); j ++){
			aRow = grid.getView().getCell(i,j);
			aRow.style.borderTop = borderStyle;
			aRow.style.borderLeft = borderStyle;
		}
	}
	
	//去除合并的单元格的分隔线
	for(i = 0; i < array1.length; i++){
		for(j = 0; j < array1[i].length; j++){
			if(rowOrCol == 'row'){
				aRow = grid.getView().getCell(array1[i][j],i);
				aRow.style.borderTop = 'none';
			} else {
				aRow = grid.getView().getCell(i, array1[i][j]);
				aRow.style.borderLeft = 'none';
			}		
		}
	}
}

?

?

?

注意:表格太大时可能导致页面暂时失去响应,稍等即可

合并后的效果:附件

?

1 楼 ct_xiao0310 2010-08-23  
可以发送一个能运行的例子吗?我的邮箱307851104qq.com 谢谢!
2 楼 hyw100200 2011-11-04  
我用的假数据  一直没法调用load事件
3 楼 hyw100200 2011-11-04  
能给个完整代码吗 hyw100200@163.com  谢谢
4 楼 eung 2012-02-06  
求完整代码   78086473@qq.com  非常感谢!!
5 楼 eung 2012-02-07  
grid.on('load',function(){gridSpan(grid,'row','1px solid #8080FF');});是错误的,应该是用STORE.只有STORE才有ON事件.加载成功,只是样式还有问题.大伙一起研究一下.
6 楼 one_sandy 2012-02-25  
能发一个例子给我吗?邮箱1197641453@qq.com
7 楼 gudujian6169 2012-06-13  
能给我发一份吗?谢谢您616967508@qq.com
8 楼 xiangyingchen 2012-07-18  
可以给我发送一个能运行的例子吗?我的邮 lovejavaying@gmail.com 谢谢!
9 楼 bflcf 2012-08-18  
能给我发一份吗?谢谢您bflcf@126.com
10 楼 bflcf 2012-08-18  
按照您的方法进行加载,但一点效果都没有
11 楼 beijingliuqi 2012-09-27  
代码复制后没效果,请发一份完整的可以运行的代码 谢谢了
337685789@qq.com
  相关解决方案