1. 思路
1.1 所定全表为 lock 状态。
1.2 解锁表格所在的列为 unlock 状态。
1.3 锁定的需要锁定的单元格为 lock 状态。
这样整的原因是: poi 不支持直接对单元格设置锁定,poi 只支持全表锁定,和在全表锁定的情况下设置 cell 的锁定状态。
2. 代码
列出主要方法如下:
private Workbook workbook;
private Sheet sheet;
private String fileName;
private List<List<String>> excelHead;
private List<List<Object>> excelData;
private Map<Integer, List<String>> selectFieldsMap;
private String password = "123456";
public void createExcel() {
setCommonStyle();
createHeader();
createBody();
createSelectBox();
}
private void setCommonStyle() {
if (!MasterDataConstants.PRODUCT.equals(fileName)) {
return;
}
// 1.1 所定全表 为 lock
sheet.protectSheet(password);
// 1.2 解锁表格所在的列 为 unlock
CellStyle unlockstyle = workbook.createCellStyle();
unlockstyle.setLocked(false);
List<String> header = excelHead.get(0);
for (int i = 0; i < header.size(); i++) {
if (i == 0 || i == 1) {
sheet.setColumnWidth(i, 26 * 256);
} else {
sheet.setColumnWidth(i, 18 * 256);
}
sheet.setDefaultColumnStyle(i, unlockstyle);
}
}
private CellStyle getBodyCellStyle(int columnIndex, boolean isShowPercent) {
// Sheet样式
CellStyle columnHeadStyle = workbook.createCellStyle();
// 背景色的设定 自动换行
columnHeadStyle.setWrapText(true);
// 1.3 设置需要锁定的数据为 lock。columnHeadStyle.setLocked(MasterDataConstants.PRODUCT.equals(fileName) && columnIndex == 0);
// 设置字体
Font font = workbook.createFont();
font.setBold(false);
short colorIndex = HSSFColor.HSSFColorPredefined.BLACK.getIndex();
font.setColor(colorIndex);
columnHeadStyle.setFont(font);
// 水平居中,垂直居中
columnHeadStyle.setAlignment(HorizontalAlignment.CENTER);
columnHeadStyle.setVerticalAlignment(VerticalAlignment.CENTER);
// 设置数据格式
if (isShowPercent) {
columnHeadStyle.setDataFormat(workbook.createDataFormat().getFormat("0%"));
}
columnHeadStyle.setWrapText(true);
return columnHeadStyle;
}