java利用POI通過模板匯出excel的一個例項
阿新 • • 發佈:2019-01-30
寫之前,大家請先下好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都給賦予相關的樣式