package com.panzhihua.common.utlis; import org.apache.poi.hssf.usermodel.DVConstraint; import org.apache.poi.hssf.usermodel.HSSFDataValidation; import org.apache.poi.ss.usermodel.Name; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellRangeAddressList; public final class ExcelSelectListUtil { private ExcelSelectListUtil() { throw new IllegalStateException("Utility class"); } /** * firstRow 開始行號 根据此项目,默认为2(下标0开始) lastRow 根据此项目,默认为最大65535 firstCol 区域中第一个单元格的列号 (下标0开始) lastCol 区域中最后一个单元格的列号 * strings 下拉内容 */ public static void selectList(Workbook workbook, int firstCol, int lastCol, String[] strings) { int charLenth = stringArrayLength(strings); int arraylLenth = strings.length; if (charLenth + arraylLenth >= 255) { Sheet sheet = workbook.getSheetAt(0); // 解决下拉超过255个字符的问题 String hiddenSheet = "hidden" + firstCol; Sheet category1Hidden = workbook.createSheet(hiddenSheet); for (int i = 0, length = strings.length; i < length; i++) { // 循环赋值(为了防止下拉框的行数与隐藏域的行数相对应来获取>=选中行数的数组,将隐藏域加到结束行之后) category1Hidden.createRow(i).createCell(0).setCellValue(strings[i]); } Name category1Name = workbook.createName(); category1Name.setNameName(hiddenSheet); category1Name.setRefersToFormula(hiddenSheet + "!$A$1:$A$" + strings.length); // A1:A代表隐藏域创建第?列createCell(?)时。以A1列开始A行数据获取下拉数组 // 生成下拉列表 // 只对(x,x)单元格有效 CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(2, 65535, firstCol, lastCol); // 生成下拉框内容 DVConstraint dvConstraint = DVConstraint.createFormulaListConstraint(hiddenSheet); HSSFDataValidation dataValidation = new HSSFDataValidation(cellRangeAddressList, dvConstraint); // 对sheet页生效 workbook.setSheetHidden(1, true); sheet.addValidationData(dataValidation); } else { Sheet sheet = workbook.getSheetAt(0); // 生成下拉列表 // 只对(x,x)单元格有效 CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(2, 65535, firstCol, lastCol); // 生成下拉框内容 DVConstraint dvConstraint = DVConstraint.createExplicitListConstraint(strings); HSSFDataValidation dataValidation = new HSSFDataValidation(cellRangeAddressList, dvConstraint); // 对sheet页生效 sheet.addValidationData(dataValidation); } } private static int stringArrayLength(String[] args) { int rs = 0; for (int i = 0; i < args.length; i++) { rs += args[i].length(); } return rs; } }