자바 POI 이름 관리자 다단 계 연동

최근 에 만 든 프로젝트 는 Excel 표 의 다단 계 연동 으로 설계 되 었 습 니 다. 대체적으로 다음 과 같은 수요 가 있 습 니 다. 유 료 프로젝트 연동 을 통 해 유 료 기준 을 가 져 오고 프로젝트 를 완성 한 후에 정 리 를 하면 알갱이 가 창고 에 들 어가 고 소스 코드 는 첨부 되 지 않 으 며 회사 의 일부 내용 을 디자인 합 니 다.
 public static void main(String[] args) {
        String newFilePath="/Users/yangguangcai/Downloads/test1666.xls";
        String sheetTitle="ceshi";
        List<String> headers = Arrays.asList("   ", "    ", "    ");
        Map<String, String[]> gradeMap = new HashMap<>();
        gradeMap.put("   ",new String[]{"yi"," "});
        gradeMap.put("   ",new String[]{"er"," "});
        String[] gradeInfo=new String[]{"   ","   "};
        Cascade(newFilePath,sheetTitle,headers,gradeMap,gradeInfo);
    }

    public static void Cascade(String filePath, String sheetTitle, List<String> headers, Map<String,String[]> map, String[] fatherOption) {
        //     excel
        @SuppressWarnings("resource")
        Workbook book = new XSSFWorkbook();

        //          sheet
        XSSFSheet sheetPro = (XSSFSheet) book.createSheet(sheetTitle);
        Row row0 = sheetPro.createRow(0);
        for (int i = 0;i<headers.size();i++){
            row0.createCell(i).setCellValue(headers.get(i));
        }
        //                 sheet 
        //             ,      。
        Sheet hideSheet = book.createSheet("hideSheet");
        //        sheet  ,          ,      sheet       
        book.setSheetHidden(book.getSheetIndex(hideSheet), true);

        int rowId = 0;
        //      ,
        Row oneRow = hideSheet.createRow(rowId++);
        oneRow.createCell(0).setCellValue(sheetTitle);
        for(int i = 0; i < fatherOption.length; i ++){
            Cell provinceCell = oneRow.createCell(i + 1);
            provinceCell.setCellValue(fatherOption[i]);
        }
        //              ,        ,      。
        for(int i = 0;i < fatherOption.length;i++){
            String key = fatherOption[i];
            String[] son = map.get(key);
            Row row = hideSheet.createRow(rowId++);
            row.createCell(0).setCellValue(key);
            for(int j = 0; j < son.length; j ++){
                Cell cell = row.createCell(j + 1);
                cell.setCellValue(son[j]);
            }
            //        
            String range = getRange(1, rowId, son.length);
            Name name = book.createName();
            //key    
            name.setNameName(key);
            String formula = "hideSheet!" + range;
            name.setRefersToFormula(formula);
        }
        XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet)sheetPro);
        //    
        DataValidationConstraint provConstraint = dvHelper.createExplicitListConstraint(fatherOption);
        //        :   、   、   、   
        CellRangeAddressList provRangeAddressList = new CellRangeAddressList(1, 20, 6, 6);
        DataValidation provinceDataValidation = dvHelper.createValidation(provConstraint, provRangeAddressList);
        //  
        provinceDataValidation.createErrorBox("error", "       ");
        provinceDataValidation.setShowErrorBox(true);
        provinceDataValidation.setSuppressDropDownArrow(true);
        sheetPro.addValidationData(provinceDataValidation);

        //  20      
        for(int i = 2;i < 20;i++){
            setDataValidation("G" ,sheetPro,i,8);
        }
        FileOutputStream os = null;
        try {
            os = new FileOutputStream(filePath);
            book.write(os);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(os);
        }
    }

    /**
     *      
     * @param offset          ,               
     * @param sheet
     * @param rowNum   
     * @param colNum   
     */
    public static void setDataValidation(String offset,XSSFSheet sheet, int rowNum,int colNum) {
        XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);
        DataValidation data_validation_list;
        data_validation_list = getDataValidationByFormula(
                "INDIRECT($" + offset + (rowNum) + ")", rowNum, colNum,dvHelper);
        sheet.addValidationData(data_validation_list);
    }

    /**
     *         
     * @param formulaString
     * @param naturalRowIndex
     * @param naturalColumnIndex
     * @param dvHelper
     * @return
     */
    private static  DataValidation getDataValidationByFormula(
            String formulaString, int naturalRowIndex, int naturalColumnIndex,XSSFDataValidationHelper dvHelper) {
        //         
        //   : formulaString = "INDIRECT($A$2)"                 key     A2       ,
        //  A2    ,              。
        XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createFormulaListConstraint(formulaString);
        //                 。
        //        :   、   、   、   
        int firstRow = naturalRowIndex -1;
        int lastRow = naturalRowIndex - 1;
        int firstCol = naturalColumnIndex - 1;
        int lastCol = naturalColumnIndex - 1;
        CellRangeAddressList regions = new CellRangeAddressList(firstRow,
                lastRow, firstCol, lastCol);
        //        
        //   
        XSSFDataValidation data_validation_list = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, regions);
        data_validation_list.setEmptyCellAllowed(false);
        if (data_validation_list instanceof XSSFDataValidation) {
            data_validation_list.setSuppressDropDownArrow(true);
            data_validation_list.setShowErrorBox(true);
        } else {
            data_validation_list.setSuppressDropDownArrow(false);
        }
        //           
        data_validation_list.createPromptBox("      ", "             !");
        //           

        return data_validation_list;
    }

    /**
     *    formula
     * @param offset    ,   0,   A   ,1,   B 
     * @param rowId    
     * @param colCount      
     * @return       1,1,10.    B1-K1。     $B$1:$K$1
     *
     */
    public static String getRange(int offset, int rowId, int colCount) {
        char start = (char)('A' + offset);
        if (colCount <= 25) {
            char end = (char)(start + colCount - 1);
            return "$" + start + "$" + rowId + ":$" + end + "$" + rowId;
        } else {
            char endPrefix = 'A';
            char endSuffix = 'A';
            if ((colCount - 25) / 26 == 0 || colCount == 51) {// 26-51  ,    (        )
                if ((colCount - 25) % 26 == 0) {//    
                    endSuffix = (char)('A' + 25);
                } else {
                    endSuffix = (char)('A' + (colCount - 25) % 26 - 1);
                }
            } else {// 51  
                if ((colCount - 25) % 26 == 0) {
                    endSuffix = (char)('A' + 25);
                    endPrefix = (char)(endPrefix + (colCount - 25) / 26 - 1);
                } else {
                    endSuffix = (char)('A' + (colCount - 25) % 26 - 1);
                    endPrefix = (char)(endPrefix + (colCount - 25) / 26);
                }
            }
            return "$" + start + "$" + rowId + ":$" + endPrefix + endSuffix + "$" + rowId;
        }
    }

분석: Excel 이름 관리자 의 다단 계 연동 은 실제 적 으로 하나의 sheet 를 만 드 는 것 입 니 다. 내용 을 이 숨겨 진 sheet 에 먼저 넣 은 다음 에 연동 적 으로 값 을 추출 하 는 것 입 니 다. 제안: 먼저 Excel 을 통 해 다단 계 연동 을 만 들 고 그 원 리 를 이해 한 후에 코드 를 이해 하 는 것 이 더욱 편리 합 니 다.
만 나 는 구덩이: 1. 명칭 관리 자 는 특수 문 자 를 식별 할 수 없다. 예 를 들 어 '- ()' 와 중국어 괄호 2. 처음에 Excel 을 통 해 명칭 관리 자 를 만 들 지 않 았 는데 올 라 오 자마자 코드 를 보고 눈 이 멀 어서 원리 의 중요성 을 알 았 다. 3. 이 물건 을 처음 접 했 기 때문에 정리 가 느 리 고 평소에 많이 접촉해 야 한다.많이 알다
참고: POI 내 보 내기 Excel 드 롭 다운 목록 다단 계 연동 (성 시 현 3 급 연동 의 경우) Java POI 는 드 롭 다운 상자 & 드 롭 다운 상자 가 있 는 Excel poi 를 생 성 합 니 다. '이름 관리자' 를 이용 하여 엑셀 드 롭 다운 상 자 를 구축 할 때 모두 2 급 이 고 1 급 목록 은 데이터 형식 이 숫자 인 데 이 터 를 포함 합 니 다. Excel 다단 계 드 롭 다운 메뉴 연동 자동 일치 내용 을 어떻게 처리 해 야 합 니까?

좋은 웹페이지 즐겨찾기