报表的开发常常涉及到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无法调用到浏览器的下载处理机制和程序。
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();
}
}
}
}