Apache POI只读保护下如何允许XWPFTable新增行
问题场景
开发需为docx文件配置只读保护,仅开放部分字段编辑权限,已通过底层permStart/permEnd标签完成可编辑范围标记,核心实现代码如下:
pInit.getCTP().addNewPermStart(); // 中间为可编辑范围的段落/内容逻辑 pEnd.getCTP().addNewPermEnd();
开启全文档SHA1哈希加密只读保护的代码如下:
document.enforceReadonlyProtection(wordLockedPass, HashAlgorithm.sha1);
执行上述保护逻辑后,用户向XWPFTable对象新增行的操作被系统拦截,需调整配置实现全文档只读前提下,允许指定表格新增行的需求。
实现方案
Word的只读保护默认会锁定所有表格的结构编辑权限,仅在表格内部段落打permStart/permEnd标记不会放开表格行增删的结构权限,需按以下步骤配置:
- 移除目标表格的全局锁定属性
操作表格底层CTTbl对象,清除表格级的强制锁配置,代码如下:// 获取目标表格的底层XML对象 CTTbl ctTbl = targetXWPFTable.getCTTbl(); // 获取表格属性节点,不存在则新建 CTTblPr tblPr = ctTbl.getTblPr() == null ? ctTbl.addNewTblPr() : ctTbl.getTblPr(); // 移除表格全局锁定配置 if (tblPr.isSetTblLocked()) { tblPr.unsetTblLocked(); } - 调整可编辑权限范围的包裹逻辑
不要将permStart/permEnd标记打在表格内部的单元格段落中,要将权限起始标记放在表格紧邻的前序段落末尾,结束标记放在表格紧邻的后序段落开头,把整个表格完整纳入可编辑权限范围。
注意:如果仅需允许用户新增行、不需要修改表格已有固定内容,可单独为不需要编辑的单元格配置内容锁定,仅保留行结构编辑权限即可。 - 按需配置细粒度表格权限(可选)
如果需要限制用户仅能新增行,不能删除已有行、修改列结构或表格样式,可通过表格保护节点配置细粒度规则,代码如下:CTTblProtection tblProtection = tblPr.isSetTblProtection() ? tblPr.getTblProtection() : tblPr.addNewTblProtection(); // 禁止删除已有行 tblProtection.setDelRow(STOnOff.TRUE); // 禁止删除列 tblProtection.setDelCol(STOnOff.TRUE); // 允许插入新行 tblProtection.setInsRow(STOnOff.FALSE); // 禁止修改表格格式 tblProtection.setChangeFormatting(STOnOff.TRUE);
校验规则
配置完成后需验证以下效果:
- 文档非开放区域处于只读状态,无法编辑修改
- 指定开放编辑的字段可正常输入修改
- 目标表格可正常右键插入新行,若配置了细粒度规则,删除行、修改列等越权操作会被拦截
- 文档保护密码生效,无密码无法修改保护配置
内容的提问来源于stack exchange,提问作者mz0
相关产品推荐
相关产品推荐

