話不多說,看效果圖,直接上代碼。
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 }