java实现设置Excel下拉框
在使用Excel的时候用到了下拉框,实现的效果如下↓
在生成excel文件时,需要根据给出的下拉框选项列表动态生成下拉框。实现代码如下:
private void createSelect(XSSFWorkbook workbook, DataValidationHelper helper, XSSFSheet targetSheet, List<String> selectList, int column, int fromRow, int endRow) { // workbook表示当前excel文件,targetSheet表示要加下拉框的sheet,selectList表示下拉框选项列表;column表示下拉框所在的列;fromRow表示下拉框开始行,endRow表示下拉框结束行 // helper是 DataValidationHelper helper = sheet.getDataValidationHelper() try { // hiddenSheet不存在的时候创建 存在的时候修改 // 创建一个隐藏的sheet,存放下拉框选项 String hiddenName = "hiddenSelect" + column; Sheet hiddenSheet = null; Cell cell = null; if (workbook.getSheet(hiddenName) == null) { hiddenSheet = workbook.createSheet(hiddenName); // 把下拉框列表数据放进隐藏sheet for (int i = 0; i < selectList.size(); i++) { Row row = hiddenSheet.createRow(i); cell = row.createCell(0); cell.setCellValue(selectList.get(i)); } } else { hiddenSheet = workbook.getSheet(hiddenName); // 把下拉框列表数据更新至隐藏sheet for (int i = 0; i < selectList.size(); i++) { Row row = hiddenSheet.getRow(i); cell = row.getCell(0); cell.setCellValue(selectList.get(i)); } } // 名称管理器 存在的时候修改 不存在的时候新增 Name nameCell = null; if (workbook.getName(hiddenName) == null) { nameCell = workbook.createName(); nameCell.setNameName(hiddenName); } else { nameCell = workbook.getName(hiddenName); } // 设置名称管理器的范围 nameCell.setRefersToFormula(hiddenName + "!$A$1:$A$" + selectList.size()); // 隐藏sheet workbook.setSheetHidden(workbook.getSheetIndex(hiddenSheet), true); // 设置下拉框作用范围 CellRangeAddressList addressList = new CellRangeAddressList(fromRow, endRow, column, column); DataValidationConstraint constraint = null; DataValidation validation = null; constraint = helper.createFormulaListConstraint(hiddenSheet.getSheetName()); validation = helper.createValidation(constraint, addressList); // 数据校验 validation.setSuppressDropDownArrow(true); validation.setShowErrorBox(true); targetSheet.addValidationData(validation); } catch (Exception e) { logger.error("<<<<<<< create template error cause {}", e); } }
在下拉框选项比较少的时候可以直接设置下拉框选项,在下拉框数据较多的时候需要在一个新的sheet加入下拉框数据,然后隐藏该sheet。为了方便,此处都是把下拉框数据加入到了隐藏sheet中。