Winny 发表于 2021-9-10 14:12:06

SpreadJS结合数据绑定实现自助式报表设计

本帖最后由 Winny 于 2021-9-10 14:15 编辑

客户需求: 类简道云报表设计,希望结合SpreadJS设计器数据绑定的功能,在拖动字段的同时,可以同时在目标单元格上添加对应的单元格类型,这样更加方便快捷的实现报表设计。

使用设计器进行数据绑定时,目前并没有对应的监听事件,因此想要实现该需求需要对相关的绑定函数进行重写,重写方法如下:
let oldFn = GC.Spread.Sheets.CellRange.prototype.bindingPath;
GC.Spread.Sheets.CellRange.prototype.bindingPath = function(val){
    oldFn.apply(this,arguments)
    if(val){
      //do soethings
    }
}接下来就是需要在//do somethings中编写增加组件的功能了,我在这里编写了一个相对简单的函数,大家可以根据业务逻辑编写函数。
function addCellType(val,row,col){
    switch(val){
      case 'combox':
            let combo = new GC.Spread.Sheets.CellTypes.ComboBox()
            combo.items([
                {text: 'Oranges', value: '11k'},
                {text: 'Apples',value: '15k'},
                {text: 'Grape',value: '100k'}
             ])
            combo.editable(true)
            sheet.setCellType(row,col,combo)
            break;
      case 'radio':
            let radio = new GC.Spread.Sheets.CellTypes.RadioButtonList()
            radio.items([
                {text: 'Oranges',value: '1'},
                {text: 'Apple',value: '2'},
                {text: 'Grape',value: '3'}
            ])
            radio.direction(GC.Spread.Sheets.CellTypes.Direction.vertical)
            radio.textAlign(GC.Spread.Sheets.CellTypes.TextAlign.left)
            radio.boxSize(16)
            sheet.setCellType(row,col,radio)
            break;
         default:
            let checkbox = new GC.Spread.Sheets.CellTypes.CheckBoxList()
            checkbox.items([
               {text: "a",value: 1},{text: "b",value: 2},{text: "c",value: 3}
            ])
            sheet.setCellType(row,col,checkbox)
       }
                        }最后将//do somethings替换为 addCellType函数调用即可,具体调用方式如下:
GC.Spread.Sheets.CellRange.prototype.bindingPath = function (val) {
    oldFn.apply(this, arguments);
    if (val) {
      addCellType(val,this.row,this.col)
    }
                        }经过上边的操作之后,就可以去设计器验证是否可以正常使用了。验证方法:
step1: 添加数据绑定数据源
设计器中点击数据 -> 模板,添加测试数据字段

step2: 拖动字段至单元格中

可以看到,进行数据绑定的同时,单元格类型也已经设置好了。
但此时有用户会有疑问,那改写之后,数据绑定的功能是否还在呢?我们接着进行测试一下。
step3: 绑定数据

可以看到,绑定数据的功能还是正常可以使用的。可以尝试修改一下单元格的内容,之后获取绑定数据。

观察可知,修改之后的数据还是可以正常获取。

友情提示: 这种方式进行报表设计的弊端也是显而易见的,首先数据绑定的方式,即使拖出多个组件,但这些组件映射的数据绑定字段(key)都是同一个,导致获取结果时,只能取得一个字段。在设计时可以将使用同一个组件的key用类似的key来做定义,这样在case判断时这类key可以走同一个逻辑,例如combox1,combox2,combox3等等类似的key,case中主要包含combox就可以走一个逻辑,从而避免多个组件使用同一key的问题,但是这种方式也有一个好处,就是多个组件之间是联动的,具体实现方式还是需要用户结合自己的应用场景做更加灵活的设计,本文只是一种实现思路。

测试代码见附件index.html


Richard.Huang 发表于 2023-8-7 16:25:26

上述的CDN已经老旧,可以参考该CDN:
页: [1]
查看完整版本: SpreadJS结合数据绑定实现自助式报表设计