找回密码
 立即注册

QQ登录

只需一步,快速开始

Clark.Pan 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-3-23 11:22  /   查看:5531  /  回复:3
本帖最后由 Fiooona 于 2020-6-16 17:53 编辑

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

byColumn:
  1.   function spanbycolumn(range){
  2.       var spans = [];
  3.       for(var i=range.col;i<range.col+range.colCount;i++){
  4.           var rowCount = 1;var row = 0;
  5.           var startValue = sheet.getValue(0,i);
  6.           for(var j=range.row+1;j<range.row+range.rowCount;j++){
  7.               var currentValue = sheet.getValue(j,i);
  8.               if(currentValue==startValue){
  9.                    rowCount++;
  10.               }else{
  11.                    sheet.addSpan(row,i,rowCount,1);
  12.                    var spanRange = new GC.Spread.Sheets.Range(row,i,rowCount,1);
  13.                    spans.push(spanRange);
  14.                    startValue = currentValue;
  15.                    row = j;
  16.                    rowCount = 1;
  17.               }
  18.               //判断是否到达边界
  19.               if(j == range.row+range.rowCount-1){
  20.                   sheet.addSpan(row,i,rowCount,1);
  21.                   var spanRange = new GC.Spread.Sheets.Range(row,i,rowCount,1);
  22.                   spans.push(spanRange);
  23.               }
  24.           }
  25.       }
  26.       return spans;
  27.   }
复制代码

显示的效果如下:
image.png534064330.png
导出效果如下:
image.png149732359.png

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

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




3 个回复

倒序浏览
favori讲师达人认证
金牌服务用户   /  发表于:2020-6-16 17:44:25
沙发
挺好的,是需要的东西,期待byRowColumn,byColumnRow

评分

参与人数 1金币 +66 收起 理由
Fiooona + 66 已经在文末附上链接拉~

查看全部评分

回复 使用道具 举报
Fiooona
论坛元老   /  发表于:2020-6-16 17:53:48
板凳
已经在文末附上链接啦~
组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-11-3 16:48:24
地板
我们在新版本中已经实现了这部分内容,欢迎大家点击下面这个链接查看测试:
https://gcdn.grapecity.com.cn/showtopic-198053-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部