不喜欢说哪些虚头巴脑的东西,能解决问题的帖子才是好帖子。
上干货:
@RequestMapping("/exportExcel")
@ResponseBody
public void createExcel(HttpServletResponse res,Integer id,HttpServletResponse response) {
mobileTerminal = mobileTerminalService.queryMobileTerminalById(id);
HSSFWorkbook workbook = new HSSFWorkbook();// 创建一个Excel文件
SXSSFWorkbook workBook = new SXSSFWorkbook(1000);//内存中最多存放一千条数据,防止内存溢出
HSSFSheet sheet = workbook.createSheet("设备终端表"); //创建一个工作表
HSSFRow hssfRow = sheet.createRow(0); //添加表头行
sheet.setColumnWidth(0, 150 * 40);
HSSFCellStyle cellStyle = workbook.createCellStyle(); // 设置单元格格式居中
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
HSSFCell headCell = hssfRow.createCell(0);
headCell.setCellValue("终端品牌");
headCell.setCellStyle(cellStyle);
headCell = hssfRow.createCell(1);
headCell.setCellValue("终端型号");
headCell.setCellStyle(cellStyle);
headCell = hssfRow.createCell(2);
headCell.setCellValue("终端数量");
headCell.setCellStyle(cellStyle);
// 添加数据内容
for (int i = 0; i < mobileTerminal.size(); i++) {
hssfRow = sheet.createRow((int) i + 1);
MobileTerminal mobile = mobileTerminal.get(i);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 创建单元格,并设置值
HSSFCell cell = hssfRow.createCell(0);
cell.setCellValue(mobile.getTerminal_brand());
cell.setCellStyle(cellStyle);
cell = hssfRow.createCell(1);
cell.setCellValue(mobile.getTerminal_model());
cell.setCellStyle(cellStyle);
cell = hssfRow.createCell(2);
cell.setCellValue(mobile.getTerminal_num());
cell.setCellStyle(cellStyle);
}
try {
Date day=new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String name = "XX数据"+ df.format(day);
String codedFileName = new String(name.getBytes("gbk"), "iso-8859-1");
response.setHeader("Content-Disposition", "attachment;filename=" + codedFileName + ".xlsx");
// 响应类型,编码
response.setContentType("application/octet-stream;charset=UTF-8");
// 形成输出流
OutputStream osOut = response.getOutputStream();
// 将指定的字节写入此输出流
workbook.write(osOut);
// 刷新此输出流并强制将所有缓冲的输出字节被写出
osOut.flush();
// 关闭流
osOut.close();
/*
* dispose of temporary files backing this workbook on disk 处理在磁盘上备份此工作簿的临时文件
* SXSSF分配临时文件,您必须始终清除显式,通过调用dispose方法
*/
workBook.dispose();
} catch (Exception e) {
e.printStackTrace();
}
}
前台代码:
exportExcel(){
var _this = this;
window.location.href=globalData.pre+"/mobileTerminal/exportExcel?id="+_this.Id;
}
<a title="导出excel" type="button" @click="exportExcel()"><i class="layui-icon"></i></a>
复制的样式有点乱 ,凑合看吧,
切记前台请求一定不要用ajax请求、不要用ajax请求、不要用ajax请求、重要的事情说三遍,如果你用了ajax请求下载框一定不会弹出来的,我就被这个玩意坑了一个多小时,使用ajax死活不出来,最后才明白ajax是无法执行response返回的内容才导致无法弹出下载框的,
总结一下为什么下载请求不能放在ajax里发送:
原因:ajax函数的返回类型只有xml、text、json、html等类型,没有“流”类型,所以我们要实现ajax下载,不能够使用相应的ajax函数进行文件下载。因为response原因,一般请求浏览器是会处理服务器输出的response,例如生成png、文件下载等,然而ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的,ajax不会将文件下载,而是会将文件解析成json字符。文件的下载是以二进制形式进行的,虽然可以读取到返回的response,但只是读取而已,是无法执行的,说白点就是js无法调用到浏览器的下载处理机制和程序。
文件下载可以使用window.location.href(),也可以使用window.open(),还可以使用form表单提交。