找回密码
 立即注册

QQ登录

只需一步,快速开始

sanyue
中级会员   /  发表于:2024-5-30 15:44:41
11#
Richard.Huang 发表于 2024-5-28 11:41
您好,是的,也就是说您需要维护一个数组,进行判断当前用户编辑的这个单元格是否在这个数组中。如果这个 ...


锁定 + 表单保护的方式:在保存前逐列关闭locked,保存以后再逐个开启locked,在数据量一万行的时候就很耗时了,仅一列不可编辑的时候,取消保护都需要1.5分钟了,更别说实际应用中会配置几十列了

维护一个数组,进行判断当前用户编辑的这个单元格是否在这个数组中:这种是不是就不需要设置设计器保护状态了?也不需要locked?在每个单元格进入编辑状态时做一下前置判断?下拉填充和ctrl+c.ctrl+v粘贴时会监听到编辑状态吗?
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-5-30 17:45:26
12#
您好,我看了一下之前的沟通记录都不太能有效地解决您的问题,您一开始描述的场景里面,用户给C列设置了不可编辑后导出再导入,但是又给C列设置了可编辑,此时C列还是不可编辑状态,因为已经导入了?

根据您的描述来看,给某一列设置编辑\不可编辑状态的时候,表格是没有打开\导入的,对吗?

如果是这样的话,您可以尝试给sheet的tag上添加列可编辑\不可编辑的信息,在每次导入的时候读取这个信息来修改列的编辑状态,比如要求C列不可编辑,那么就先将不可编辑的数据写入到sheet的tag上,然后在读取的时候根据存储的信息将C列的Locked属性置为true,然后在导出时将Locked属性置为false。

也就是说每次导入前先检查tag的信息来设置列的编辑状态,导出前恢复列的编辑状态,在修改列的编辑状态时修改tag的信息。
回复 使用道具 举报
sanyue
中级会员   /  发表于:2024-5-30 18:31:58
13#
Joestar.Xu 发表于 2024-5-30 17:45
您好,我看了一下之前的沟通记录都不太能有效地解决您的问题,您一开始描述的场景里面,用户给C列设置了不 ...

1.打开设计器之后,是先调用一个接口获取到不可编辑的列的数组,不一定是 c 列,也不一定包含 c 列,获取到数组以后,先获取整个表格区域把(0,0,rowcount,colcount) locked 置为 false,再循数组把不可编辑的列 locked 置为 true

2.之前设置为不可编辑的列,打开填报页面之后,填报了一些数据,这时候 tojson 导出的 ssjson 是有保护的,保存到后端,之后再把该列设置为可编辑,刷新填报页面,从接口获取到 ssjson 通过 formjson显示以后,再执行 1 的逻辑,这时候该列是不能编辑的

3.然后我们这边想到的方法就是,在 tojson 之前取消掉保护关系,这个过程是 1 的反逻辑,整个表单 locked 置为 false,不可编辑列的数组也循环了获取到每一列,locked 置为 false,但是在 10000 条的数据下,仅配置一列不可编辑,取消保单保护的逻辑就要执行 1.5 分钟,再多了,页面会卡死崩溃,而我们生产环境可能设置几十列的
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-5-31 10:04:27
14#
了解了,锁定 + 表单保护的方式在面对大数据量的情况下已经触及了前端性能的极限,如果您有使用GcExcel的话可以尝试在GcExcel中操作,性能比前端会好一些。

说回之前另一位版主提出的维护数组根据事件来实现的方法,这种不需要设置表单保护的状态,也不需要设置locked,但是单单editStarting无法覆盖所有的操作,粘贴和下拉填充则需要监听ClipboardPasting和DragFillBlock。

或者也可以根据编辑区域和不可编辑区域的大小来判断,比如编辑区域小,就设置编辑区域,不可编辑区域小,就设置不可编辑区域。除此以外,暂时没有其他更好的方案了。
回复 使用道具 举报
sanyue
中级会员   /  发表于:2024-5-31 14:54:02
15#
Joestar.Xu 发表于 2024-5-31 10:04
了解了,锁定 + 表单保护的方式在面对大数据量的情况下已经触及了前端性能的极限,如果您有使用GcExcel的话 ...

在 GcExcel 中,有取消表单保护的方法吗?后端怎么实现呢?
后端保存前先解锁,填报页面加载完再由前端加锁,你觉得可以解决问题吗?
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-5-31 17:39:49
16#
您好,GcExcel是有取消表单保护的方法的:https://demo.grapecity.com.cn/do ... /unprotectworksheet

我建议您将所有锁定单元格的操作都放在后端操作,前端避免大数据量的操作,否则可能会出现性能问题。
回复 使用道具 举报
sanyue
中级会员   /  发表于:2024-6-3 09:16:09
17#
Joestar.Xu 发表于 2024-5-31 17:39
您好,GcExcel是有取消表单保护的方法的:https://demo.grapecity.com.cn/documents-api-excel-java/demos/ ...

那后端GcExcel怎么配置只给某些列添加保护和取消保护呢?
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-6-3 09:35:19
18#
您好,GcExcel可以获取某些区域来设置locked属性,可以参考:https://demo.grapecity.com.cn/do ... emos/setrangelocked
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 立即注册
返回顶部