JS代码
exportExcel = function (type) {
var obj=JSON.stringify($('#searchForm').serializeJSON());
$.ajax({
//这里是公共方法的连接
url: "exportExcelController/submitExcelData.action",
type: "post",
dataType: "json",
data:"obj="+obj,
success: function (data) {
if (data&&data.code=="1") {
//这里是每个JavaBean对应的控制层方法
window.location.href = "dogController/export.action";
//我们这里缺少导出成功的提示,有需要的自行想办法添加
} else {
$.messager.show({
title:'提示',
msg:"导出失败~",
timeout:3000,
showType:'slide'
});
}
},
error: function (err) {
$.messager.show({
title:'提示',
msg:"导出失败~",
timeout:3000,
showType:'slide'
});
}
});
};
controller层java代码
@RequestMapping(value = "submitExcelData")
@ResponseBody
public String submitExcelData(HttpServletRequest request, HttpServletResponse response, String obj) throws IOException {
// 设置响应和请求编码utf-8
request.setCharacterEncoding("UTF-8");
JSONObject jsonResult = new JSONObject(); // 返回界面端的json对象
// 将参数信息存入session中
HttpSession session = request.getSession();
//这里可以先做非空判断,不写了
try {
session.setAttribute("obj", obj);
} catch (Exception e) {
jsonResult.put("code","0");
return jsonResult.toString();
}
jsonResult.put("code","1");
return jsonResult.toString();
}
@RequestMapping("export")
@ResponseBody
public String exportExcel(HttpServletRequest request, HttpServletResponse response) throws IOException {
HttpSession session = request.getSession();
String obj=(String)session.getAttribute("obj");
//如果页面传的是json字符串,用下列方式解析
JSONObject parseObject = JSONObject.parseObject(obj); //string转json
//将json数据转换为Dog对象,作为我们的查询条件
Dog dog= (Dog ) JSONObject.toJavaObject(parseObject, Dog .class);
List<Dog > list = dogService.findJksbxxb(dog);//从数据库查询需要的数据
String result = "";
//这里是个公共方法
result = ExportExcelTool.downloadExcel(request, response, list);
return result;
}
公共方法
public static String downloadExcel(HttpServletRequest request, HttpServletResponse response,List list) throws IOException {
// 设置响应和请求编码utf-8
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String result = "导出失败";
HttpSession session = request.getSession();
Date date = new Date();
DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
String strFileName = format.format(date) + ".xls";// 默认当前时间为Excel名称
response=setResponseHeader(request, response, strFileName);//设置表头
response.flushBuffer();// 刷新缓冲
result = exportToExcel(list, response);
return result;
}
/**
* 设置response表头,这个关键
* @param request
* @param response
* @param strFileName
* @return
* @throws UnsupportedEncodingException
*/
public static HttpServletResponse setResponseHeader(HttpServletRequest request,HttpServletResponse response,
String strFileName) throws UnsupportedEncodingException{
response.setContentType("application/octet-stream; charset=utf-8");
if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {
response.setHeader("Content-Disposition",
"attachment; filename=" + new String(strFileName.getBytes("UTF-8"), "ISO8859-1"));// firefox浏览器
} else if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) {
response.setHeader("Content-Disposition",
"attachment; filename=" + URLEncoder.encode(strFileName, "UTF-8"));// IE浏览器
} else {
response.setHeader("Content-disposition", "attachment;filename=" + strFileName);
}
return response;
}
/**
* 导出Excel
* @param dataList
* @param filePath
* @param req
*/
public static String exportToExcel(List dataList,HttpServletResponse response){
//导出结果
String result = "";
//创建Excel工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//创建一个工作表sheet
HSSFSheet sheet = workbook.createSheet();
//创建第一行
HSSFRow row = sheet.createRow(0);
HSSFCell cell = null;
//插入第一行数据,中文列名
/*自行添加*/
//追加数据 dataList.size()行数
for (int i = 0; i < dataList.size(); i++) {
HSSFRow nextrow = sheet.createRow(i+1);
//向每一列填充数据
Object obj = dataList.get(i);
/*自己添加*/
}
try {
//最后一步,已流的形式返回
workbook.write(response.getOutputStream());
result = "导出成功";
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
result = "导出失败";
}
return result;
}
由于本人菜鸟一枚,理解比较肤浅,很难解释清楚原理,方法也都是从网上各个地方看来的,这里只是做个总结。
虽然解释不清楚,但是主体代码应该比较详尽,基本上根据各自项目需求稍作修改就可以用。
前台需要引入JQuery和jquery.serializeJSON。
jquery.serializeJSON的下载地址
https://github.com/marioizquierdo/jquery.serializeJSON
后台需要阿里巴巴的FastJSON