标题数据下拉选工具类如下:

 /**
     * *  excel导出,有码值的数据使用下拉框展示。解决下拉框最多255个字符的问题。
     * *  原理为新建一个隐藏状态的sheet页,用来存储下拉框的值。
     * * @param wb           工作簿  HSSFWorkbook
     * * @param col          当前列名
     * * @param boxMap       码值集合
     * * @param rows         正常sheet页数据,用来指定哪些行需要添加下拉框
     * * @param i             多个码值需要添加下拉,隐藏状态的sheet页名称不能重复,添加i值区分。
     * * @param colToIndex    用来指定哪些列需要添加下拉框
     * * @return  dataValidation
     */
    public static HSSFDataValidation createBox1(HSSFWorkbook wb, String col, Map<String, String> boxMap, int rows, int i, int colToIndex) {
        HSSFDataValidation dataValidation = null;
        String cols = "";
        //查询码值集合,获取当前列的码值。
        if (null != boxMap.get(col)) {
            cols = boxMap.get(col);
        }
        //新建隐藏状态的sheet,用来存储码值。
        if (cols.length() > 0 && null != cols) {
            String str[] = cols.split(",");
            //创建sheet页
            HSSFSheet sheet = wb.createSheet("hidden" + i);
            //向创建的sheet页添加码值数据。
            for (int i1 = 0; i1 < str.length; i1++) {
                HSSFRow row = sheet.createRow(i1);
                HSSFCell cell = row.createCell((int) 0);
                cell.setCellValue(str[i1]);
            }
            //将码值sheet页做成excel公式
            Name namedCell = wb.createName();
            namedCell.setNameName("hidden" + i);
            namedCell.setRefersToFormula("hidden" + i + "!$A$1:$A$" + str.length);
            //确定要在哪些单元格生成下拉框
            DVConstraint dvConstraint = DVConstraint.createFormulaListConstraint("hidden" + i);
            CellRangeAddressList regions = new CellRangeAddressList(1, rows, colToIndex, colToIndex);
            dataValidation = new HSSFDataValidation(regions, dvConstraint);
            //隐藏码值sheet页
            int sheetNum = wb.getNumberOfSheets();
            for (int n = 1; n < sheetNum; n++) {
                wb.setSheetHidden(n, true);
            }
        }
        return dataValidation;
    }


    /**
     * *  excel导出,有码值的数据使用下拉框展示。
     * * @param col             列名
     * * @param boxMap          码值集合
     * * @param firstRow        插入下拉框开始行号
     * * @param lastRow         插入下拉框结束行号
     * * @param firstCol        插入下拉框开始列号
     * * @param lastCol         插入下拉框结束行号
     * * @return
     */
    public static HSSFDataValidation createBox(String col, Map<String, List<String>> boxMap, int firstRow, int lastRow, int firstCol, int lastCol) {
        HSSFDataValidation dataValidation = null;
        //查询码值表
        List<String> cols = new ArrayList<>();
        if (null != boxMap.get(col)) {
            cols = boxMap.get(col);
        }
        //设置下拉框
        if (cols.size() > 0 && null != cols) {
            //list转数组
            String[] str = cols.toArray(new String[cols.size()]);
            //指定0-9行,0-0列为下拉框
            CellRangeAddressList cas = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
            //创建下拉数据列
            DVConstraint dvConstraint = DVConstraint.createExplicitListConstraint(str);
            //将下拉数据放入下拉框
            dataValidation = new HSSFDataValidation(cas, dvConstraint);
        }
        return dataValidation;
    }

    //设置样式
    public static HSSFCellStyle createCellStyle(HSSFCellStyle cellStyle, HSSFFont font, Boolean flag, HSSFRow row) {
        //设置边框
        //下
        cellStyle.setBorderBottom(BorderStyle.THIN);
        //左
        cellStyle.setBorderLeft(BorderStyle.THIN);
        //上
        cellStyle.setBorderTop(BorderStyle.THIN);
        //右
        cellStyle.setBorderRight(BorderStyle.THIN);
        //垂直居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        //设置大小
        cellStyle.setFont(font);
        //背景色填充整个单元格
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        //填充背景色
        cellStyle.setFillBackgroundColor(IndexedColors.YELLOW.getIndex());

        return cellStyle;
    }
//创建HSSFWorkbook对象
        HSSFWorkbook workbook = new HSSFWorkbook();
        //创建sheet对象
        HSSFSheet sheet = workbook.createSheet();
        //列名样式
        HSSFFont colFont = workbook.createFont();
        colFont.setFontName("宋体");
        colFont.setFontHeightInPoints((short) 10);//字体大小
        //设置表格列宽
        sheet.setDefaultColumnWidth(10);
        sheet.setColumnWidth(0, 6000);
        sheet.setColumnWidth(1, 6000);
        sheet.setColumnWidth(2, 6000);
        sheet.setColumnWidth(3, 6000);
        sheet.setColumnWidth(4, 6000);
  //第一行表头
        HSSFRow row = sheet.createRow(0);
        HSSFCellStyle style = ExcelUtil.createCellStyle(workbook.createCellStyle(), colFont, true, row);
        sheet.setDefaultColumnStyle(0, style);

对于下拉选字节长度超过355的问题

将以下:
   HSSFDataValidation dataValidation = ExcelUtil.createBox(title.get(i), boxMap, 0, 1000, 3, 5);
   sheet.addValidationData(dataValidation);
换成:
                HSSFWorkbook hssfWorkbook = sheet.getWorkbook();
                HSSFSheet hidden = hssfWorkbook.createSheet("hidden");
                HSSFCell hssfCell = null;
                String[] dataArray = boxMap.get(title.get(i)).toArray(new String[boxMap.get(title.get(i)).size()]);
                for (int s =0; s <  dataArray.length; s++){
                    String name =dataArray[s];
                    HSSFRow hssfRow = hidden.createRow(s);
                    hssfCell = hssfRow.createCell(0);
                    hssfCell.setCellValue(name);
                }
                Name name = hssfWorkbook.createName();
                name.setNameName("hidden");
                name.setRefersToFormula("hidden!$C$1:$A$"+dataArray.length);
                hssfWorkbook.setSheetHidden(1,true);
                DVConstraint constraint = DVConstraint.createFormulaListConstraint("hidden");
                //列开始0结束1000行开始2行结束2
                CellRangeAddressList addressList = new CellRangeAddressList(0,1000,2,2);
                HSSFDataValidation dataValidation = new HSSFDataValidation(addressList,constraint);
                sheet.addValidationData(dataValidation);

中文过滤

    /**
     * 过滤掉中文
     * @param str 待过滤中文的字符串
     * @return 过滤掉中文后字符串
     */
    public static String filterChinese(String str,boolean flag) {
        // 用于返回结果
        String result = str;
        // 包含中文
        if (flag) {// 包含中文
            // 用于拼接过滤中文后的字符
            StringBuffer sb = new StringBuffer();
            // 用于校验是否为中文
            boolean flag2 = false;
            // 用于临时存储单字符
            char chinese = 0;
            // 5.去除掉文件名中的中文
            // 将字符串转换成char[]
            char[] charArray = str.toCharArray();
            // 过滤到中文及中文字符
            for (int i = 0; i < charArray.length; i++) {
                chinese = charArray[i];
                flag2 = isChinese(chinese);
                if (!flag2) {// 不是中日韩文字及标点符号
                    sb.append(chinese);
                }
            }
            result = sb.toString();
        }
        //去空格
        return result.trim();
    }
    /**
     * 判定输入的是否是汉字
     *
     * @param c
     *  被校验的字符
     * @return true代表是汉字
     */
    public static boolean isChinese(char c) {
        Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
        if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
                || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
                || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
                || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
                || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
                || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
            return true;
        }
        return false;
    }

其他校验:

 /**
     * 校验String是否全是中文
     *
     * @param name
     *  被校验的字符串
     * @return true代表全是汉字
     */
    public static boolean checkNameChese(String name) {
        boolean res = true;
        char[] cTemp = name.toCharArray();
        for (int i = 0; i < name.length(); i++) {
            if (!isChinese(cTemp[i])) {
                res = false;
                break;
            }
        }
        return res;
    }

   /**
     * 校验某个字符是否是a-z、A-Z、_、0-9
     *
     * @param c
     *  被校验的字符
     * @return true代表符合条件
     */
    public static boolean isWord(char c) {
        String regEx = "[\\w]";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher("" + c);
        return m.matches();
    }

    /**
     * 验证是否是汉字或者0-9、a-z、A-Z
     *
     * @param c
     *  被验证的char
     * @return true代表符合条件
     */
    public static boolean isRightChar(char c) {
        return isChinese(c) || isWord(c);
    }
  /**
     * 验证字符串内容是否包含下列非法字符<br>
     * `~!#%^&*=+\\|{};:'\",<>/?○●★☆☉♀♂※¤╬の〆
     *
     * @param content
     *  字符串内容
     * @return 't'代表不包含非法字符,otherwise代表包含非法字符。
     */
    public static char validateLegalString(String content) {
        String illegal = "`~!#%^&*=+\\|{};:'\",<>/?○●★☆☉♀♂※¤╬の〆";
        char isLegalChar = 't';
        L1: for (int i = 0; i < content.length(); i++) {
            for (int j = 0; j < illegal.length(); j++) {
                if (content.charAt(i) == illegal.charAt(j)) {
                    isLegalChar = content.charAt(i);
                    break L1;
                }
            }
        }
        return isLegalChar;
    }
    /**
     * 校验一个字符是否是汉字
     *
     * @param c
     *  被校验的字符
     * @return true代表是汉字
     */
    public static boolean isChineseChar(String c) {
        try {
            return c.getBytes("UTF-8").length > 1;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return false;
        }
    }

纯洁的麦兜
18 声望4 粉丝

学习使人进步