上回介绍了byRow,byColumn的算法实现,这期我们介绍剩下的byRowColumn,byColumnRow的实现逻辑
首先byRowColumn,byColumnRow的实现需要基于byRow,byColumn的算法实现,具体操作可以参考上一期的内容:如何在导出Excel时带有自动合并(AutoMerge)效果(一)
byRowColumn:
byRowColumn的原理就是在基于按行去合并的基础上,在按列合并所有可合并的单元格,也就是行优先的行列合并。
所以首先需要做的的byRow的操作,在byRow的基础上再循环判断进行byColumn的操作。
- function spanbyrowcolumn(range){
- var spans = spanbyrow(range);
- for(var i=0;i<spans.length;i++){
- var row = spans[i].row;
- var col = spans[i].col;
- var rowCount = spans[i].rowCount;
- var colCount = spans[i].colCount;
- var sourceValue = sheet.getValue(spans[i].row,spans[i].col);
- var spanRowCount = rowCount;
- for(var j=spans[i].row+spans[i].rowCount;j<range.row+range.rowCount;j++){
- var spanFlag = true;
- for(var k=spans[i].col;k<spans[i].col+spans[i].colCount;k++){
- var tempSpan = findSpan(j,k);
- if(tempSpan && tempSpan.colCount != colCount){
- spanFlag = false;
- break;
- }
- if(sourceValue!=sheet.getValue(j,k)){
- spanFlag = false;
- break;
- }
- }
- if(spanFlag){
- spanRowCount++
- sheet.removeSpan(j,col);
- }else{
- break;
- }
- }
- if(spanRowCount>1){
- var compareSpan = findSpan(row,col);
- var currentSpan = new GC.Spread.Sheets.Range(row,col,spanRowCount,colCount);
- if(compareSpan !=null){
- if(!containSpan(currentSpan,compareSpan)){
- sheet.removeSpan(row,col);
- sheet.addSpan(row,col,spanRowCount,colCount);
- }
- }else{
- sheet.removeSpan(row,col);
- sheet.addSpan(row,col,spanRowCount,colCount);
- }
- }
- }
- }
复制代码
这里还需要一些对特殊情况的判断,例如在做列合并的时候上下两列如果都是合并单元格的处理方式,边界的判断等。
合并的结果如下:
之后导出Excel,结果如下:
byColumnRow:
原理与byRowColumn刚好相反,先做列合并再做行合并,核心代码如下:
- function spanbycolumnrow(range){
- var spans = spanbycolumn(range);
- for(var i=0;i<spans.length;i++){
- var row = spans[i].row;
- var col = spans[i].col;
- var rowCount = spans[i].rowCount;
- var colCount = spans[i].colCount;
- var sourceValue = sheet.getValue(spans[i].row,spans[i].col);
- var spanColCount = colCount;
- for(var j=spans[i].col+spans[i].colCount;j<range.col+range.colCount;j++){
- var spanFlag = true;
- for(var k=spans[i].row;k<spans[i].row+spans[i].rowCount;k++){
- var currentValue = sheet.getValue(k,j);
- if(sourceValue!=sheet.getValue(k,j)){
- spanFlag = false;
- break;
- }
- }
- if(spanFlag){
- spanColCount++
- sheet.removeSpan(row,j);
- }else{
- break;
- }
- }
复制代码 合并的结果如下:
导出后结果如下图所示:
以上就是4种合并方式的讲解,具体可以参考附件的demo(需要替换引用的相关js为本地的资源)。
上述的算法仅供参考,只是基于思路的基本实现,没有经过过多的优化,具体应用可以在此基础上再进行一些优化来提升程序的健壮性和性能。
|
|