前言: 

今天工作很闲,无意中发现同事做的一个动态导出功能,之前自己也利用POI做过excle的导出功能,但都是通过提前 定义导出文件,写死要导出的字段,在访问数据库获取导出信息,在写入excle的方式,这次同事要做的和我之前做的效果有点不一样,他是需要根据客户自己的需要,选取要导出的字段,动态的生成excle文件的需求,因为自己不知道要如何实现,所以趁着闲暇,细细的研究了一下他的实现过程,再次做个总结,权当学习,当然也希望能够帮助到那些正在忧愁不知道如何实现这个功能的小伙伴。

一、实现效果:

点击页面的导出功能,弹出一个dalig对话框,对话框显示出可以导出的的所有字段,勾选要导出的字段,点击确定按钮,实现将选中字段在数据库中存储的信息导出到excle中。

二、实现效果图:

导出文件如下:

打开excle内如如下:

三、实现代码:

    3.1 、 前端代码:

    3.1.1、 导出按钮实现:

               /***操作按钮*/var toolbar = [{id:'hpms_ht_export',text:'导出',iconCls:'icon-tip',handler:function(){selectExportCloumn();},disabled:false}];/**选择要导出的列**/function selectExportCloumn(){$("#exportColumnDialog").dialog("open");}

3.1.2 对话框的实现代码:

<div id="exportColumnDialog" class="easyui-dialog" title="请选择要导出的信息" style="width:900px;height:400px;"data-options="iconCls:'icon-save',resizable:true,modal:true"><table id="columnGridObject" ><tr height="40px;"><td style="width: 130px;"> <input type="checkbox" name="exportColumn" value="ID_NO;证件号码"/>证件号码</td><td style="width: 130px;"> <input type="checkbox" name="exportColumn" value="NAME;姓名"/>姓名</td><td style="width: 130px;"> <input type="checkbox" name="exportColumn" value="GENDER_CODE;性别"/>性别</td><td style="width: 130px;"> <input type="checkbox" name="exportColumn" value="BIRTH_DATE;出生日期"/>出生日期</td> <td style="width: 130px;"> <input type="checkbox" name="exportColumn" value="MARITAL_ST_CODE;婚姻状况"/>婚姻状况</td><td style="width: 130px;"> <input type="checkbox" name="exportColumn" value="NATION_CODE;民族"/>民族</td> <td style="width: 130px;"> <input type="checkbox" name="exportColumn" value="JOB_NUMBER;工号"/>工号</td>  </tr><tr height="40px;"><td > <input type="checkbox" name="exportColumn" value="ORG_CODE;工作机构代码"/>工作机构代码</td><td > <input type="checkbox" name="exportColumn" value="ORG_NAME;工作机构名称"/>工作机构名称</td><td > <input type="checkbox" name="exportColumn" value="DEPT_CODE;部门编码"/>部门编码</td><td > <input type="checkbox" name="exportColumn" value="DEPT_NAME;部门名称"/>部门名称</td> <td > <input type="checkbox" name="exportColumn" value="WORK_DATE;参加工作时间"/>参加工作时间</td><td > <input type="checkbox" name="exportColumn" value="TEL_PHONE;电话号码"/>电话号码</td> <td > <input type="checkbox" name="exportColumn" value="MOBILE_PHONE;手机号码"/>手机号码</td>  </tr><tr height="40px;"><td > <input type="checkbox" name="exportColumn" value="JKZK;健康状况"/>健康状况</td><td > <input type="checkbox" name="exportColumn" value="ZYZSLB;获得证书类别"/>获得证书类别</td><td > <input type="checkbox" name="exportColumn" value="ZYZSBM;执业证书编码"/>执业证书编码</td><td > <input type="checkbox" name="exportColumn" value="ZYLBDM;执业类别"/>执业类别</td> <td > <input type="checkbox" name="exportColumn" value="ZYFWDM;执业范围"/>执业范围</td><td > <input type="checkbox" name="exportColumn" value="SFDDZY;多地点执业"/>多地点执业</td> <td > <input type="checkbox" name="exportColumn" value="CSZYLBDM;从事专业类别"/>从事专业类别</td>  </tr><tr height="40px;"><td > <input type="checkbox" name="exportColumn" value="XZGLZWDM;行政职务"/>行政职务</td><td > <input type="checkbox" name="exportColumn" value="XZZWJB;行政职务级别"/>行政职务级别</td><td > <input type="checkbox" name="exportColumn" value="HBGB;后备干部"/>后备干部</td><td > <input type="checkbox" name="exportColumn" value="RZSJ;任职时间"/>任职时间</td> <td > <input type="checkbox" name="exportColumn" value="ZYJSZG;专业技术职务"/>专业技术职务</td><td > <input type="checkbox" name="exportColumn" value="QDZGSJ;取得资格时间"/>取得资格时间</td> <td > <input type="checkbox" name="exportColumn" value="PYSJ;聘用时间"/>聘用时间</td>  </tr><tr height="40px;"><td > <input type="checkbox" name="exportColumn" value="ZYJSZW;专业技术职务级别"/>专业技术职务级别</td><td > <input type="checkbox" name="exportColumn" value="NNRYLDQK;年内人员流动情况"/>年内人员流动情况</td><td > <input type="checkbox" name="exportColumn" value="JRDWFS;进入本单位方式"/>进入本单位方式</td><td > <input type="checkbox" name="exportColumn" value="DRDCSJ;调入/调出时间"/>调入/调出时间</td> <td > <input type="checkbox" name="exportColumn" value="BZQK;编制情况"/>编制情况</td><td colspan="2">  <input type="checkbox" name="exportColumn" value="PXHGZSQK;全科医生培训合格证书情况"/>全科医生培训合格证书情况</td>     </tr><tr height="40px;"><td colspan="3"> <input type="checkbox" name="exportColumn" value="ZYZCQK;已取得全科医生培训合格证书的医生执业注册情况"/>已取得全科医生培训合格证书的医生执业注册情况</td>  <td > <input type="checkbox" name="exportColumn" value="GWLB;岗位类别"/>岗位类别</td><td > <input type="checkbox" name="exportColumn" value="GWDJ;岗位等级"/>岗位等级</td> <td > <input type="checkbox" name="exportColumn" value="EDUCATION_CODE;最高学历"/>最高学历</td><td > <input type="checkbox" name="exportColumn" value="DEGREE_CODE;学位"/>学位</td></tr><tr height="40px;"><td > <input type="checkbox" name="exportColumn" value="ZYMC;所学专业"/>所学专业</td><td > <input type="checkbox" name="exportColumn" value="ZKTC;专科特长"/>专科特长</td><td colspan="2"> <input type="checkbox" name="exportColumn" value="XSTTRZ;社会/学术团体任职"/>社会/学术团体任职</td><td > <input type="checkbox" name="exportColumn" value="SFPZ;是否乡招村用"/>是否乡招村用</td></tr>          <tr><td></td><td></td> <td><a href="javascript:exportReport();" class="easyui-linkbutton search"  style="position: relative;" >确定</a> </td><td><a href="javascript:cancel();" class="easyui-linkbutton search"  style="position: relative;" >取消</a> </td></tr></table></div><!-- 下载 --><iframe id="downloadframe" style="display:none"></iframe>

3.1.3、确定按钮的实现js代码:

                /***导出excle                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               */function exportReport(){//查询参数var params = "";var param = $('#queryForm').serializeArray(); $.each(param, function() {if(param.name!='zyjszw' || param.name!='zyjszwjb' ||param.name!='xsch' ||param.name!='kynl' ||param.name!='xsry'){params += "&" + this.name + "=" + this.value;}});params += "&" + "zyjszw1" + "=" + $("#zyjszw").val();params += "&" + "zyjszwjb1" + "=" + $("#zyjszwjb").val();params += "&" + "xsch1" + "=" + $("#xsch").val();params += "&" + "kynl1" + "=" + $("#kynl").val();params += "&" + "xsry1" + "=" + $("#xsry").val();params += "&" + "qParentId1" + "=" + $("#qParentId").val();//选中机构orgId//获取当前查询总的记录条数var data=$('#dataGridObject').datagrid('getData');var total = data.total;var rows = $('#dataGridObject').datagrid('getSelections');//保存选中的empidsvar empIds = "";//导出记录信息超过500条if(rows.length > 500){$.messager.alert('提示',"导出信息的总条数超过500,请重新选择导出信息!",'info');return ;}else if( 0 < rows.length < 500  && 0 < rows.length < total){//遍历获取要导出人员的EMP_IDfor(var i = 0 ;i < rows.length ; i++ ){empIds = empIds + rows[i].EMP_ID + "," ;}}else if(total == 0){$.messager.alert('提示',"导出信息的总条数为0条,不能导出!",'info');return ;}params += "&" + "empIds" + "=" + empIds;//选中的员工ids 如果没选就是全部导出empIds为空///获取前端复选框选中的字段信息//// 1、选择要导出的列var checked = $("input[name='exportColumn']:checked");if(checked.length == 0 ){$.messager.alert("提示","请选择要导出的信息","info");return ;}else{var columns = "" ;//2、遍历checked 获取选中每个记录的value值$.each(checked ,function(i,n){//每个字段的value值用逗号连接保存在columns中columns = columns + $(this).val() + ",";});//3、在参数后面添加上columns信息params += "&columns=" + columns ;}var downloadframe = document.getElementById('downloadframe');//4、将参数传递到后台处理var url="${base}/ht/exportWithSelectColumn.action?type=ht&xzzw1=&xzzwjb1=&zzry1=&hbgb="+params;//        url=encodeURI(encodeURI(url));downloadframe.src = url;downloadframe.style.display = "none";} 

3.1.4、后台Controller代码:

  // 根据客户要导出的信息进行导出,(高级人才、领导干部通用)@SuppressWarnings("unchecked")@RequestMapping(value = "/exportWithSelectColumn")public void exportWithSelectColumn(HttpServletRequest request,HttpServletResponse response, String readFileName,String titlename,String xm,String  minnl ,String  maxnl ,String  xb ,String  zzmm ,String xl ,String zyjszw1 ,String  xsch1 ,String zyjszwjb1 ,String  xsry1 ,String  kynl1  ,String yxbz,String shzt ,String  childorg,String qParentId1,String empIds ,String xzzw1,String xzzwjb1,String zzry1,String hbgb,String type,String columns ) throws IOException {AuthInfo logininfo = SessionUtil.getLoginUsers(request).get(0);Map<String, Object> param = new HashMap<String, Object>();try{xm = java.net.URLDecoder.decode(xm, "UTF-8");param.put("xm", xm);param.put("minnl", minnl);param.put("maxnl", maxnl);param.put("xb", xb);param.put("zzmm", zzmm);param.put("xl", xl);param.put("zyjszw", zyjszw1);param.put("zyjszwjb", zyjszwjb1);param.put("xsch", xsch1);param.put("kynl", kynl1);param.put("xsry", xsry1);param.put("shzt", shzt);param.put("yxbz", yxbz);param.put("childorg", childorg);param.put("empIds", empIds);param.put("qParentId", qParentId1);param.put("xzzw", xzzw1) ;param.put("xzzwjb", xzzwjb1) ;param.put("zzry", zzry1) ;param.put("hbgb", hbgb) ;param.put("type", type);//1、将column字符串拆分到数组中,获取每个选中记录的信息(名称字段信息格式:NAME;姓名)String[] cloumnStr = columns.split(",");//为后面 查询字段做准备String seachCloumn = " select " ;//2、定义字符串保存要导出字段的中文名称,如:姓名 性别List<String> seachCloumnNameEn = new ArrayList<String>();//3、定义字符串保存要导出字段 如:NAME  SEX List<String> seachCloumnNameCh = new ArrayList<String>();//4、遍历cloumnStr数组 ,分别获取字段英文名和字段中文名for(int t = 0 ; t < cloumnStr.length ; t++ ){//将每个字段信息如:NAME;姓名格式通过分隔符‘;’拆分到数组String temp[] = cloumnStr[t].split(";");//temp[0]的值为 NAME  seachCloumn= "select NAME,"seachCloumn += temp[0] + " ," ;//将字段英文名添加到数组seachCloumnNameEnseachCloumnNameEn.add(temp[0]);//将字段中文名经过转码之后添加到seachCloumnNameCh数组seachCloumnNameCh.add(java.net.URLDecoder.decode(temp[1], "UTF-8"));}//5、获取要导出的数据信息 List<Map<String, Object>> datalist =tPersonService.exportWithSelectColumn(logininfo, param,seachCloumn.substring(0,seachCloumn.length()-1));//6、定义当初excle的文件名称String fileName = "" ;if(StringUtils.equals("leader", type)){fileName = new String("领导干部信息列表.xlsx".getBytes("UTF-8"),"ISO8859-1"); //}else{fileName = new String("高级专业技术人才信息列表.xlsx".getBytes("UTF-8"),"ISO8859-1"); //}//7、获取输出流OutputStream os = response.getOutputStream(); //8、清空输出流response.reset(); //9、设定输出文件头response.setHeader("Content-Disposition", "attachment; filename=" + fileName);//10、 定义输出类型   application/msexcelresponse.setContentType("application/msexcel");try {//创建EXCLE工作簿对象Workbook work = new XSSFWorkbook();// 得到excel的第0个sheet    创建Excel工作表对象Sheet sheet = work.createSheet();sheet.setColumnWidth(0, 3766);sheet.setColumnWidth(1, 3766);//创建单元格格式CellStyle columnTwo = work.createCellStyle();columnTwo.setAlignment(XSSFCellStyle.ALIGN_LEFT);columnTwo.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);columnTwo.setWrapText(false);//创建Excel工作表的2行 (从0开始)Row row2 = sheet.createRow(2);for(int i = 0 ;i<seachCloumnNameCh.size();i++){Cell cell = null;//创建第2行的第2个单元格cell = row2.createCell(i+2);//给第2行的第2个单元格添加单元格样式cell.setCellStyle(columnTwo);//给第2行的第2个单元格赋值为字段的  中文名称cell.setCellValue(seachCloumnNameCh.get(i).toString());}// 填充数据从第三行开始for(int i = 0 ;i < datalist.size();i++){//获取一条数据Map  data = datalist.get(i);//创建第三行Row row = sheet.createRow(i + 3);for(int j = 0 ;j<seachCloumnNameEn.size();j++){Cell cell = null;//创建第三行的第二个单元格cell = row.createCell(j+2);//添加单元格样式cell.setCellStyle(columnTwo);String val = "" ;if(data.get(seachCloumnNameEn.get(j).toString()) != null){//获取字段对应的值val = data.get(seachCloumnNameEn.get(j).toString()).toString();}//赋值到单元格cell.setCellValue(val);}}work.write(os);os.close();} catch (Exception fe) {throw fe;}}catch (Exception e) {e.printStackTrace();printErrorForJs(response, e);}}

3.1.5、后台service层代码:

// 根据客户要导出的信息进行导出,(高级人才、领导干部通用)public List<Map<String, Object>> exportWithSelectColumn(AuthInfo logininfo, Map<String, Object> param,String seachCloumn) {List<Object> listAgs = new ArrayList<Object>();String sql = seachCloumn  + " from  t_baseInfo ";SQLQuery query = commonDao.createSQLQuery(sql, null, null, null);//SQLQuery query =commonDao.getSessionFactory().getCurrentSession().createSQLQuery(sql);query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);List<Map<String, Object>> result = query.list();return result;}

四、总结:

4、1、在实现这个功能的大概思路:

    (1)首先我们可以选取checkbox复选框作为前端页面的展示, 因为checkbox 支持多选,通过js代码我们可以很方便的获取

   客户选中的记录的value值,关于这个value值我们也是有一些特殊的地方可以借鉴,我们将要查询的字段名称(包括中文和英文)通过 ";"连接例如上面代码贴出的:

<td style="width: 130px;"> <input type="checkbox" name="exportColumn" value="NAME;姓名"/>姓名</td>

   这样做的目的也是为了到时候这些value值传递到后台,我们直接获取到查询的字段提供方便。

(2)将选中的字段信息的value值拼接成字符串,加入到参数中,传递到后台处理

(3)后台通过前台传递的参数格式来进行拆分获取需要查询的字段的中文英文名称

(4)service层用select 语句进行查询,获取数据库数据并返回给Controller层

(5)调用POI类的接口导出excle  



POI实现动态导出功能相关推荐

  1. (转)POI实现动态导出功能

    POI实现动态导出功能 2017年09月13日 13:58:32 阅读数:659 前言: 今天工作很闲,无意中发现同事做的一个动态导出功能,之前自己也利用POI做过excle的导出功能,但都是通过提前 ...

  2. 基于poi的动态导出excel表头以及统计行列数据(全网最全)

    引入依赖 <!-- excel导入导出 --><dependency><groupId>com.github.stupdit1t</groupId>&l ...

  3. spring boot + vue 使用poi实现Excel导出功能(包括Excel样式调整,以及前后端代码)

    可以直接复制拿来用哟.(#^.^#) 目录 一.pom.xml依赖 二.代码大致流程是这样的 三.后端工具类 四.基于vue,使用axios调用后端接口,实现下载文件的方法 五.看效果 一.pom.x ...

  4. 动态列表的excel导入、导出功能(二)

    项目场景: 最近做到一个业务需求是,要做一个物品管理页面的excel模板导出,导出的excel信息填充后做导入使用 问题描述: 接着上次做出的'半动态导出'功能后,开始编写相应的导入功能,一开始思路没 ...

  5. POI动态导出多层表头的EXCEL文件

    POI动态导出多层表头的EXCEL文件 表格表头导出 单行表头 多行表头 以前接触过一个很古老的导出Excel,实现的逻辑是先声明一个导出的Excel模板,模板里报表的表头名称和顺序是固定的,这样执行 ...

  6. [实用][更新中]Java Apache POI 打印Word文档工具(含文本替换,动态表格功能)

    [实用][更新中]Java Apache POI 打印Word文档工具(含文本替换,动态表格功能) 基于Apache POI对Word进行操作 一.基于Apache POI封装的word文档工具V1. ...

  7. 使用POI实现导出功能

    使用POI实现导出下载功能 前言 步骤 1.引入相关依赖 2.创建相关工具类 3.controller层的编写 4.创建html页面 前言 在SSM框架的基础下,在这里就不搭建SSM框架,可以参考我自 ...

  8. springboot整合poi读取数据库数据和图片动态导出excel

    springboot整合poi读取数据库数据和图片动态导出excel 第一次操作 话不多说就直接上代码 实现代码 需要的依赖 <dependency><groupId>org. ...

  9. 硬核!Java 实现数据动态插入,生成 PDF、EXECL,完美导出功能!

    >>号外:关注"Java精选"公众号,回复"面试资料",免费领取资料!"Java精选面试题"小程序,3000+ 道面试题在线刷, ...

最新文章

  1. 安卓手机文件管理器:360°LES文件浏览器
  2. 计算机图形学基础考试题,计算机图形学基础复习题
  3. 开发log4j配置_从 log4j 迁移到 logback
  4. 天涯共此式 有AI月更圆
  5. 三星s9android recovery,三星S9+刷第三方中文twrp recovery工具和教程
  6. am5718_基于TI AM5718 车牌识别系统解决方案 - 飞凌嵌入式行业资讯 - 保定飞凌嵌入式技术有限公司...
  7. 关于负载均衡的一切:总结与思考
  8. cmd黑窗口命令行模式进入指定盘符下的任意文件夹
  9. JS学习--Number对象
  10. KeyMob聚合致力于为广大开发者及广告聚合服务
  11. 实用​Android开源项目及库​
  12. 松花江等三流域禁渔效果不理想 跨界水域成管理盲区
  13. 人工智能基础知识入门
  14. 计算机操作系统的自举过程
  15. 老子文化主题公园将在洛阳落户
  16. 【目标检测】你想知道的手势识别都在这里 【YOLO】网络
  17. 汇编语言实验二 汇编语言程序设计(顺序、多分支、循环)
  18. 九度oj 题目1080:进制转换
  19. Python 初学者趣味练习题汇编(共42题,中文版)
  20. checked和unchecked的区别

热门文章

  1. 求温度分布的matlab,铜芯电缆温度分布MATLAB计算模型
  2. 计算机学报是ei吗 好投吗,智能系统学报是EI吗
  3. 天河二号属于微型计算机吗,我国自行生产的天河二号计算机属于
  4. 车辆结构——轮胎模型学习
  5. ES中的Query与Filter的区别
  6. iPad点击Filza白屏闪退
  7. spring boot缓存初体验
  8. 鸿蒙 保存图片到相册
  9. 移动数据库发展现状报告
  10. 工业相机与镜头的选配