找回密码
 立即注册

QQ登录

只需一步,快速开始

Clark.Pan 讲师达人认证 悬赏达人认证 SpreadJS 开发认证

超级版主

200

主题

9908

帖子

1万

积分

超级版主

Rank: 8Rank: 8

积分
15552

讲师达人悬赏达人微信认证勋章SpreadJS 认证SpreadJS 高级认证元老葡萄

Clark.Pan 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-2-2 18:49  /   查看:4023  /  回复:2
本帖最后由 Lynn.Dou 于 2023-1-16 15:09 编辑

在离线填报的场景中,往往需要对离线填报人员做权限控制。这个时候密码保护就显得尤为重要,SpreadJS作为一款在线Excel编辑控件,目前还不能完全支持密码保护的功能(仅支持工作簿密码保护,暂不支持工作表密码保护)。不过SpreadJS当初在设计时候为了保持对Excel最大的兼容,设计上会将Excel的工作表密码相关部分也读入进SpreadJS的ssjson中,之后我们看一下spread.toJSON()序列化之后的json,如下图所示: image.png293513182.png
其中红框所示部分就是工作表的密码保护以及设置的密码相关。
所以我们只要将这一部分保留,就可以在我们设计的模板上添加对应的工作表保护。这里有一点要注意,由于Excel本身会将密码进行一次加密,所以我们无法直接修改json中的对应键值来更改成我们想要的密码,所以我们需要预先导入一次我们设置好对应密码的Excel,用来提取密码的相关信息。这里可以按照下面的演示进行操作:
1.首先导入新建一个Excel,然后给对应的工作表设置对应的密码保护
image.png63324889.png
2.之后将该Excel导入到SpreadJS中,然后通过spread.toJSON();获取整个的json,最后通过代码找到对应的密码保护相关的设置:
  1. var json = spread.toJSON()
  2. 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,如果单纯替换就会导致设计模板时候设置的表单保护选项丢失,例如:我们在设计模板的时候勾选了调整行列大小
image.png797184142.png
这时候protectOptions中会记录
image.png444605407.png
这时候如果我们将之前临时保存的protectOptions直接替换,那么上述设置就会丢失。
所以这里需要如下操作:
先将目前的protectOptions临时保存:
  1. var tempProtectOptions = json.sheets.Sheet1.protectionOptions
复制代码
然后替换为之前带有密码的protectOptions
  1. json.sheets.Sheet1.protectionOptions = protectOptions
复制代码
之后再将tempProtectOptions里面的内容merge进去
  1. <div>json.sheets.Sheet1.protectionOptions.allowResizeRows = true;</div><div>json.sheets.Sheet1.protectionOptions.allowResizeColumns = true;</div>
复制代码
最终将调整之后的ssjson交给ExcelIO进行导出
  1. excelio.save(json, function (blob) {
  2.    
  3.         }, function (e) {
  4.             console.log(e);
  5.         });
复制代码



导出的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


2 个回复

倒序浏览
360bid
中级会员   /  发表于:2020-3-24 16:59:28
沙发
目前还不能完全支持密码保护的功能(仅支持工作簿密码保护,暂不支持工作表密码保护)

我这边导入导出测试刚好相反,保护工作表的密码没问题,而保护工作簿的密码却丢了
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-3-26 09:52:26
板凳
本帖最后由 ClarkPan 于 2020-3-26 10:01 编辑

您可以用这个demo进行测试https://demo.grapecity.com.cn/spreadjs/SpreadJSTutorial/features/client-side-excelio/excel-io/purejs
在红框所示部分输入密码然后导出
image.png676243896.png
这样导出的Excel到在打开的时候会提示输入密码。这个是工作簿保护
暂不支持工作表密码保护的意思是在SpreadJS中无法直接设置带有密码保护的工作表保护
Excel中设置好的工作表保护是可以保留的
你可以在Excel中创建一个带有密码保护的工作表
image.png454998473.png
红框处输入密码
image.png985377197.png
之后将该Excel导入到SpreadJS中再导出,密码保护仍然存在。
但如果导入之后在SpreadJS中取消了工作表保护,之后通过SpreadJS再设置上工作表保护然后导出,你会发现密码不见了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部