找回密码
 立即注册

QQ登录

只需一步,快速开始

Winny

超级版主

130

主题

246

帖子

1530

积分

超级版主

Rank: 8Rank: 8

积分
1530
Winny
超级版主   /  发表于:2021-11-25 16:53  /   查看:1511  /  回复:0
本帖最后由 Winny 于 2021-11-25 16:53 编辑

在Excel中提供了对于符合某种结构的数据,根据特定分隔符,对原始内容进行分割,从而生成多列的功能。目前SpreadJS设计器上还没有内置该功能,但通过调用SpreadJS现有API,其实完全可以实现分列功能。本文会详细介绍该功能的实现方法。

1. 创建HTML结构
  1. <body>
  2.     <!-- designer容器 -->
  3.     <div id="designer_host" style="width:100%;height:98vh;border:1px solid darkgray"></div>
  4.     <!-- 设置分列的div 默认隐藏 z-index层级高于designer -->
  5.     <div id="split_model" >
  6.         <p>
  7.             <label>请选择拆分符号:</label>
  8.             <select id='split_symbol'>
  9.                 <option value='.'>点</option>
  10.                 <option value=' '>空格</option>
  11.                 <option value=','>逗号</option>
  12.                 <option value=':'>冒号</option>
  13.                 <option value=';'>分号</option>
  14.             </select>
  15.         </p>
  16.         <p>
  17.             <button id='cancel'>取消</button>
  18.             <button id='split'>确定</button>
  19.         </p>
  20.         
  21.     </div>
  22. </body>
复制代码


2.  分列主体逻辑
  1. function sliceData(designer){
  2.             let select = document.getElementById('split_symbol')
  3.             let index = select.selectedIndex
  4.             let symbol = select.options[index].value
  5.             let spread = designer.getWorkbook()
  6.             let sheet = spread.getActiveSheet()
  7.             let selection = sheet.getSelections()[0]
  8.             let {row,col,rowCount,colCount} = selection
  9.             // 分列功能只能用在一列
  10.             if(colCount!==1){
  11.                 alert('分列仅支持一列,请重新选择数据')
  12.                 return
  13.             }
  14.              //选中一整列时row=1,需要将row替换为0,否则获取数据有问题
  15.             row==-1 ? row = 0 : null   
  16.             // getArray获取选中区域数据
  17.             let splitArray = sheet.getArray(row,col,rowCount,colCount)
  18.             console.log(splitArray)
  19.             let maxLen = 0    //需要添加的列数
  20.             //选区数据根据符号分割逻辑,确定最终需要添加的列数
  21.             for(let i=0; i<splitArray.length;i++){
  22.                 if(splitArray[i] && splitArray[i][0]!=null){
  23.                     let newArray = splitArray[i][0].split(symbol)
  24.                     if(newArray.length > maxLen){
  25.                         maxLen = newArray.length
  26.                     }
  27.                     splitArray[i] = newArray
  28.                 }
  29.             }
  30.             sheet.suspendPaint()            //性能优化 暂停绘制 数据量大时有用
  31.             sheet.addColumns(col+1,maxLen)
  32.             sheet.setArray(row,col+1,splitArray)
  33.             console.log(splitArray)
  34.             sheet.resumePaint()
  35.         }
复制代码


3. 自定义designer,在数据tab下加上分列按钮
  1. let config = GC.Spread.Sheets.Designer.DefaultConfig
  2.         config.commandMap = {
  3.                                 sliceColumn: {
  4.                                         title: "sliceColumn",
  5.                                         text: "分列",
  6.                                         iconClass: "ribbon-button-slice-column",
  7.                                         bigButton: "true",
  8.                                         commandName: "Welcome",
  9.                                         execute: () => {
  10.                         document.getElementById('split_model').style.visibility = 'visible'
  11.                                         }
  12.                                 }
  13.                         }
  14.                         config.ribbon[3].buttonGroups.push({
  15.                                 "label": "自定义的内容",
  16.                                 // "thumbnailClass": "welcome",
  17.                                 "commandGroup": {
  18.                                         "children": [
  19.                                                 {
  20.                                                         "direction": "vertical",
  21.                                                         "commands": [
  22.                                                                 "sliceColumn"
  23.                                                         ]
  24.                                                 }
  25.                                         ]
  26.                                 }
  27.                         });
  28. let designer = new GC.Spread.Sheets.Designer.Designer(document.getElementById("designer_host"),config);
复制代码

4.  设置表单内容,添加监听事件

  1. let spread = designer.getWorkbook();
  2.         let sheet = spread.getActiveSheet()
  3.         sheet.defaults.colWidth = 80
  4.         sheet.setArray(0,0,[
  5.             ['admin.aaa'],
  6.             ['admin.bbb'],
  7.             ['admin.ccc'],
  8.             ['user.aaa'],
  9.             ['user.bbb'],
  10.             ['user.ccc']
  11.         ])

  12.         document.getElementById('split').addEventListener('click',function(){
  13.             sliceData(designer)
  14.             document.getElementById('split_model').style.visibility = 'hidden'
  15.         })
  16.       
  17.         document.getElementById('cancel').addEventListener('click',function(){
  18.             document.getElementById('split_model').style.visibility = 'hidden'
  19.         })
复制代码

最终演示效果及测试demo见文章末尾。

sliceColumn.gif

数据分列.html

7.39 KB, 下载次数: 18

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部