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都给赋予相关的样式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值