天天看点

Excel上传至服务器与从服务器弹框下载到本地

报表的开发常常涉及到Excel的生成已经下载至本地,本公司经常采用的是poi。下载的时候把查询的参数传过去,获取查询数据,然后在下载。而我这里要写的就是Excel导入数据至数据库,以及Excel的模本从服务器下载。

1.Excel导入数据至数据库,首先要实现的就是把Excel上传至服务器,这里要注意一下Excel的版本问题,Excel2007以前是.xls的后缀,而以后就是.xlsx。

    1.1前端的ajax请求:

$.ajax({  
						          url: 'tMonitorDrugList/addMonitorDrugList' ,  
						          type: 'POST',  
						          data: formData,  
						          async: false,  
						          cache: false,  
						          contentType: false,  
						          processData: false,  
						          success: function (returndata) {  
						              alert(returndata);  
						          },  
						          error: function (returndata) {  
						              alert(returndata);  
						          }  
						     });  
           

1.2controller中方法:

@RequestMapping(value ="/addMonitorDrugList")
	@ResponseBody
	public Map<String,Object> addMonitorDrugList(ModelMap modelMap, MultipartFile file, HttpServletRequest request) throws IllegalStateException, IOException{
		Map<String,Object> resultMap = new HashMap<String, Object>();
		String filePath = fileUpload(file, request); 
		System.out.println(filePath);
	    return resultMap;
	}

/**
	 *  文件上传至服务器
	 * @param file
	 * @param request
	 * @return
	 * @throws IOException
	 */
	private String fileUpload(MultipartFile file, HttpServletRequest request)
			throws IOException {
		/*
		//判断是不是Multipart提交
		if(ServletFileUpload.isMultipartContent(request)){
			System.out.println("是Multipart");
		}else{
			System.out.println("不是Multipart");
		}*/
		String path = request.getSession().getServletContext().getRealPath("upload");  
		path =path + File.separatorChar + DateUtils.getYearAndMonthString() ;
		String fileName = file.getOriginalFilename();  
		String[] fileNames =fileName.split("\\.");
		fileName = fileNames[0]+"_"+DateUtils.getTimeString()+"."+fileNames[1];
        File dir = new File(path,fileName);
        String filePath =path+File.separator+fileName;
        if(!dir.exists()){  
            dir.mkdirs();  
        }  
	    file.transferTo(dir);
	    return filePath;
	}
           

2.Excel模本的下载,我们把excel模本放在服务以供客户下载,Excel的 下载,我们只要设置response的一些特定的参数即可,但是这里我们要注意的是,文件下载不要采用ajax异步请求的方式。原因:因为response原因,一般请求浏览器是会处理服务器输出的response,例如生成png、文件下载等,然而ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。文件的下载是以二进制形式进行的,虽然可以读取到返回的response,但只是读取而已,是无法执行的,说白点就是js无法调用到浏览器的下载处理机制和程序。

Excel上传至服务器与从服务器弹框下载到本地

2.1前端js代码:

//下载模版
	$("#down_template").click(function(){
		$("#search_roleForm").submit();
	});
           

2.2controller中的方法。

/**
	 * 文件从服务器下载
	 * @param filePath 文件路径
	 * @param request
	 * @param response
	 * @throws IOException 
	 */
	private void fileDown(String filePath, HttpServletRequest request, HttpServletResponse response){
		String fileName="监控数据模板表格";
		File file = new File(filePath);
		if(!file.exists()){
			System.out.println("要下载的文件不存在");
			return;
		}
		//设置response参数,可以打开下载页面
		response.reset();
        response.setContentType("application/vnd.ms-excel;charset=utf-8");  
	    try {
			response.setHeader("Content-Disposition", "attachment;filename="
			     + new String((fileName + ".xlsx").getBytes(), "iso-8859-1"));
		} catch (UnsupportedEncodingException e1) {
			e1.printStackTrace();
		}
	    BufferedInputStream bis = null;
	    BufferedOutputStream bos = null;
		try {
			ServletOutputStream out = response.getOutputStream();
			bis = new BufferedInputStream(new FileInputStream(file));
			bos = new BufferedOutputStream(out);
			byte[] buff = new byte[2048];
			int bytesRead;
			while(-1!=(bytesRead=bis.read(buff,0,buff.length))){
				bos.write(buff,0,bytesRead);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(bis!=null){
				try {
					bis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(bos!=null){
				try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}