导入导出在实际应用中必不可少,废话少说切入正题。

一:在easyui中,导出按钮:

{
			  text:"导出Excle",
			  iconCls:"icon-export",
			  handler:function(){
			     var rows=datagrid.datagrid("getSelections");
			     if(rows.length>0){
			      var ids=[];
			      for(var i=0;i<rows.length;i++){
			       ids.push(rows[i].id);
			      
			      }
			       console.info(ids.join(","));
			       //datagrid.datagrid("clearSelections");
			      // alert(datagrid.datagrid("getSelections").length);
			       location.href="user_export?ids="+ids.join(",");
			       
			       //window.location("user_export?ids="+ids.join(","));
			     
			     }
			  }
			
			
			
			}

注意1:获取到选择的id,加到ids数组中,传往后台时必须是ids.join(","),这样传到后台的样式为“1,2,3....”这样的格式的字符串,然后按照逗号分隔,形成数组,利用getByIds方法查到数组库中的数据。getByIds代码:

/**
	 * 批量操作
	 * @param ids
	 * @return
	 */
	public List<T> getByIds(final Integer[] ids) {
		if (ids == null || ids.length == 0) {
			return Collections.EMPTY_LIST;
		}else{
			List<T> list= hibernateTemplate.executeFind(new HibernateCallback() {
				
				public Object doInHibernate(Session session) throws HibernateException,
						SQLException {
					Query query=session.createQuery("from "+clazz.getSimpleName()+" where id IN(:ids)");//:与ids间别有空格,会有bug
					
					return query.setParameterList("ids", ids).list();
				}
			});
			return list;
			
		}

		
				
	}

注意2:发送下载请求时,不能采用ajax提交,具体原因见资料。只需要一句话location.href=url;即可

二,后台操作

传入后台后实现以下操作:批量查出前台选中数据,创建工作簿,设置表头,填充数据,创建输出流输出。

1.export方法:

 public void export() throws Exception{
	 System.out.println(ids+"HHHHHHH");
	
	 //表头
	 String[] headers={"编号","姓名","创建时间"," 最后修改时间"};
	 Workbook wb=new HSSFWorkbook();
	 String [] str=ids.split(",");
	Integer [] ids1=new Integer[str.length];
	for(int i=0;i<str.length;i++){
		ids1[i]=Integer.valueOf(str[i]);
	}
	List<User> users=userServiceImpl.getByIds(ids1);
	System.out.println(users.size()+",,,,,,,,");
   //填充表
	ExcelUtil.fillUserExcel(users, wb, headers);
	//System.out.println("测试填充效果"+wb.getSheetAt(0).getRow(1).getCell(1).getStringCellValue());
  //输出
	ResponseUtil.export(ServletActionContext.getResponse(), wb, "员工.xls");
	 
	 
 }
	

ExcleUtil:

public class ExcelUtil {
	public static void fillUserExcel(List<User> list,Workbook wb,String[] headers){
		int rowNum=0;
		Sheet sheet=wb.createSheet();
		Row row=sheet.createRow(rowNum++);
		//填充表头
		for(int i=0;i<headers.length;i++){
			row.createCell(i).setCellValue(headers[i]);
		}
		for(int i=0;i<list.size();i++){
			 row=sheet.createRow(rowNum++);
			 row.createCell(0).setCellValue(list.get(i).getNumber());
			 row.createCell(1).setCellValue(list.get(i).getName());
			 row.createCell(2).setCellValue(new SimpleDateFormat("yyyy-mm-dd").format(list.get(i).getCreateTime()));
			 row.createCell(3).setCellValue(new SimpleDateFormat("yyyy-mm-dd").format(list.get(i).getModifyTime()));
			 //System.out.println("姓名:"+row.getCell(1).getStringCellValue());
		}
		
		
	}
}
ResponseUtil
/**
 * 用于下载
 * @author Administrator
 *
 */
public class ResponseUtil {
	public static void export(HttpServletResponse response,Workbook wb,String fileName) throws IOException{
		 //response.setHeader("Content-disposition", "p_w_upload;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
		 response.setHeader("Content-Disposition", "p_w_upload;filename="
					+new String(fileName.getBytes("utf-8"),"iso8859-1"));
			//response.setHeader("Connection", "close");
			response.setHeader("Content-Type", "application/vnd.ms-excel");
            System.out.println(response.getContentType());
			wb.write(response.getOutputStream());
		
	}

}

这样就可以实现下载啦。

最后声明:导出必须不能使用ajax,如果使用了你有活干啦,尽情的发挥你的bug大法吧,到头来,代码感觉没有错误,就是不出来,呵呵,我也是折腾了半天。

response.setHeader("Content-Disposition", "p_w_upload;filename="
					+new String(fileName.getBytes("utf-8"),"iso8859-1"));

这行代码防止中文乱码。