Java ApachePOI Excel 设置只有指定列可编辑,并且允许调整列宽或者禁用列宽

博客围绕使用Apache POI处理Excel需求展开。产品经理要求指定列的指定内容可修改,其他地方禁止修改和新增,同时禁止调整列宽,也可设置允许调整。作者根据公司通用POI工具类改造代码,给出控制Excel是否编辑的核心代码及设置允许调整列宽的解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果

当时产品经理的需求是:

只有指定的列指定内容允许修改,其它地方都不允许修改和新增,
如图下,只有红色框框内容允许修改,红色框框以外均不能修改
,下面的空白的excel也不允许新增操作
然后就是禁止调整列宽, 当然也可以设置允许调整列宽.

image-20210601101151035

只要你修改就会弹出下面的警告

image-20210601101313016

解决代码

我是根据公司的通用的 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值