寫之前,大家請先下好poi的相關jar包,網上遍地都是,不多說
<input type="button" id="exportBtn" class="CommonBtn" value="導出Excel" /> 這個是按鈕
這個是相關事件
// 導出按鈕 $('#exportBtn').click(function(){ txtBeginDate = $('#txtBeginDate').datebox('getValue'); txtEndDate = $('#txtEndDate').datebox('getValue'); window.location.href='${CTX_ROOT}/TBoilerrunlogController?method=getExcelByBoiler&begin='+txtBeginDate+'&end='+txtEndDate+''; }); //我是轉向spring mvc的controllor里面了,我這里還給傳了倆個值,一個是開始時間,一個是結束時間
controllor代碼如下:
@RequestMapping(params = "method=getExcelByBoiler") @ResponseBody public String getExcelByBoiler(HttpServletRequest request, HttpServletResponse response) { String begin=""; String end=""; if(request.getParameter("begin")!=null && request.getParameter("end") !=null){ begin=request.getParameter("begin"); end = request.getParameter("end"); } try { String path =request.getServletContext().getRealPath("") + "/excelTemplate/統計.xls"; //這個是我的excel模板 InputStream in = new FileInputStream(new File(path)); SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //為了轉時間 HSSFWorkbook work = new HSSFWorkbook(in); // 得到excel的第0張表 HSSFSheet sheet = work.getSheetAt(0); // 得到第1行的第一個單元格的樣式 HSSFRow rowCellStyle = sheet.getRow(2); HSSFCellStyle columnOne = rowCellStyle.getCell(0).getCellStyle(); HSSFCellStyle columnOne1 = rowCellStyle.getCell(1).getCellStyle(); HSSFCellStyle columnOne2 = rowCellStyle.getCell(4).getCellStyle(); // 這里面的行和列的數法與計算機里的一樣,從0開始是第一 // 填充title數據 HSSFRow row = sheet.getRow(0); HSSFCell cell = row.getCell(2); cell.setCellValue("一號機組啟停統計(" + begin + "~" + end + ")"); int i = 2;// 計數器 List<Map<String, Object>> list = this.getBoilerRunlog("GL1",begin,end); // 創建每個單元格,添加樣式,最后合並 work.getSheetAt(0).shiftRows(3, 3, list.size() - 1); // 把第三行移動到列表的長度-1的地方 這個地方我是要把模板的第四行放到最后一行 int numberbegin = 0;// 統計 int numberend = 0;// 統計 for (Map map : list) { row = sheet.createRow(i);// 得到行 cell = row.createCell(0);// 得到第0個單元格 if (!(map.get("actiondatetime") == null)) { cell.setCellValue(simpleFormat.format(map.get("actiondatetime"))); } else { cell.setCellValue(""); } cell.setCellStyle(columnOne);// 填充樣式 cell = row.createCell(1); if (!(map.get("actionstatus") == null)) { cell.setCellValue(map.get("actionstatus").toString()); } else { cell.setCellValue(""); } cell.setCellStyle(columnOne1);// 填充樣式 cell = row.createCell(2); if (!(map.get("logmemo") == null)) { cell.setCellValue(map.get("logmemo").toString()); } else { cell.setCellValue(""); } cell.setCellStyle(columnOne1);// 填充樣式 cell = row.createCell(3); if (!(map.get("rundays") == null)) { cell.setCellValue(map.get("rundays").toString()); numberbegin++; } else { cell.setCellValue(""); } cell.setCellStyle(columnOne1);// 填充樣式 cell = row.createCell(4); if (!(map.get("stophours") == null)) { cell.setCellValue(map.get("stophours").toString()); numberend++; } else { cell.setCellValue(""); } cell.setCellStyle(columnOne2);// 填充樣式 // .....給每個單元格填充數據和樣式 i++; } HSSFRow row1 = sheet.getRow(list.size() + 2); HSSFCell cell1 = row1.getCell(0); cell1.setCellValue("啟停共" + (numberbegin+numberend) + "次," + "其中啟" + numberbegin + "次,停" + numberend + "次");// /*******************************sheet二*******************************************/ HSSFSheet sheet1 = work.getSheetAt(1); // 得到第1行的第一個單元格的樣式 HSSFRow rowCellStyle1 = sheet1.getRow(2); HSSFCellStyle columnOne01 = rowCellStyle1.getCell(0).getCellStyle(); HSSFCellStyle columnOne02 = rowCellStyle1.getCell(1).getCellStyle(); HSSFCellStyle columnOne03 = rowCellStyle1.getCell(4).getCellStyle(); HSSFRow row2 = sheet1.getRow(0); HSSFCell cell2 = row2.getCell(2); cell2.setCellValue("二號機組啟停統計(" + begin + "~" + end + ")"); int j = 2;// 計數器 List<Map<String, Object>> list2 = this.getBoilerRunlog("GL2",begin,end); // 創建每個單元格,添加樣式,最后合並 work.getSheetAt(1).shiftRows(3, 3, list2.size() - 1); // 把第三行移動到列表的長度-1的地方 int numberbegin1 = 0;// 統計 int numberend1 = 0;// 統計 for (Map map : list2) { row2 = sheet1.createRow(j);// 得到行 cell2 = row2.createCell(0);// 得到第0個單元格 if (!(map.get("actiondatetime") == null)) { cell2.setCellValue(simpleFormat.format(map.get("actiondatetime"))); } else { cell2.setCellValue(""); } cell2.setCellStyle(columnOne01);// 填充樣式 cell2 = row2.createCell(1); if (!(map.get("actionstatus") == null)) { cell2.setCellValue(map.get("actionstatus").toString()); } else { cell2.setCellValue(""); } cell2.setCellStyle(columnOne02);// 填充樣式 cell2 = row2.createCell(2); if (!(map.get("logmemo") == null)) { cell2.setCellValue(map.get("logmemo").toString()); } else { cell2.setCellValue(""); } cell2.setCellStyle(columnOne02);// 填充樣式 cell2 = row2.createCell(3); if (!(map.get("rundays") == null)) { cell2.setCellValue(map.get("rundays").toString()); numberbegin1++; } else { cell2.setCellValue(""); } cell2.setCellStyle(columnOne02);// 填充樣式 cell2 = row2.createCell(4); if (!(map.get("stophours") == null)) { cell2.setCellValue(map.get("stophours").toString()); numberend1++; } else { cell2.setCellValue(""); } cell2.setCellStyle(columnOne03);// 填充樣式 // .....給每個單元格填充數據和樣式 i++; } HSSFRow row3 = sheet1.getRow(list2.size() + 2); HSSFCell cell3 = row3.getCell(0); cell3.setCellValue("啟停共" + (numberbegin1+numberend1) + "次," + "其中啟" + numberbegin1 + "次,停" + numberend1 + "次");// /****************************輸出流*****************************************/ String address = simpleFormat.format(new Date()); OutputStream os = response.getOutputStream();// 取得輸出流 response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment;filename=jzqttj_"+address+".xls"); work.write(os); os.close(); } catch (FileNotFoundException e) { System.out.println("文件路徑錯誤"); e.printStackTrace(); } catch (IOException e) { System.out.println("文件輸入流錯誤"); e.printStackTrace(); } return null; }
這個大概思路就是,我把提前寫好的excel模板的要遍歷的那一行每個cell(單元格)的樣式復制出來,然后在接下來的每行每個cell都給賦予相關的樣式
版權聲明:本文為博主原創文章,未經博主允許不得轉載。