1. 程式人生 > >java利用POI通過模板匯出excel的一個例項

java利用POI通過模板匯出excel的一個例項

寫之前,大家請先下好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都給賦予相關的樣式