java原生poi Excel 导出下拉框方法

277 阅读1分钟

该方法通用于单码值多码值下的数据导出操作

/**
 * excel导出,有码值的数据使用下拉框展示。解决下拉框最多255个字符的问题。
 * 原理为新建一个隐藏状态的sheet页,用来存储下拉框的值。
 *
 * @param wb 工作簿  HSSFWorkbook
 * @param col  当前列名
 * @param boxMap  码值集合
 * @param startRows 起始行
 * @param endRows  终止行
 * @param i 多个码值需要添加下拉,隐藏状态的sheet页名称不能重复,添加i值区分。
 * @param startColIndex 起始列
 * @param endColToIndex 终止列
 * @return dataValidation
 */
public static HSSFDataValidation createBox(HSSFWorkbook wb, String col, Map<String, String> boxMap,int startRows, int endRows, int i, int startColIndex, int endColToIndex) {
    HSSFDataValidation dataValidation = null;
    String cols = "";
    //查询码值集合,获取当前列的码值。
    if (null != boxMap.get(col)) {
        cols = boxMap.get(col);
    }
    //新建隐藏状态的sheet,用来存储码值。
    if (cols.length() > 0) {
        String str[] = cols.split(",");
        //创建sheet页
        HSSFSheet sheet = wb.createSheet(HIDDEN_FIX + 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_FIX + i);
        namedCell.setRefersToFormula(HIDDEN_FIX + i + "!$A$1:$A$" + str.length);

        //确定要在哪些单元格生成下拉框
        DVConstraint dvConstraint = DVConstraint.createFormulaListConstraint(HIDDEN_FIX + i);
        CellRangeAddressList regions = new CellRangeAddressList(startRows, endRows, startColIndex, endColToIndex);
        dataValidation = new HSSFDataValidation(regions, dvConstraint);
        sheet.addValidationData(dataValidation);
        //隐藏码值sheet页
        int sheetNum = wb.getNumberOfSheets();
        for (int n = 1; n < sheetNum; n++) {
            wb.setSheetHidden(n, true);
        }
    }
    return dataValidation;
}

测试

main{
    //创建Excel Sheet
    HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
    HSSFSheet sheet = hssfWorkbook.createSheet("newsheet");
    FileOutputStream out = new FileOutputStream("d:\\success.xls");
    //获取数据字典码值例:
    Map<String,String> boxMap = new HashMap<String,String>();
    boxMap.put("性别","男,女");
    //指定列名
    String cellStr = "性别";
    this.createBox(hssfWorkbook,cellStr,boxMap,1,1,0,0);
    //写出
    workbook.write(out);
    //流关闭
    out.close();
}

结果

6455F3BE-0B6D-46aa-AC2F-2B85EB7A0CDE.png