导入导出在实际应用中必不可少,废话少说切入正题。
一:在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", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8")))); response.setHeader("Content-Disposition", "attachment;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", "attachment;filename=" +new String(fileName.getBytes("utf-8"),"iso8859-1"));
这行代码防止中文乱码。