`
peteronline
  • 浏览: 259318 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java 动态生成多个excel文件打成zip包供用户下载

    博客分类:
  • Java
 
阅读更多
最近项目中有这样的需求:就是选择页面上的多条记录,每一条记录生成一个excel,然后把所有选择记录生成的excel打包成zip包供用户下载。
后台代码:
/**
	 * 批量导出Excel
	 * @return
	 * @throws DBException
	 */
	@SuppressWarnings("unchecked")
	public String batchExport() throws DBException{
		
		@SuppressWarnings("unused")
		List<String> chkList = this.checkValueToList();//获取复选框的值
		List<File> srcfile=new ArrayList<File>();
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHSS");
        String path = sdf.format(new Date());
        
        String serverPath = request.getSession().getServletContext().getRealPath("/");
        //在服务器端创建文件夹
        File file = new File(serverPath+path);
        if(!file.exists()){
        	file.mkdir();
        }

		for (int i = 0; i < chkList.size(); i++ ){
			String t[] = chkList.get(i).split("\\|");
			LhjcOrgSelfQuery lhjcunioncheckquery = new LhjcOrgSelfQuery();
			lhjcunioncheckquery.setChnoticeId(t[0]);
			lhjcunioncheckquery.setOrgId(t[1]);
			lhjcunioncheckquery.setSelfChTempId(t[2]);
			List<Map<String,String>> reportViews=commonService.getObjectPages("ExportLhjcunioncheckresultReportView", lhjcunioncheckquery);
			String orgName = (String)commonService.get2Object("getUnioncheckOrgName", t[1]);
			//生成excel的名字
			String templateName = nyear+"深圳市党政机关信息安全检查结果-"+(orgName==null?"未知单位":orgName);
			
			/** 表头数组 */
			String[] headArray = new String[]{"编码","检查项名称","   检查内容   ","考核类型","   检查结果   ","   备注   ","权重","得分"};
			
			/** 字段名数组 */
			String[] fieldArray = new String[]{"CHECKITEMCODE","CHITEMNAME","CHCONTENT","REPORTTYPE","QUESTDESC","CHITEMDESC","REPORTWEIGHT","UNIONSCORE"};
			
			ExportUtils exportUtils = new ExportUtils();
			exportUtils.setTitle(templateName);
			exportUtils.setHead(templateName);
			exportUtils.setHeadArray(headArray);
			exportUtils.setFieldArray(fieldArray);
			try {
				HttpServletResponse response = ServletActionContext.getResponse();
				
				SimpleDateFormat sfm = new SimpleDateFormat("yyyy-MM-dd");
				String filename = templateName + "_" + sfm.format(new Date());
				
				String encodedfileName = new String(filename.getBytes(), "GBK");
				//将生成的多个excel放到服务器的指定的文件夹中
				FileOutputStream out = new FileOutputStream(serverPath+path+"\\"+encodedfileName+".xls");
				
				if(fileType.indexOf(",") != -1){
					fileType = StringUtils.substringBefore(fileType, ",");
				}
				response.setHeader("Content-Disposition", " filename=\"" + encodedfileName + "." + fileType + "\"");
				
				//导出excel
				if ("xls".equals(fileType) || "xlsx".equals(fileType)) {
					exportUtils.exportExcel(reportViews,fileType,out);
				} else if("doc".equals(fileType) || "docx".equals(fileType)){
					exportUtils.exportWord(reportViews, fileType, out);
				} else if("pdf".equals(fileType)){
					exportUtils.exportPdf(reportViews, out);
				} 
				
				srcfile.add(new File(serverPath+path+"\\"+encodedfileName+".xls"));
				
			} catch (Exception e) {
				e.printStackTrace();
			} 
		}
		//将服务器上存放Excel的文件夹打成zip包
		File zipfile = new File(serverPath+path+".zip");
		this.zipFiles(srcfile, zipfile);
		//弹出下载框供用户下载
		this.downFile(ServletActionContext.getResponse(),serverPath, path+".zip");
		return null;
	}


	/**
	 * 将多个Excel打包成zip文件
	 * @param srcfile
	 * @param zipfile
	 */
	public void zipFiles(List<File> srcfile, File zipfile) {  
        byte[] buf = new byte[1024];  
        try {  
            // Create the ZIP file  
            ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipfile));  
            // Compress the files  
            for (int i = 0; i < srcfile.size(); i++) {  
                File file = srcfile.get(i);  
                FileInputStream in = new FileInputStream(file);  
                // Add ZIP entry to output stream.  
                out.putNextEntry(new ZipEntry(file.getName()));  
                // Transfer bytes from the file to the ZIP file  
                int len;  
                while ((len = in.read(buf)) > 0) {  
                    out.write(buf, 0, len);  
                }  
                // Complete the entry  
                out.closeEntry();  
                in.close();  
            }  
            // Complete the ZIP file  
            out.close(); 
        } catch (IOException e) {  
           e.printStackTrace();
        }  
    }  


	public void downFile(HttpServletResponse response,String serverPath, String str) {  
        try {  
            String path = serverPath + str;  
            File file = new File(path);  
            if (file.exists()) {  
                InputStream ins = new FileInputStream(path);  
                BufferedInputStream bins = new BufferedInputStream(ins);// 放到缓冲流里面  
                OutputStream outs = response.getOutputStream();// 获取文件输出IO流  
                BufferedOutputStream bouts = new BufferedOutputStream(outs);  
                response.setContentType("application/x-download");// 设置response内容的类型  
                response.setHeader(  
                        "Content-disposition",  
                        "attachment;filename="  
                                + URLEncoder.encode(str, "GBK"));// 设置头部信息  
                int bytesRead = 0;  
                byte[] buffer = new byte[8192];  
                 //开始向网络传输文件流  
                while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) {  
                   bouts.write(buffer, 0, bytesRead);  
               }  
               bouts.flush();// 这里一定要调用flush()方法  
                ins.close();  
                bins.close();  
                outs.close();  
                bouts.close();  
            } else {  
                response.sendRedirect("../error.jsp");  
            }  
        } catch (IOException e) {  
        	e.printStackTrace();
        }  
    }


页面调用:
<script language="javascript">
       <!-- 

//批量导出Excel
       function batchExport(){
       		var chkbox = $("input[type='checkbox'][name='chk'][checked]");
			if(chkbox.length == 0){
				alert('请选择一条或多条记录操作!');
				return;
			}
			$("#exportLoading").html('<img src="${ctx}/images/loading.gif"/>');
			
			var checkboxvalue = '';
			chkbox.each(function(){
				checkboxvalue += $(this).val()+",";
			});
			
			var nyear = document.getElementById('nyear').value;
			
			if(checkboxvalue != null && checkboxvalue.length > 0){
				
				checkboxvalue = checkboxvalue.substring(0,checkboxvalue.length-1);
				$('#checkboxvalue').val(checkboxvalue);
				
				var form = document.forms[0];
				form.action="${ctx}/core/lhjc/lhjccheckjd/batchExport.action?fileType=xls&chvalue="+checkboxvalue+"&nyear="+nyear;
			    form.submit();
			    $("#exportLoading").empty();
			}
			
       }
		
		-->
		</script>
分享到:
评论
4 楼 18335864773 2017-11-17  
用pageoffice 把.不需要文件的上传下载, 直接在线打开文档, 并且调用简单一句代码就可以下载文档.
3 楼 xhgrid 2015-08-25  
请问,exportUtils能提供参考吗?
2 楼 yzzanson 2013-05-15  
还有reportViews这个对象的基本组成
1 楼 yzzanson 2013-05-15  
你好 你的ExportUtil代码能参考下吗?

相关推荐

Global site tag (gtag.js) - Google Analytics