找回密码
 立即注册

QQ登录

只需一步,快速开始

Derrick.Jiao 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-2-5 15:54  /   查看:2494  /  回复:0
本帖最后由 DerrickJiao 于 2021-2-8 15:50 编辑

很多新上手的朋友想要实现限制某行或者某列不可编辑,想必或多或少都了解过表单保护。但是,在部分新手的认识里认为表单保护就是让整个表单不可编辑。其实不然,表单保护可以为指定的单元格设置locked属性,可以为true(单元格不可编辑),可以为false(单元格可编辑)。
接下来我们来看下如何为表单设置表单保护。表单保护是设置在表单上的options,因此,只对当前指定的sheet有效,工作簿中的其他sheet是不起作用的。要想对工作簿中的所有sheet都起作用,这需要遍历所有sheet页设置isProtected为true。
  1. sheet.options.isProtected = true;
复制代码

那么,我们如何设置某行或某列不可编辑呢?下面整理了几种方法:
第一种,setStyle:首先,我们先设置表单保护并且将style.locked设为false
  1. sheet.options.isProtected = true;
复制代码

再通过setDefaultStyle将其设为默认样式,这样在表单保护下,所有的单元格都是可以编辑的了
  1. sheet.setDefaultStyle(style)
复制代码
那么我们在创建一个新的style对象并且将style.locked设为true
  1. var style1 = new GC.Spread.Sheets.Style();
  2. style1.locked = true;
复制代码
再通过setStyle将第一行设为不可编辑
  1. sheet.setStyle(0,-1,style1)
复制代码

但是,这种方法会有个问题,就是在导入表单后,通过上述方法设置表单保护不生效,原因是什么呢?这是因为用样式设置locked属性在单元格中会存在样式的优先级。样式在不同的层级结构中具有不同的优先级别, 如下: 单元格 > 行 > 列。所以无法通过设置行样式覆盖单元格上的样式。

那么可以使用getRange方法为单元格设置locked属性,这样能更加灵活。
  1. sheet.options.isProtected = true;
  2. spread.suspendPaint();
  3.                      
  4. sheet.getRange(0,0,1,sheet.getColumnCount()).locked(true)
  5. sheet.getRange(1,0,sheet.getRowCount()-1,sheet.getColumnCount()).locked(false);

  6. spread.resumePaint();
复制代码


值得注意的是getRange方法在v14版本后支持直接传区域,例如sheet.getRange("A1:T20"),这样就会大大提高操作的便利。

0 个回复

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