找回密码
 立即注册

QQ登录

只需一步,快速开始

jiangyz1
金牌服务用户   /  发表于:2023-5-18 17:12  /   查看:1583  /  回复:5
spreadjs V16.1
在被保护的工作表内,如何获取所有允许编辑的单元格列表?

5 个回复

倒序浏览
JoestarXu
超级版主   /  发表于:2023-5-18 17:30:34
沙发
您好,被保护的工作表中获取所有允许编辑的单元格,是说设置locked属性为false的单元格吗?
回复 使用道具 举报
jiangyz1
金牌服务用户   /  发表于:2023-5-18 17:45:07
板凳
JoestarXu 发表于 2023-5-18 17:30
您好,被保护的工作表中获取所有允许编辑的单元格,是说设置locked属性为false的单元格吗?

是的,需求是做填报报表,原表不允许修改,因此做了工作表保护,但填报人在填报时可以插入行。
原本想通过命名区域数据实现,但如果原始填报区域只有一行时,新插入的行并不会归入命名区域中,因此准备在鼠标右键菜单中加了复制行功能,复制时应该可以复制locked属性。
提交填报内容时,通过所有locked为false的单元格的值存储。
回复 使用道具 举报
JoestarXu
超级版主   /  发表于:2023-5-19 10:16:46
地板
您好,只能通过遍历每个Cell去实现您的需求,请参考以下代码:

  1. window.onload = function () {
  2.   let designerConfig = JSON.parse(
  3.     JSON.stringify(GC.Spread.Sheets.Designer.DefaultConfig)
  4.   );

  5.   let designer = new GC.Spread.Sheets.Designer.Designer(
  6.     "gc-designer-container",
  7.     designerConfig
  8.   );

  9.   let spread = designer.getWorkbook();

  10.   let sheet = spread.getActiveSheet();

  11.   sheet.getCell(0, 0).value("Hello World");

  12.   sheet.options.isProtected = true;

  13.   sheet.getCell(0, 0).locked(false);

  14.   let range = sheet.getRange(0, 0, sheet.getRowCount(), sheet.getColumnCount());
  15.   for (let i = range.row; i < range.row + range.rowCount; i++) {
  16.     for (let j = range.col; j < range.col + range.colCount; j++) {
  17.       if (!spread.getActiveSheet().getActualStyle(i, j).locked) {
  18.         console.log(`(${i},${j})`);
  19.       }
  20.     }
  21.   }
  22. };
复制代码
回复 使用道具 举报
jiangyz1
金牌服务用户   /  发表于:2023-5-19 14:16:39
5#
JoestarXu 发表于 2023-5-19 10:16
您好,只能通过遍历每个Cell去实现您的需求,请参考以下代码:

感谢,我目前是这样实现的,不知是否有问题:
     for (let index = 0; index < state.workbook.getSheetCount(); index++){
        const sheet = state.workbook.getSheet(index)
        for(let i=0;i < sheet.getRowCount();i++){
          for(let j=0;j < sheet.getColumnCount();j++){
            if (!sheet.getCell(i, j).locked()) {
              console.log(sheet.getValue(i, j))
            }
          }
        }
      }
然后我看到api里有个getUsedRange()获取当前使用过的区域, 可否通过这个api返回结果在返回区域内做遍历,减少循环运算的次数?
回复 使用道具 举报
JoestarXu
超级版主   /  发表于:2023-5-19 14:19:58
6#
jiangyz1 发表于 2023-5-19 14:16
感谢,我目前是这样实现的,不知是否有问题:
     for (let index = 0; index < state.workbook.getSh ...

您好,这是一个不错的想法,理论上来说是可以减少遍历次数的,您可以试一下。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部