利用POI实现下拉框级联

1、调用方法

CommonUtils.genearteOtherSheet2(sheet, associatePartyTypeIndex, "股东类型", associatePartyType, mainSheet, false, workbook, 2,"");
CommonUtils.genearteOtherSheet2(sheet, legalIndex, "法人", legal, mainSheet, true, workbook, 3, "C");
CommonUtils.genearteOtherSheet2(sheet, legalIndex, "法人", legal, mainSheet, true, workbook, 3, "C");

2、具体方法

/**
     * 查询下拉列表值,写入到隐藏sheet页中
     * @Title: genearteOtherSheet 
     * @author hegg
     * @date 2019年12月30日 下午5:03:15
     * @return 返回类型 void 
     * @param sheet 为数据字典sheet页
     * @param index 为数据字典对应的值,保存在sheet页第几列,同一个sheet页多次调用本方法(index不可以重复,否则后面的列会覆盖前面的列)
     * @param columnDesc 为数据字典sheet页第几列保存对应的值的描述
     * @param selectList 下拉框内容
     * @param mainSheet 为主sheet页用来实现下拉框作为展示
     * @param isjilian 
     * @param workbook 为当前Workbook
     * @param mainParentIndex 为主sheet页mainSheet第几列需要被设置为下拉框
     * @param father 当前列为子级下拉框的内容受父级哪一列的影响
     */
    public static void genearteOtherSheet2(Sheet sheet, int index, String columnDesc, String[] selectList, XSSFSheet mainSheet, boolean isjilian, Workbook workbook, int mainParentIndex, String father) {
        Row titleRow = null;
        // 创建下拉列表值存储工作表
        int totalRowNumber = sheet.getLastRowNum();//获取sheet页有效行
        if(totalRowNumber == 0){
            titleRow = sheet.createRow(0);
        } else {
            titleRow = sheet.getRow(0);
        }
        Cell titleCell = titleRow.createCell(index);
        titleCell.setCellValue(columnDesc);
        
        for (int i = 0; i < selectList.length; i++) {
            Row row = null;
            if(totalRowNumber >= i+1){
                row = sheet.getRow(i+1);
            } else {
                row = sheet.createRow(i+1);
            }
            Cell cell = row.createCell(index);
            cell.setCellValue(selectList[i]);
        }
        // 将下标转换为字母0=A,1=B,
        String word = getIndexWord(index + 1);
        //设置名称为typelist的sheet页中哪些单元格的内容为下拉框,例如:=Sheet1!$C$2:$C$8意思是将C列第2行至第8行的7个单元格作为下拉框的内容
        String formula = "typelist!$" + word + "$2:$" + word + "$" + (selectList.length + 1);
        if(isjilian){
            // 名称管理器设置name
            Name naturalName = workbook.createName();
            naturalName.setNameName(columnDesc);// setNameName方法中参数必须父级内容一样
            naturalName.setRefersToFormula(formula);

            // 证件类型和股东类型为级联关系,这里取mainSheet页中 股东类型 所在列的下标并转换为字母,因为 证件类型 取决于 股东类型,最后面的2代表excel中第多少行
            //当前列为子级下拉框的内容受父级哪一列的影响
            String indirectFormula = "INDIRECT($" + father + "2)";//=INDIRECT($C2)
            mainSheet.addValidationData(SetDataValidation(workbook, indirectFormula, 1, mainParentIndex, 1, mainParentIndex));
        } else {
            // 设置下拉列表值绑定到主sheet页具体哪个单元格起作用
            mainSheet.addValidationData(SetDataValidation(workbook, formula, 1, mainParentIndex, 1, mainParentIndex));
        }
    }

3、涉及的方法

/**
     * 设置下拉列表值绑定到主sheet页具体哪个单元格起作用
     * @Title: SetDataValidation 
     * @author hegg
     * @date 2019年12月30日 下午5:03:37
     * @return 返回类型 DataValidation 
     * @param
     */
    public static DataValidation SetDataValidation(Workbook workbook, String strFormula, int firstRow, int firstCol, int endRow, int endCol) {
        // 表示A列1-59行作为下拉列表来源数据
        // String formula = "typelist!$A$1:$A$59" ;
        // 原顺序为 起始行 起始列 终止行 终止列
        CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
        DataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet)workbook.getSheet("typelist"));
        DataValidationConstraint formulaListConstraint = dvHelper.createFormulaListConstraint(strFormula);
        DataValidation dataValidation = dvHelper.createValidation(formulaListConstraint, regions);

        return dataValidation;
    }
/**
     * 将下标转换为字母,调用该方法时必须+1
     * @Title: getIndexWord 
     * @author hegg
     * @date 2020年1月1日 下午8:59:14
     * @return 返回类型 String 
     * @param
     */
    public static String getIndexWord(Integer i){
        String[] word = new String[]{"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
        int d = i/26;
        int x = i%26;
        String w = "";
        if(x == 0){
            if(d>1){
                w= word[d-2] + "" + word[25];
            } else {
                w = word[i-1];
            }
        } else {
            if(d>=1){
                w= word[d-1] + "" + word[x-1];
            } else {
                w = word[x-1];
            }
        }
        
        Map<Integer, String> a = new LinkedHashMap<Integer, String>();
        a.put(i, w);
        return a.get(i);
    }
    

 https://blog.csdn.net/chshe509/article/details/8732032

posted @ 2020-04-03 19:02  silentmuh  阅读(1838)  评论(0编辑  收藏  举报
Live2D