找回密码
 立即注册

QQ登录

只需一步,快速开始

wangqgsunway

中级会员

84

主题

224

帖子

740

积分

中级会员

积分
740

[已处理] 单元格锁定

wangqgsunway
中级会员   /  发表于:2019-3-11 14:47  /   查看:5266  /  回复:10
本帖最后由 wangqgsunway 于 2019-3-11 15:13 编辑

按照如下代码执行以后 任何单元格都没有锁定现在的需求是将绑定数据源的数据进行锁定 不可编辑,别的单元格照常编辑;
  1. var spread = designer.wrapper.spread;
  2.     var sheetCount = spread.getSheetCount();
  3.     var sheet;
  4.     for (var i = 0; i < sheetCount; i++) {
  5.             sheet = spread.getSheet(i);

  6.             var rowCount = sheet.getRowCount();
  7.             var columnCount = sheet.getColumnCount();
  8.             for (var row = 0; row < rowCount; row++) {
  9.                     for (var col = 0; col < columnCount; col++) {
  10.                         var bindingPathArray = [];
  11.                         var bindingPathKey;
  12.                         bindingPathKey = sheet.getBindingPath(row, col);
  13.                         if (bindingPathKey) {
  14.                                 sheet.getCell(row, col).locked(true);
  15.                         }        
  16.                     }
  17.             }
  18.             var tables = sheet.tables.all();
  19.         if(tables){
  20.           for (var j = 0; j < tables.length; j++){
  21.             if(tables[j].bindingPath()){
  22.               var range = tables[j].dataRange();  
  23.               var spans =sheet.getSpans(range);
  24.               sheet.getRange(range).locked(true);         
  25.             }
  26.           }
  27.         }
  28.     }
复制代码


单元格锁定问题.rar

2.72 KB, 下载次数: 91

10 个回复

倒序浏览
wangqgsunway
中级会员   /  发表于:2019-3-11 15:14:43
沙发
如果这次您觉得写得没问题的话,能不能远程帮忙看下 我给您操作,告诉我一下您的联系方式我屏幕共享给你
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-3-11 19:03:17
板凳
您好,我运行了您的代码和ssjson文件,排查出一些问题,现将修改后的代码和注释贴出来:

  1. var spread = designer.wrapper.spread;
  2. var sheetCount = spread.getSheetCount();
  3. var sheet;
  4. for (var i = 0; i < sheetCount; i++) {
  5.     sheet = spread.getSheet(i);
  6.     // 先设置表单保护
  7.     sheet.options.isProtected = true;
  8.     // 设置默认样式,取消所有单元格的默认锁定状态
  9.     var defaultStyle = sheet.getDefaultStyle();
  10.     defaultStyle.locked = false;
  11.     sheet.setDefaultStyle(defaultStyle);

  12.     var rowCount = sheet.getRowCount();
  13.     var columnCount = sheet.getColumnCount();
  14.     for (var row = 0; row < rowCount; row++) {
  15.             for (var col = 0; col < columnCount; col++) {
  16.                 var bindingPathArray = [];
  17.                 var bindingPathKey;
  18.                 bindingPathKey = sheet.getBindingPath(row, col);
  19.                 if (bindingPathKey) {
  20.                         sheet.getCell(row, col).locked(true);
  21.                 }&#160; &#160;&#160; &#160;&#160;&#160;
  22.             }
  23.     }
  24.     var tables = sheet.tables.all();
  25. if(tables){
  26.   for (var j = 0; j < tables.length; j++){
  27.     if(tables[j].bindingPath()){
  28.       // dataRange不包含表头,如果需要表头也受保护,用range()
  29.       var range = tables[j].dataRange();&#160;&#160;
  30.       var spans =sheet.getSpans(range);
  31.       // getRange(range)的用法是错误的
  32.       sheet.getRange(range.row, range.col, range.rowCount, range.colCount).locked(true);
  33.     }
  34.   }
  35. }
  36. }
复制代码
回复 使用道具 举报
wangqgsunway
中级会员   /  发表于:2019-3-12 13:18:19
地板
KevinChen 发表于 2019-3-11 19:03
您好,我运行了您的代码和ssjson文件,排查出一些问题,现将修改后的代码和注释贴出来:

按照您给我的修改完毕以后,还是有问题的,图片中标注的列都变成了锁定的状态,第一行的显示数据是没有问题的,从第二行开始,单元格都被锁定了一直到最后一行的单元格数据
问题标注.png
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-3-12 14:32:31
5#
您好,我们的售后电话是 029-88331988 转 620 ,电话接通后您直接找我,陈工,就行。
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-3-12 15:29:16
6#
您好,刚才电话中与您沟通了这个问题,现将代码完善如下:

  1. var spread = designer.wrapper.spread;
  2. var sheetCount = spread.getSheetCount();
  3. var sheet;
  4. for (var i = 0; i < sheetCount; i++) {
  5.     sheet = spread.getSheet(i);
  6.     // 先设置表单保护
  7.     sheet.options.isProtected = true;
  8.     // 设置默认样式,取消所有单元格的默认锁定状态
  9.     var defaultStyle = sheet.getDefaultStyle();
  10.     defaultStyle.locked = false;
  11.     sheet.setDefaultStyle(defaultStyle);

  12.     var rowCount = sheet.getRowCount();
  13.     var columnCount = sheet.getColumnCount();
  14.     // 当前ssjson中没有设置列样式,为防止其它文档出现类似问题,
  15.     // 列样式也遍历一下
  16.     for (var col = 0; col < columnCount; col++) {
  17.         // 去掉单元格中的锁定
  18.         var colStyle = sheet.getStyle(-1, col);
  19.         if(colStyle && colStyle.locked){
  20.            colStyle.locked = false;
  21.            sheet.setStyle(-1, col, colStyle);
  22.         }
  23.     }
  24.     for (var row = 0; row < rowCount; row++) {
  25.             // 去掉行样式中的锁定
  26.             var rowStyle = sheet.getStyle(row, -1);
  27.             if(rowStyle && rowStyle.locked){
  28.                rowStyle.locked = false;
  29.                sheet.setStyle(row, -1, rowStyle);
  30.             }
  31.             for (var col = 0; col < columnCount; col++) {
  32.                 // 去掉单元格中的锁定
  33.                 var cellStyle = sheet.getStyle(row, col);
  34.                 if(cellStyle && cellStyle.locked){
  35.                    cellStyle.locked = false;
  36.                    sheet.setStyle(row, col, cellStyle);
  37.                 }
  38.                 var bindingPathArray = [];
  39.                 var bindingPathKey;
  40.                 bindingPathKey = sheet.getBindingPath(row, col);
  41.                 if (bindingPathKey) {
  42.                         sheet.getCell(row, col).locked(true);
  43.                 }&#160; &#160;&#160; &#160;&#160;&#160;
  44.             }
  45.     }
  46.     var tables = sheet.tables.all();
  47. if(tables){
  48.   for (var j = 0; j < tables.length; j++){
  49.     if(tables[j].bindingPath()){
  50.       // dataRange不包含表头,如果需要表头也受保护,用range()
  51.       var range = tables[j].dataRange();&#160;&#160;
  52.       var spans =sheet.getSpans(range);
  53.       // getRange(range)的用法是错误的
  54.       sheet.getRange(range.row, range.col, range.rowCount, range.colCount).locked(true);
  55.     }
  56.   }
  57. }
  58. }
复制代码
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-3-12 16:58:03
7#
您好,SpreadSJS样式相关的资料如下:

1、学习指南示例:

https://demo.grapecity.com.cn/Sp ... ample/#/demos/style

2、技术博客:

https://www.grapecity.com.cn/blo ... ply-spreadjs-styles

3、getActualStyle  API:

http://help.grapecity.com/spread ... getActualStyle.html
回复 使用道具 举报
wangqgsunway
中级会员   /  发表于:2019-3-12 17:46:42
8#
KevinChen 发表于 2019-3-12 16:58
您好,SpreadSJS样式相关的资料如下:

1、学习指南示例:

您好,我刚才试了一下你说的那几个方法,在获取到单元格的实际样式的时候,被锁定的单元格的确是锁定状态;这个模板是新建的,并没有操作过,在把数据源拖拽过去以后,也没有做其他操作,但是在显示数据的第三行开始,单元格的locked 就为 true了;

因为我们这边有一些单元格在模板里面是需要锁定的,所以不能对所有单元格进行解锁操作;
有没有好的解决方法;

单元格锁定问题 (1).rar

2.57 KB, 下载次数: 80

回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-3-13 11:32:46
9#
您好,我在控制台打印了一下你提供的ssjson文件,发现目前已经有一批单元格设置了样式,

并且添加了locked属性,同时表单已经设置了保护。

那么实际上现在问题就在于这些样式是怎么引入进来的,

如您所说,您这边只操作了新建模板和数据源拖拽的操作,只能从操作上寻找问题了,

请提供一下您生成模板的步骤,我这边重现一下看看哪里引入了locked样式。
回复 使用道具 举报
wangqgsunway
中级会员   /  发表于:2019-3-13 16:21:23
10#
KevinChen 发表于 2019-3-13 11:32
您好,我在控制台打印了一下你提供的ssjson文件,发现目前已经有一批单元格设置了样式,

并且添加了lock ...
  1. /**
  2. * 数据表格样式复制(复制第一行的样式)(针对绑定的列表数据)
  3. */
  4. //需求:在多行表格的情况下并表格的数据条数少于表格一行数据占据的行数的时候,实际出来的行数是少于编写模板的时候的行数的(具体的行数是数据源带出来的数据的条数)
  5. //解决方案:在setDataSource之前判断出需要的数据条数,即当是上面的情况下,我们需要为数据源设置数据。并且将正确数据的情况记录。加载行数的时候使用设置的数据。实际显示数据的时候使用正确的数据
  6. function copyTableStyle(sheet, table,lengthtc) {//参数三:数组->key:表格信息->value:rowtc->做row隐藏操作
  7.         if (!table.bindingPath())
  8.                 return;
  9.         var bindingPath = table.bindingPath();
  10.         var range = table.dataRange();
  11.         var rowHeight = sheet.getRowHeight(range.row);
  12.         var spans =sheet.getSpans(range);
  13.         var spansColumns = [];
  14.         var rowtc = 1;//默认情况下一条数据只占用一行,这里获取最大合并单元格数
  15.         for(var i=0;i<spans.length;i++) {//获取当前列表里面的合并信息
  16.                 if(spans[i].row == range.row){
  17.                         var spansColumn = {row:spans[i].row,col:spans[i].col,rowCount:spans[i].rowCount,colCount:spans[i].colCount};
  18.                         if(spans[i].rowCount>rowtc)
  19.                                 rowtc = spans[i].rowCount;
  20.                         spansColumns.push(spansColumn);
  21.                         //sheet.removeSpan(spans[i].row, spans[i].col);//取消合并
  22.                 }
  23.         }
  24.         //洁净度_温湿度_需求:合并检测区域、级别、结论&&两条数据的结论一致
  25.         var is_humiture = false;//防止刷新数据的时候 两次合并处理
  26.         if(table.bindingPath()==='列表反写数据.多结果列表反存'&&range.rowCount%2===0){
  27.                 var index_detectarea = null;
  28.                 var index_level = null;
  29.                 var index_conclusion =null;
  30.                 for(var index = 0;index<range.colCount;index++){
  31.                         if(table.getColumnDataField(index)==='检测区域'){
  32.                                 if(sheet.getValue(range.row,range.col+index)==sheet.getValue(range.row+1,range.col+index))
  33.                                 index_detectarea = index;
  34.                                
  35.                         }else if(table.getColumnDataField(index)==='级别'){
  36.                                 if(sheet.getValue(range.row,range.col+index)==sheet.getValue(range.row+1,range.col+index))
  37.                                         index_level = index;
  38.                                
  39.                         }else if(table.getColumnDataField(index)==='结论'){
  40.                                 if(sheet.getValue(range.row,range.col+index)==sheet.getValue(range.row+1,range.col+index))
  41.                                         index_conclusion = index;
  42.                         }
  43.                 }
  44.                 if(index_detectarea!=null&&index_level!=null&&index_conclusion!=null){
  45.                         if(!is_humiture)
  46.                                 is_humiture = true;
  47.                 }
  48.         }
  49.         if(rowtc >1 && !is_humiture){
  50.                 var looptimes = lengthtc||range.rowCount;
  51.                 sheet.addRows(range.row, rowtc*(looptimes));//插入需要的行-合并行数*数据条数
  52.                 for (var i = 1; i <= looptimes; i++) {//复制格式以及复制公式以及设置行高
  53.                         for ( var key in spansColumns) {
  54.                                 var row = spansColumns[key].row;
  55.                                 var col = spansColumns[key].col;
  56.                                 var colCount = spansColumns[key].colCount;
  57.                                 var rowCount = spansColumns[key].rowCount;
  58.                                 sheet.addSpan(range.row + rowtc*(i-1), col, rowCount,colCount);
  59.                         }
  60.                         sheet.copyTo(range.row + looptimes*rowtc, -1, range.row + rowtc*(i-1), -1, rowtc,
  61.                                         range.colCount, GC.Spread.Sheets.CopyToOptions.style);
  62.                         sheet.copyTo(range.row + looptimes*rowtc+(i-1), -1, range.row + rowtc*(i-1), -1, 1,
  63.                                         range.colCount, GC.Spread.Sheets.CopyToOptions.value);
  64.                         sheet.copyTo(range.row + looptimes*rowtc, -1, range.row + rowtc*(i-1), -1, 1,
  65.                                         range.colCount, GC.Spread.Sheets.CopyToOptions.formula);
  66.                         sheet.setRowHeight(range.row + rowtc*(i-1), rowHeight);
  67.                 }
  68.                 sheet.deleteRows(range.row + looptimes*rowtc,range.rowCount);
  69.         }else{
  70.                 for (var i = 1; i < range.rowCount; i++) {
  71.                         // Copy Style
  72.                         sheet.copyTo(range.row + i - 1, -1, range.row + i, -1, 1,
  73.                                         range.colCount, GC.Spread.Sheets.CopyToOptions.style);
  74.                         // Copy Formula
  75.                         sheet.copyTo(range.row + i - 1, -1, range.row + i, -1, 1,
  76.                                         range.colCount, GC.Spread.Sheets.CopyToOptions.formula);
  77.                         // 高度设置
  78.                         sheet.setRowHeight(range.row + i, rowHeight);
  79.                         // 合并单元格
  80.                         for ( var key in spansColumns) {
  81.                                 var row = spansColumns[key].row;
  82.                                 var col = spansColumns[key].col;
  83.                                 var colCount = spansColumns[key].colCount;
  84.                                 try{//温湿度这里会在刷新数据的时候报错//当有列合并的时候
  85.                                         sheet.addSpan(range.row + i, col, 1,colCount);
  86.                                 }catch (e) {
  87.                                         console.log("合并单元格err"+(range.row + i)+"-"+ col+"-"+ 1+"-"+colCount)
  88.                                 }
  89.                                 }
  90.                         }
  91.                 //洁净度_温湿度_需求:合并检测区域、级别、结论&&两条数据的结论一致
  92.                 if(table.bindingPath()==='列表反写数据.多结果列表反存'&&range.rowCount%2===0){
  93.                         var index_detectarea = null;
  94.                         var index_level = null;
  95.                         var index_conclusion =null;
  96.                         for(var index = 0;index<range.colCount;index++){
  97.                                 if(table.getColumnDataField(index)==='检测区域'){
  98.                                         if(sheet.getValue(range.row,range.col+index)==sheet.getValue(range.row+1,range.col+index))
  99.                                         index_detectarea = index;
  100.                                        
  101.                                 }else if(table.getColumnDataField(index)==='级别'){
  102.                                         if(sheet.getValue(range.row,range.col+index)==sheet.getValue(range.row+1,range.col+index))
  103.                                                 index_level = index;
  104.                                        
  105.                                 }else if(table.getColumnDataField(index)==='结论'){
  106.                                         if(sheet.getValue(range.row,range.col+index)==sheet.getValue(range.row+1,range.col+index))
  107.                                                 index_conclusion = index;
  108.                                 }
  109.                         }
  110.                         if(index_detectarea!=null&&index_level!=null&&index_conclusion!=null){
  111.                                 //合并操作
  112.                                 var n = 0;
  113.                                 var range_detectarea = new GC.Spread.Sheets.Range(range.row + n*2, range.col+index_detectarea, 1, 1);
  114.                                 var sp_range_detectarea = sheet.getSpans(range_detectarea);
  115.                                 var range_level = new GC.Spread.Sheets.Range(range.row + n*2, range.col+index_level, 1, 1);
  116.                                 var sp_range_level = sheet.getSpans(range_level);
  117.                                 var range_conclusion = new GC.Spread.Sheets.Range(range.row + n*2, range.col+index_conclusion, 1, 1);
  118.                                 var sp_range_conclusion = sheet.getSpans(range_conclusion);
  119.                                 for(n ;n<range.rowCount/2;n++){
  120.                                         sheet.addSpan(range.row + n*2, range.col+index_detectarea, 2,1+(sp_range_detectarea[0]==undefined?0:(sp_range_detectarea[0].colCount-1)));
  121.                                         sheet.addSpan(range.row + n*2, range.col+index_level, 2,1+(sp_range_level[0]==undefined?0:(sp_range_level[0].colCount-1)));
  122.                                         sheet.addSpan(range.row + n*2, range.col+index_conclusion, 2,1+(sp_range_conclusion[0]==undefined?0:(sp_range_conclusion[0].colCount-1)));
  123.                                         //下面格子等于上面的格子
  124.                                         var letter = String.fromCharCode(64 + parseInt(range.col+index_conclusion+1));
  125. //                                        console.log(letter);
  126.                                         sheet.setFormula(range.row + n*2+1, range.col+index_conclusion,
  127.                                                         ""+letter+(range.row + n*2+1),GC.Spread.Sheets.SheetArea.viewport);
  128.                                 }
  129.                         }
  130.                 }
  131.         }
  132. }
复制代码


我排查了一下  是这段代码的问题 ,但是我看不出原因 麻烦您帮忙看一下
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部