2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 基于 java 使用 POI 操作 excel 导出限制某些单元格可编辑和单元格下拉列表有效性

基于 java 使用 POI 操作 excel 导出限制某些单元格可编辑和单元格下拉列表有效性

时间:2018-11-08 12:37:41

相关推荐

基于 java 使用 POI 操作 excel 导出限制某些单元格可编辑和单元格下拉列表有效性

你知道的越多,你不知道的越多

点赞再看,养成习惯

源码分享在文末,点赞关注,解锁更多毕业设计项目

企鹅:869192208

如果您有疑问或者见解,欢迎指教:

需求:
只有允许录入数据的部分可以编辑,其他单元格,包括说明文字所在行均不可编辑

示例:

HSSFWorkbook wb = new HSSFWorkbook();HSSFSheet sheet = wb.createSheet("sheet名称");HSSFCellStyle lockstyle = wb.createCellStyle();lockstyle.setLocked(true);//设置锁定lockstyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);lockstyle.setFillForegroundColor(IndexedColors.RED.getIndex());//设置上锁的单元格背景色HSSFCellStyle unlockStyle=wb.createCellStyle();unlockStyle.setLocked(false);//设置未锁定for(int i=0;i<10;i++){HSSFRow row = sheet.createRow(i);for (int j = 0; j < 10; j++) {HSSFCell cell = row.createCell(j);cell.setCellStyle(unlockStyle);//默认是锁定状态;将所有单元格设置为:未锁定;然后再对需要上锁的单元格单独锁定if(j==1){//这里可以根据需要进行判断;我这就将第2列上锁了cell.setCellStyle(lockstyle);//将需要上锁的单元格进行锁定cell.setCellValue("上锁了");}else{cell.setCellValue("没上锁了");}}}//sheet添加保护,这个一定要否则光锁定还是可以编辑的sheet.protectSheet("123456");FileOutputStream os = new FileOutputStream("D:\\workbook.xls");wb.write(os);os.close();

由于涉及到一些字典值,比如性别(1-男 2-女),需要设置导出 excel 的下拉列表(有效性)

示例:

//设置Excel数据有效性XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(textlist);CellRangeAddressList addressList = null;XSSFDataValidation validation = null;//四个参数分别是:起始行、终止行、起始列、终止列addressList = new CellRangeAddressList(2, 1000, cellNum, cellNum);validation = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, addressList);validation.setShowErrorBox(true);validation.setErrorStyle(DataValidation.ErrorStyle.STOP);//数据有效性对象sheet.addValidationData(validation);

综合示例:

//设置需要锁定的头部的样式XSSFCellStyle lockstyle = workbook.createCellStyle();lockstyle.setLocked(true);//设置锁定XSSFFont f = workbook.createFont();f.setFontHeightInPoints((short) 14);//字号f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗lockstyle.setFont(f);//设置不需要锁定的内容的样式XSSFCellStyle unlockStyle=workbook.createCellStyle();unlockStyle.setLocked(false);//设置未锁定//写头部数据,这里固定前两行为元素名和备注for (int rowNum = 0; rowNum < 2; rowNum++) {Row row = sheet.createRow(rowNum);//创建行for (int cellNum = 0; cellNum < formComponents.size(); cellNum++) {sheet.setDefaultColumnStyle(cellNum, unlockStyle);//设置这一列默认为可编辑Cell cell = row.createCell(cellNum);//创建单元格FormComponent component = formComponents.get(cellNum);if (rowNum == 0){//第一行是元素名cell.setCellValue(component.getFiledName());cell.setCellStyle(lockstyle);//将需要上锁的单元格进行锁定//判断当前列是否是下拉框-2、单选框-3if (component.getFiledInputType() == FormComponent.TYPE_SELECT ||component.getFiledInputType() == FormComponent.TYPE_RADIO){String dicCode = component.getDicCode();//获取到字典标识if (StringUtils.isNotBlank(dicCode)){List<Dict> dicts = new ArrayList<Dict>();List<String> dictValus = new ArrayList<String>();// 存在字典转义if (StringUtils.isNotBlank(dicCode)) {if(dicCode.contains("type=")){//url形式普通下拉框dicCode = dicCode.split("type=")[1];}dicts = ExchHelper.dictMap.get(dicCode);if (dicts == null) {ExchHelper.dictMap = DictUtils.getAllDict();dicts = ExchHelper.dictMap.get(dicCode);}if (dicts != null){for (Dict dict : dicts) {dictValus.add(dict.getDictValue());}//创建数组,长度为list的长度String[] textlist = new String[dictValus.size()];//list转化成数组,也可以看成是list复制到数组中dictValus.toArray(textlist);//设置Excel数据有效性XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(textlist);CellRangeAddressList addressList = null;XSSFDataValidation validation = null;//四个参数分别是:起始行、终止行、起始列、终止列addressList = new CellRangeAddressList(2, 1000, cellNum, cellNum);validation = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, addressList);validation.setShowErrorBox(true);validation.setErrorStyle(DataValidation.ErrorStyle.STOP);//数据有效性对象sheet.addValidationData(validation);}}}}}else if (rowNum == 1){//第二行是备注cell.setCellValue(StringUtils.isNotBlank(formComponents.get(cellNum).getFiledComment()) ? formComponents.get(cellNum).getFiledComment(): formComponents.get(cellNum).getFiledDesc());cell.setCellStyle(lockstyle);//将需要上锁的单元格进行锁定}sheet.setColumnWidth(cellNum,20 * 256);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。