本帖最后由 Lynn.Dou 于 2023-1-16 15:09 编辑
在离线填报的场景中,往往需要对离线填报人员做权限控制。这个时候密码保护就显得尤为重要,SpreadJS作为一款在线Excel编辑控件,目前还不能完全支持密码保护的功能(仅支持工作簿密码保护,暂不支持工作表密码保护)。不过SpreadJS当初在设计时候为了保持对Excel最大的兼容,设计上会将Excel的工作表密码相关部分也读入进SpreadJS的ssjson中,之后我们看一下spread.toJSON()序列化之后的json,如下图所示:
其中红框所示部分就是工作表的密码保护以及设置的密码相关。
所以我们只要将这一部分保留,就可以在我们设计的模板上添加对应的工作表保护。这里有一点要注意,由于Excel本身会将密码进行一次加密,所以我们无法直接修改json中的对应键值来更改成我们想要的密码,所以我们需要预先导入一次我们设置好对应密码的Excel,用来提取密码的相关信息。这里可以按照下面的演示进行操作:
1.首先导入新建一个Excel,然后给对应的工作表设置对应的密码保护
2.之后将该Excel导入到SpreadJS中,然后通过spread.toJSON();获取整个的json,最后通过代码找到对应的密码保护相关的设置:
- var json = spread.toJSON()
- var protectOptions = json.sheets.Sheet1.protectionOptions
复制代码 这里由于Excel中默认是在Sheet1这个sheet上设置的密码保护,所以这里需要用json.sheets.Sheet1.protectionOptions来获取对应的protectOptions设置。然后将其暂时存储在变量中以备后用。
3.接下来我们正常设计填报模板,这里根据使用设计器还是在线表格编辑器的不同,方法也不同,不过原理是相同的,就是将临时保存的protectOptions merge到最终生成的ssjson中。因为SpreadJS的ExcelIO导出Excel时需要的是spread序列化toJSON生成的ssjson.这时通过js的操作我们可以将之前临时保存的protectOptions merge进去。这里由于在设计表单保护时的勾选操作也会更改protectionOptions,如果单纯替换就会导致设计模板时候设置的表单保护选项丢失,例如:我们在设计模板的时候勾选了调整行列大小
这时候protectOptions中会记录
这时候如果我们将之前临时保存的protectOptions直接替换,那么上述设置就会丢失。
所以这里需要如下操作:
先将目前的protectOptions临时保存:
- var tempProtectOptions = json.sheets.Sheet1.protectionOptions
复制代码 然后替换为之前带有密码的protectOptions
- json.sheets.Sheet1.protectionOptions = protectOptions
复制代码 之后再将tempProtectOptions里面的内容merge进去
- <div>json.sheets.Sheet1.protectionOptions.allowResizeRows = true;</div><div>json.sheets.Sheet1.protectionOptions.allowResizeColumns = true;</div>
复制代码 最终将调整之后的ssjson交给ExcelIO进行导出
- excelio.save(json, function (blob) {
-
- }, function (e) {
- console.log(e);
- });
复制代码
导出的Excel中就会带有密码了,密码就是之前导入Excel中设置的密码,这样在离线填报时候控制填报人员的操作权限了,由于有密码,填报人员也无法进行手动更改。
下方链接为示例demo,供参考:
https://jscodemine.grapecity.com/share/JwtdNAdlPE2JLQo4qXVMuQ/?defaultOpen=%7B%22OpenedFileName%22%3A%5B%22%2Findex.html%22%2C%22%2Fsrc%2Fapp.js%22%5D%2C%22ActiveFile%22%3A%22%2Fsrc%2Fapp.js%22%7D
|