最近的项目中用到了poi方式创建excel文件,
某些单元格要进行锁定,某些单元格需要进行填写选项的预设值,
发现有两种需求
1、锁定大部分的单元格
2、只锁定某一个单元格
就以上两种情况,有不同的解决办法
需求1:锁定大部分的单元格
1.1创建Excel 及其sheet
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("锁定大部分单元格的Excel");
1.2如果要锁定单元格,必须给shee设置密码,默认excel的sheet对应的单元格全部锁定
给锁定的单元格设置密码 !!,密码为 ”edit“
sheet.protectSheet("edit");
1.3 给不需要锁定的单元格解锁
1.3.1 创建一个不锁定的cellstyle
public HSSFCellStyle unLockStyle(HSSFWorkbook workbook) {
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setLocked(false);
return cellStyle;
}
1.3.2 创建不锁定的单元格并解锁
for (int i = 3; i < 100; i++) {
row = sheet.createRow(i);
// 创建普通单元格,这个单元格是最普通的锁定状态的
for (int j = 0; j < width; j++) {
cell = row.createCell(j);
HSSFCellStyle cellStyle2 = workbook.createCellStyle();
cell.setCellStyle(unLockStyle(workbook));
}
}
以上就创建了不锁定的单元格,除了第3行到100行的0到width列外,其他都是锁定状态
需求2:只锁定某一个单元格
2.1创建excel及其sheet
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("只锁定某一个单元格");
2.2 创建锁定的方法
void setDataValidation(HSSFCell cell) {
// 单元格设置数据有效性
DVConstraint constraint = DVConstraint.createNumericConstraint(
DVConstraint.ValidationType.INTEGER, DVConstraint.OperatorType.GREATER_OR_EQUAL, "0", null);
//设置数据有效性加载在哪个单元格上。
//四个参数分别是:起始行、终止行、起始列、终止列
CellRangeAddressList regions = new CellRangeAddressList(
cell.getRowIndex(), cell.getRowIndex(), cell.getColumnIndex(), cell.getColumnIndex());
//数据有效性对象
HSSFDataValidation data_validation = new HSSFDataValidation(regions, constraint);
//加入sheet
sheet.addValidationData(data_validation);
}
HSSFRow row = sheet.createRow(3);
HSSFCell cell = row.createCell(6);
this.setDataValidation(cell, sheet);
2.2里面分方法可以不懂,只要调用,并将cell和sheet作为实参传入就可以了
2.5效果如下
如有错误,请各位指正