Derrick.Jiao 发表于 2021-2-5 15:54:56

你所不知道的表单保护

本帖最后由 DerrickJiao 于 2021-2-8 15:50 编辑

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

再通过setDefaultStyle将其设为默认样式,这样在表单保护下,所有的单元格都是可以编辑的了
sheet.setDefaultStyle(style)那么我们在创建一个新的style对象并且将style.locked设为true
var style1 = new GC.Spread.Sheets.Style();
style1.locked = true;再通过setStyle将第一行设为不可编辑
sheet.setStyle(0,-1,style1)
但是,这种方法会有个问题,就是在导入表单后,通过上述方法设置表单保护不生效,原因是什么呢?这是因为用样式设置locked属性在单元格中会存在样式的优先级。样式在不同的层级结构中具有不同的优先级别, 如下: 单元格 > 行 > 列。所以无法通过设置行样式覆盖单元格上的样式。

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

spread.resumePaint();

值得注意的是getRange方法在v14版本后支持直接传区域,例如sheet.getRange("A1:T20"),这样就会大大提高操作的便利。
页: [1]
查看完整版本: 你所不知道的表单保护