最近做的一个物流项目,其主要操作是处理上传和下载Excel文件的,主要用的第三方的Poi的jar包。前几天遇到个问题,纠结了好几天终于得以解决,现将过程记录下。
作成结构相同的多sheet的Excel文件,其中根据业务要求,sheet中分为两块,一块是固定部分要求锁定,
不能做修改、插入及删除行列的操作,另一部分是动态部分,只允许删除列。
本来以为不难实现,然而在做到动态部分允许删除列时,一直存在问题,开始的思路是在模板文件的sheet中将动态可删除列部分全选中,右击设置单元格格式–在保护界面将锁定前面的勾去掉,再设置保护sheet(审阅–保护工作表–勾选上面的保护工作表及锁定的单元格内容–勾选删除列及其他需要的属性),然后复制模板sheet将数据写入就可以了。
然而在做sheet复制后,新复制出来的sheet丢失了保护属性,看来在模板中设置保护属性再复制的思路行不通,郁闷,于是上网搜索,提到poi中对于sheet对象提供了protectSheet(String password)方法,于是对于新复制出来的sheet设置该属性,可是问题又来了,下载下来的Excel文件保护工作表选项中没有勾选删除列,于是查看Poi源码,发现protectSheet的方法如下:
@Override
public void protectSheet(String password) {
if (password != null) {
CTSheetProtection sheetProtection = safeGetProtectionField();
setSheetPassword(password, null); // defaults to xor password