動態從數據庫獲取數據,省市縣三級聯動,有校驗,導出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;
        }
    }

有更好的希望能給給我郵箱發一封,大家共同學習,共同進步,有部分內容網上找的,如有冒犯,請諒解,本人,菜鳥。

導入有時間再整理。

處理一些bug

1.超255錯誤

1     for (Object fmerchantI : faMerchantList) {
2                 Map merchantf=(Map) fmerchantI;
3                 faMerchantArr[faMerchantIndex]=(String) merchantf.get("NAME");
4                 faMerchantIndex++;
5             }
6             areaFatherNameArr.add("上級商戶"); 7             areaMap.put("上級商戶",faMerchantArr); 8             // 創建Sheet
9             String sheetName = name;

 1 //添加名稱管理
 2                 String range = getRange(1,rowId,son.length);
 3                 Name names =workbook.createName();
 4                 names.setNameName(key);
 5                 String formula ="area!"+range;
 6                 names.setRefersToFormula(formula);
 7                 //避免超過255錯誤
 8                 if("上級商戶".equals(key)){  9                     merChantName=formula; 10                 }
1  // 父級商戶
2             DVConstraint faConstraint = DVConstraint.createFormulaListConstraint(merChantName); 3             CellRangeAddressList faRangeAddressList = new CellRangeAddressList(1, 1000, 3, 3);

2.對市和區設置有效性,有時無效的處理,去掉原先的市區有效性,新加如下:

1 //對前1000行設置有效性
2   for(int i = 2;i < 1000;i++){ 3        setDataValidation("E" ,sheet,i,6); 4        setDataValidation("F" ,sheet,i,7); 5  } 
6  //設置格式
7  CellStyle cellStyle = workbook.createCellStyle();   
 1 //設置有效性
 2      /* @param offset 主影響單元格所在列,即此單元格由哪個單元格影響聯動
 3      * @param sheet
 4      * @param rowNum 行數
 5      * @param colNum 列數
 6      */
 7     public static void setDataValidation(String offset,HSSFSheet sheet, int rowNum,int colNum) {
 8         HSSFDataValidationHelper dvHelper = new HSSFDataValidationHelper(sheet);
 9         DataValidation data_validation_list;
10             data_validation_list = getDataValidationByFormula(
11                     "INDIRECT($" + offset +"$"+ (rowNum) + ")", rowNum, colNum,dvHelper);
12         sheet.addValidationData(data_validation_list);
13     }
14 
15   /**
16      * 加載下拉列表內容
17      * @param formulaString
18      * @param naturalRowIndex
19      * @param naturalColumnIndex
20      * @param dvHelper
21      * @return
22      */
23     private static  DataValidation getDataValidationByFormula(
24             String formulaString, int naturalRowIndex, int naturalColumnIndex,HSSFDataValidationHelper dvHelper) {
25         // 加載下拉列表內容
26         // 舉例:若formulaString = "INDIRECT($A$2)" 表示規則數據會從名稱管理器中獲取key與單元格 A2 值相同的數據,
27         //如果A2是江蘇省,那么此處就是江蘇省下的市信息。
28         DVConstraint formula = DVConstraint.createFormulaListConstraint(formulaString);
29         // 設置數據有效性加載在哪個單元格上。
30         // 四個參數分別是:起始行、終止行、起始列、終止列
31         int firstRow = naturalRowIndex -1;
32         int lastRow = naturalRowIndex - 1;
33         int firstCol = naturalColumnIndex - 1;
34         int lastCol = naturalColumnIndex - 1;
35         CellRangeAddressList regions = new CellRangeAddressList(firstRow,
36                 lastRow, firstCol, lastCol);
37         // 數據有效性對象
38         // 綁定
39         HSSFDataValidation data_validation_list = (HSSFDataValidation) dvHelper.createValidation(formula, regions);
40         data_validation_list.createErrorBox("error", "請選擇正確的市或區");   
41         return data_validation_list;
42     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM