最近的項目中用到了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效果如下
如有錯誤,請各位指正