效果
当时产品经理的需求是:
只有指定的列指定内容允许修改,其它地方都不允许修改和新增,
如图下,只有红色框框内容允许修改,红色框框以外均不能修改
,下面的空白的excel也不允许新增操作
然后就是禁止调整列宽, 当然也可以设置允许调整列宽.
只要你修改就会弹出下面的警告
解决代码
我是根据公司的通用的 POI工具类改造的,写的比较粗.大概是那个意思,不要纠结细节,
后续代码有优化我再发出来.
重点看我下面代码注释带有"!!! "感叹号的代码,这个是控制excel是否编辑的核心代码.
/**
*
* @param collection 每行数据的集合
* @param sheet sheet页
* @param workbook
* @param <T>
* @throws IllegalAccessException
*/
public <T> void insertValueIntoExcel(Collection collection, SXSSFSheet sheet, SXSSFWorkbook workbook) throws IllegalAccessException {
sheet.protectSheet("password"); //这里给sheet设置密码!!!!!!!!!!!!
/*设置允许调整列宽,这样即使锁定,也能调整列宽.
不设置就是禁止调整列宽,设置成false就是可以调整列宽*/
//sheet.lockFormatColumns(false);
Class<?> clazz = collection.iterator().next().getClass();
Field[] fields = clazz.getDeclaredFields(); // 获取所有的字段
CellStyle unlockedCellStyle = workbook.createCellStyle();//!!!!!!!!!!!!!!!!!
unlockedCellStyle.setLocked(false); //将使用此样式的单元格设置为解锁(输入false就是解锁)!!!!!!!!!!!!!
int i = 1;
for (Object o : collection) {//循环遍历list集合里面每一行的数据
SXSSFRow row = sheet.createRow(i++);
for (int j = 0; j < fields.length; j++) {
Field field = fields[j];//获取这行数据的每一个字段
String name = field.getName();
InExcelAndSort annotation = field.getAnnotation(InExcelAndSort.class);
if (annotation == null) {
continue;
}
field.setAccessible(true);
SXSSFCell cell = row.createCell(annotation.sort());
if ("natureSaleCount".equals(name)){ // 当字段等"natureSaleCount"的时候,设置为解锁状态,解锁状态就是可编辑状态!!!!!!!
cell.setCellStyle(unlockedCellStyle); // 这里设置cell样式.!!!!!!!!!!!!!!!!!!!
}
cell.setCellValue(checkData(field.get(o)));
}
}
}
设置允许调整列宽,
上面的版本是不能调整列宽的,因为列宽也被锁定了,怎么设置允许用户调整列宽?
解决办法就是:
通过给SXSSFSheet设置属性:
//设置允许调整列宽,这样即使锁定,也能调整列宽.
sheet.lockFormatColumns(false);
代码片段,仅供参考:
//生成excel
SXSSFWorkbook workbook = new SXSSFWorkbook();
SXSSFSheet sheet = this.exportExcelUtil.createSheet(workbook, title, titles);
//给sheet设置密码,目的是不让业务代表修改Excel的数据.
sheet.protectSheet("password");
//设置允许调整列宽,这样即使锁定,也能调整列宽.
sheet.lockFormatColumns(false);