导入导出在实际应用中必不可少,废话少说切入正题。
一:在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"));
这行代码防止中文乱码。
转载于:https://blog.51cto.com/8648389/1612228