Clark.Pan 发表于 2020-3-23 11:22:22

如何在导出Excel时带有自动合并(AutoMerge)效果(一)

本帖最后由 Fiooona 于 2020-6-16 17:53 编辑

       SpreadJS在V13版本中推出了自动合并(AutoMerge)功能,该功能可以在展示时按照合并规则自动实现合并效果。但是由于该效果只是画法显示层面的合并,实际上单元格之间并没有进行合并。所以在导出的时候并不会按照展示的效果进行单元格合并。如果场景中需要在导出时候也需要有自动合并的效果,AutoMerge是无法满足的,那么就需要我们自己来设计一套自动合并的算法,并利用单元格合并(addSpan)的功能来进行合并。这样可以确保导出Excel时也可以带有合并的效果。       首先,我们参考AutoMerge功能的设计分为四种合并方向:按行(byRow),按列(byColumn),先按行再按列(byRowColumn),先按列再按行(byColumnRow)。接下来,设计自动合并方式的算法,考虑到byRowColumn,byColumnRow这两种组合合并的方式是基于byRow,byColumn的基础上完成的,所以我们需要先设计byRow,byColumn的算法,主要通过循环来进行判断,下面附上算法的逻辑
byRow:
function spanbyrow(range){
    var spans = [];
    for(var i=range.row;i<range.rowCount;i++){
      var colCount = 1;var col = 0;
      var startValue = sheet.getValue(i,0);
      for(var j=range.col+1;j<range.colCount;j++){
            var currentValue = sheet.getValue(i,j);
            if(currentValue==startValue){
                colCount++;      
            }else{
                sheet.addSpan(i,col,1,colCount);
                var spanRange = new GC.Spread.Sheets.Range(i,col,1,colCount);
                spans.push(spanRange);
                startValue = currentValue;
                col = j;
                colCount = 1;
            }
            //判断是否到达边界
            if(j == range.col+range.colCount-1){
                sheet.addSpan(i,col,1,colCount);
                var spanRange = new GC.Spread.Sheets.Range(i,col,1,colCount);
                spans.push(spanRange);
            }
      }
    }
    return spans;
}显示的效果如下:

导出效果如下:


byColumn:function spanbycolumn(range){
      var spans = [];
      for(var i=range.col;i<range.col+range.colCount;i++){
          var rowCount = 1;var row = 0;
          var startValue = sheet.getValue(0,i);
          for(var j=range.row+1;j<range.row+range.rowCount;j++){
            var currentValue = sheet.getValue(j,i);
            if(currentValue==startValue){
                   rowCount++;
            }else{
                   sheet.addSpan(row,i,rowCount,1);
                   var spanRange = new GC.Spread.Sheets.Range(row,i,rowCount,1);
                   spans.push(spanRange);
                   startValue = currentValue;
                   row = j;
                   rowCount = 1;
            }
            //判断是否到达边界
            if(j == range.row+range.rowCount-1){
                  sheet.addSpan(row,i,rowCount,1);
                  var spanRange = new GC.Spread.Sheets.Range(row,i,rowCount,1);
                  spans.push(spanRange);
            }
          }
      }
      return spans;
}
显示的效果如下:

导出效果如下:


上面是byRow,byColumn的实现,下一期我们会接着介绍byRowColumn,byColumnRow这两组的实现

如何在导出Excel时带有自动合并(AutoMerge)效果(二)




favori 发表于 2020-6-16 17:44:25

挺好的,是需要的东西,期待byRowColumn,byColumnRow

Fiooona 发表于 2020-6-16 17:53:48

已经在文末附上链接啦~

Ellia.Duan 发表于 2023-11-3 16:48:24

我们在新版本中已经实现了这部分内容,欢迎大家点击下面这个链接查看测试:
https://gcdn.grapecity.com.cn/showtopic-198053-1-1.html
页: [1]
查看完整版本: 如何在导出Excel时带有自动合并(AutoMerge)效果(一)