java实现浏览器下载excel文件

之前有写过一个简单版的excel导出(简单,就是在本地导出),今天要说的是从浏览器将数据导出为excel文件,其实也可以看做是在浏览器下载这个excel文件
在实际工作生活中,常常会有这种场景。我们需要将页面上的表格导出到本地excel文件中,从表面上看是从网页上直接导出的,其实它是在服务端运行的,首先获取前端的筛选条件,根据条件调用查询方法,查到数据之后,创建工作薄,工作表,行,列等(这里需要引入一个POI<Apache针对微软的文档发明的一种javaAPI>的jar包),并且将数据放入表中,然后将excel写入输出流中,最后将输出流写进HttpServletResponse输出流中,在前端通过触发这个接口,就可以实现在浏览器下载该excel文件
下面通过一个实例来感受一下:(主要学思路......)
/**
 * 导出所有学生列表
 * @param request
 * @return
 */
@ResponseBody
@RequestMapping(value="/exportStudent",method=RequestMethod.POST)
//注意,这里StudentRequest和StudentResponse都是自己封装的实体类
//StudentResponse是用来返回数据的,StudentRequest是用来接收参数(可以看做是查询条件)
public StudentResponse exportStudent(StudentRequest request,HttpServletResponse response) {
//创建工作薄
HSSFWorkbook wb = new HSSFWorkbook();
//创建工作表
HSSFSheet sheet = wb.createSheet();
//创建样式和字体
HSSFCellStyle curStyle = wb.createCellStyle();
HSSFFont curFont = wb.createFont();
//创建行列
HSSFRow nRow = sheet.createRow(0);
HSSFCell nCell = nRow.createCell(0);
//设置列的样式(具体实现在后面......)
nCell.setCellStyle(this.mainTitleStyle(curStyle, curFont));
//控制行号列号
int rowNo = 0;
int colNo = 0;
//列标题
String[] title;
title = new String[]{ "学号","年龄","性别","班级"};
//设置标题到第一行的列中
nRow = sheet.createRow(rowNo++);
for(int i = 0;i<title.length;i++) {
nCell = nRow.createCell(i);
nCell.setCellValue(title[i]);
nCell.setCellStyle(this.textStyle( curStyle, curFont));
}
//创建样式和字体(为什么又new,因为下面是正文部分了)
curStyle = wb.createCellStyle();
curFont = wb.createFont();
StudentResponse response = new StudentResponse();
try {
//通过调用逻辑层方法查询出数据
response  = StudentBiz.selectAllStudent(request);
List<StudentDto> studentList = response  .getStudentList();
//遍历并且创建行列
for (StudentDto dto : studentList ) {
colNo = 0;//控制列号
//每遍历一次创建一行
nRow = sheet.createRow(rowNo++);
//学号(先查询出,再将值设置到列中)
nCell = nRow.createCell(colNo++);
nCell.setCellValue(dto.getNum());
nCell.setCellStyle(this.textStyle( curStyle, curFont));
//年龄
nCell = nRow.createCell(colNo++);
nCell.setCellValue(dto.getAge);
nCell.setCellStyle(this.textStyle( curStyle, curFont));
//性别
nCell = nRow.createCell(colNo++);
nCell.setCellValue(dto.getSex);
nCell.setCellStyle(this.textStyle(curStyle, curFont));
//班级
nCell = nRow.createCell(colNo++);
nCell.setCellValue(dto.getClass);
nCell.setCellStyle(this.textStyle( curStyle, curFont));
}
//到这里,excel就已经生成了,然后就需要通过流来写出去
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//将excel写入流
wb.write(byteArrayOutputStream);
//设置文件标题			
String dateTime = DateFormatUtils.format(new Date(), "yyyyMMddHHmm");
String outFile = "学生列表-"+dateTime + ".xls";
//设置返回的文件类型
response.setContentType("application/vnd.ms-excel;charset=utf-8");
//对文件编码
outFile = response.encodeURL(new String(outFile.getBytes("gb2312"), "iso8859-1"));
//使用Servlet实现文件下载的时候,避免浏览器自动打开文件
response.addHeader("Content-Disposition", "attachment;filename=" + outFile);
//设置文件大小
response.setContentLength(byteArrayOutputStream.size());
//创建Cookie并添加到response中
Cookie cookie = new Cookie("fileDownload", "true");
cookie.setPath("/");
response.addCookie(cookie);
//将流写进response输出流中
ServletOutputStream outputstream = response.getOutputStream();
byteArrayOutputStream.writeTo(outputstream);

byteArrayOutputStream.close();
outputstream.flush();	
} catch (Exception e) {
parkVehicleResponse.setMsg("导出列表失败");
return parkVehicleResponse;
}
return null;
}
******以下两个方法是设置样式的方法,通常表格中标题和正文样式都不一样的,所以不同地方选择不同方法来设置样式
/**
 *  表格标题样式
 * @param curStyle
 * @param curFont
 * @return
 */
private HSSFCellStyle mainTitleStyle( HSSFCellStyle curStyle, HSSFFont curFont) {
curStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);	//水平居中
curStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
curFont.setFontName("宋体");	//字体
curFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 加粗
curFont.setFontHeightInPoints((short) 16);//字体大小
curStyle.setFont(curFont); // 绑定关系
return curStyle;
}	
/**
 * 表格内容样式
 * @param curStyle
 * @param curFont
 * @return
 */
private HSSFCellStyle textStyle(HSSFCellStyle curStyle, HSSFFont curFont) {
curStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT);//左对齐
curStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
curStyle.setWrapText(true); // 自动换行
curStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); // 实线
curStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 实线
curStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); // 实线
curStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); // 实线
curFont.setFontName("Times New Roman");//字体
curFont.setFontHeightInPoints((short) 10);//字体大小
curStyle.setFont(curFont); // 绑定关系
return curStyle;
}
在前端只要通过某一个事件(比如:点击)来触发这个URL("/exportStudent")就可以实现在浏览器将该文件导出来
发布了72 篇原创文章 · 获赞 49 · 访问量 16万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览