动态从数据库获取数据,省市县三级联动,有校验,导出Excel模板

Posted renwangxu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态从数据库获取数据,省市县三级联动,有校验,导出Excel模板相关的知识,希望对你有一定的参考价值。

技术分享图片话不多说,看效果图,直接上代码。

sheet  商户表

技术分享图片

 

 hideSheet ,功能完成后隐藏的Sheet

技术分享图片

 

下面是代码

 @RequestMapping(params = "action=toExcel")
    public void toExcel(HttpServletRequest request,HttpServletResponse response) {
        try {
            String name = "商户表";

            String valStr = "attachment;filename="
                    + new String(name.getBytes("gb2312"), "ISO8859-1") + ".xls";
            OutputStream os = response.getOutputStream();// 取得输出流
            response.reset();// 清空输出流
            // 设定输出文件头
            response.setHeader("Content-Disposition", valStr);
            response.setContentType("application/msexcel");// 定义输出类型
            Workbook workbook = new HSSFWorkbook();
            
            String[] fieldLabelArray = { "商户简称", "商户全称", "商户类型", "父级商户", "省",
                    "市", "县", "电话", "联系人", "邮箱", "邮编", "地址", "经度",
                    "纬度" };
            
            //得到省名称
            Map<String,String> params = new HashMap<String,String>();
            //所有的省
            if(faMerchantList.size()==0){
                faMerchantList = service.findList("UU_BANK_MERCHANT.queryName", paramData);
            }
            if(merchantList.size()==0){
                merchantList = bankMerchantTypeService.findList("UU_BANK_MERCHANTTYPE.query", paramData);
            }
            if(proviceLists.size()==0){
                proviceLists = serviceOut.findList("UU_BANK_BANKOUTLET.selectProvices", paramData);
            }
            String[] provinceArr=new String[proviceLists.size()];    
            //将有子区域的父区域放到一个数组中
            ArrayList areaFatherNameArr=new ArrayList();
            Map<String,String[]> areaMap =new HashMap<String, String[]>();
            int index=0;
            int cityIndex=0;
            for(Object object:proviceLists){
                Map entry=(Map) object;
                provinceArr[index]=(String) entry.get("NAME");
                String provinceCode = (String) entry.get("CITYCODE");
                areaFatherNameArr.add(cityIndex,(String) entry.get("NAME"));
                cityIndex+=1;
                if(!provinceCode.isEmpty()){
                    String city_Code = provinceCode.substring( 0, 2);
                    params.put("CITY_CODE", city_Code);            
                    params.put("CITYCODE", provinceCode);
                }        
                List cityLists = serviceOut.findList("UU_BANK_BANKOUTLET.selectCitys", params);
                String[] areaArr= new String[cityLists.size()];
                int indexs=0;
                for(Object city:cityLists){
                    Map entryCity=(Map) city;
                    areaFatherNameArr.add(cityIndex, (String) entryCity.get("NAME"));
                    areaArr[indexs]=(String) entryCity.get("NAME");
                    String cityCode = (String) entryCity.get("CITYCODE");
                    if(!cityCode.isEmpty()){
                        String city_Code = cityCode.substring( 0, 4);
                        params.put("CITY_CODE", city_Code);            
                        params.put("CITYCODE", cityCode);
                    }            
                    List countyLists = serviceOut.findList("UU_BANK_BANKOUTLET.selectCountys", params);
                    String[] countyArr= new String[countyLists.size()];
                    int countyindex=0;
                    for(Object county:countyLists){
                        Map entryCounty=(Map) county;
                        countyArr[countyindex]=(String) entryCounty.get("NAME");
                        countyindex++;
                    }
                    areaMap.put((String) entryCity.get("NAME"), countyArr);
                    indexs++;
                    cityIndex++;
                }
                areaMap.put((String) entry.get("NAME"),areaArr);
                index++;
            };
            //查询商户类型
            int merchantArrIndex=0;
            String[] merchantArr=new String[merchantList.size()];
            for (Object merchantType : merchantList) {
                Map merchant=(Map) merchantType;
                merchantArr[merchantArrIndex]=(String) merchant.get("NAME");
                merchantArrIndex++;
            }
            //查询父级商户
            int faMerchantIndex=0;
            String[] faMerchantArr=new String[faMerchantList.size()];
            for (Object fmerchantI : faMerchantList) {
                Map merchantf=(Map) fmerchantI;
                faMerchantArr[faMerchantIndex]=(String) merchantf.get("NAME");
                faMerchantIndex++;
            }
            // 创建Sheet
            String sheetName = name;
            Sheet sheet = workbook.createSheet(name);
            //创建sheet1 
            Sheet hideSheet =workbook.createSheet("area");
            //是否隐藏sheet1
            workbook.setSheetHidden(workbook.getSheetIndex(hideSheet), true);  
            //生成数据
            int rowId=0;
            Row provinceRow = hideSheet.createRow(rowId++);
            provinceRow.createCell(0).setCellValue("省列表");  
            for(int i = 0; i < provinceArr.length; i ++){  
                Cell provinceCell = provinceRow.createCell(i + 1);  
                provinceCell.setCellValue(provinceArr[i]);  
             }  
            //将具体数据写入每一行中
            for(int i = 0;i < areaFatherNameArr.size();i++){  
                String key = (String) areaFatherNameArr.get(i);  
                String[] son = areaMap.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 names =workbook.createName();
                names.setNameName(key);
                String formula ="area!"+range;
                names.setRefersToFormula(formula);
            }

            // 商户类型
            DVConstraint typeConstraint = DVConstraint.createExplicitListConstraint(merchantArr);
            CellRangeAddressList typeRangeAddressList = new CellRangeAddressList(1, 1000, 2, 2);
            DataValidation typeDataValidation = new HSSFDataValidation(typeRangeAddressList, typeConstraint);
            typeDataValidation.createErrorBox("error", "请选择正确的商户类型");
            sheet.addValidationData(typeDataValidation);
            // 父级商户
            DVConstraint faConstraint = DVConstraint.createExplicitListConstraint(faMerchantArr);
            CellRangeAddressList faRangeAddressList = new CellRangeAddressList(1, 1000, 3, 3);
            DataValidation faDataValidation = new HSSFDataValidation(faRangeAddressList, faConstraint);
            typeDataValidation.createErrorBox("error", "请选择正确的商户类型");
            sheet.addValidationData(faDataValidation);

            // 省规则
            DVConstraint provConstraint = DVConstraint.createExplicitListConstraint(provinceArr);
            CellRangeAddressList provRangeAddressList = new CellRangeAddressList(1, 1000, 4, 4);
            DataValidation provinceDataValidation = new HSSFDataValidation(provRangeAddressList, provConstraint);
            provinceDataValidation.createErrorBox("error", "请选择正确的省份");
            sheet.addValidationData(provinceDataValidation);

            // 市以规则,此处仅作一个示例
            // "INDIRECT($A$" + 2 + ")" 表示规则数据会从名称管理器中获取key与单元格 A2 值相同的数据,如果A2是浙江省,那么此处就是
            // 浙江省下的区域信息。
            DVConstraint formula = DVConstraint.createFormulaListConstraint("INDIRECT($E:$E)");
             CellRangeAddressList rangeAddressList = new CellRangeAddressList(1, 1000, 5, 5);
             DataValidation cacse = new HSSFDataValidation(rangeAddressList, formula);
             cacse.createErrorBox("error", "请选择正确的市");
             sheet.addValidationData(cacse);

             // 区规则
             formula = DVConstraint.createFormulaListConstraint("INDIRECT($F:$F)");
             rangeAddressList = new CellRangeAddressList(1, 1000, 6, 6);
             cacse = new HSSFDataValidation(rangeAddressList, formula);
             cacse.createErrorBox("error", "请选择正确的区");
             sheet.addValidationData(cacse);
             //设置格式
            CellStyle cellStyle = workbook.createCellStyle();      
       //设置边框:    
            cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框    
            cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框    
            cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框    
            cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框    
            //设置居中:   
            cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中    
            //设置字体:      
            Font font2 = workbook.createFont();    
            font2.setFontName("仿宋_GB2312");    
            font2.setFontHeightInPoints((short) 11);        
            cellStyle.setFont(font2);//选择需要用到的字体格式
            //设置标题行格式
            CellStyle cellStyleHeader = workbook.createCellStyle(); 
            //设置背景色
            cellStyleHeader.setFillForegroundColor(HSSFColor.LIME.index);
            cellStyleHeader.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            //设置边框:    
            cellStyleHeader.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框    
            cellStyleHeader.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框    
            cellStyleHeader.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框    
            cellStyleHeader.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框    
            //设置居中:   
            cellStyleHeader.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中    
            //设置字体:      
            Font font = workbook.createFont();    
            font.setFontName("黑体");    
            font.setFontHeightInPoints((short) 12);        
            cellStyleHeader.setFont(font);//选择需要用到的字体格式
            WritableCell cell;
            // 生成表头
            Row headerRow = sheet.createRow(0);
            for (int i = 0; i < fieldLabelArray.length; i++) {
                sheet.setDefaultColumnStyle(i, cellStyle);
                sheet.setColumnWidth(i, 4000);
                headerRow.createCell(i).setCellValue(fieldLabelArray[i]); 
                headerRow.getCell(i).setCellStyle(cellStyleHeader);
            }
            // 输出文件
            workbook.write(os);
            os.close();
        }catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
   }

 

 添加名称管理方法

private 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模板的主要内容,如果未能解决你的问题,请参考以下文章

省市县三级异步加载导航

从国家统计局官网获取最新省市区三级联动数据

Vant Cascader 省市县三级联动

django实现省市县三级联动

用vue实现省市县三级联动

原生JavaScript的省市县三级联动