本帖最后由 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)效果(二)
|
|