java使用poi以下载的形式导出excel

 不喜欢说哪些虚头巴脑的东西,能解决问题的帖子才是好帖子。

上干货:

@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">&#xe601;</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表单提交。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值