Excel.js设置protection{locked:true}后单元格仍可编辑问题求助
解决Excel.js设置单元格不可编辑后仍可编辑的问题
你遇到的核心问题是只设置单元格locked: true但未启用工作表保护——Excel的单元格锁定规则是:只有当工作表处于保护状态时,标记为locked的单元格才会被禁止编辑。
修复步骤:
启用工作表保护
在完成所有单元格的保护属性设置后,调用worksheet.protect()方法,还可按需设置保护密码:mergedWorkbook.eachSheet((worksheet) => { // 你的原有代码... // 最后添加工作表保护 worksheet.protect({ password: "your-password", // 可选,设置后需密码才能取消保护 selectLockedCells: true, // 允许选中锁定单元格,可按需调整 selectUnlockedCells: true // 允许选中未锁定单元格,可按需调整 }); });修正列索引越界问题
你代码里lastColumnIndex = worksheet.columns.length存在索引越界:worksheet.columns的索引从0开始,最后一列的索引应为worksheet.columns.length - 1,修改后:const lastColumnIndex = worksheet.columns.length - 1; const protectedColumns = [0, 1, 2, lastColumnIndex];可选:明确非保护单元格状态
Excel默认所有单元格为locked: true,若要让非保护列/单元格可编辑,需显式设置locked: false:// 遍历所有列,非保护列设置为可编辑 worksheet.columns.forEach((column, columnIndex) => { if (!protectedColumns.includes(columnIndex)) { column.eachCell((cell) => { cell.protection = { locked: false, }; }); } });
完整修正后的代码示例:
mergedWorkbook.eachSheet((worksheet) => { const lastColumnIndex = worksheet.columns.length - 1; const protectedColumns = [0, 1, 2, lastColumnIndex]; // 设置保护列单元格为锁定 worksheet.columns.forEach((column, columnIndex) => { if (protectedColumns.includes(columnIndex)) { column.eachCell((cell) => { cell.protection = { locked: true, }; }); } else { // 设置非保护列单元格为可编辑 column.eachCell((cell) => { cell.protection = { locked: false, }; }); } }); // 设置表头行单元格为锁定 worksheet.getRow(1).eachCell((cell) => { cell.protection = { locked: true, }; }); // 启用工作表保护 worksheet.protect({ password: "optional-password", selectLockedCells: true, selectUnlockedCells: true }); });
内容的提问来源于stack exchange,提问作者Rahul Compani
相关产品推荐
相关产品推荐

