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

POI实现动态导出功能

前言: 

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

一、实现效果:

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


二、实现效果图:


导出文件如下:


打开excle内如如下:


三、实现代码:

    3.1 、 前端代码:

    3.1.1、 导出按钮实现:

[javascript] view plain copy
  1.              /** 
  2.         *操作按钮 
  3.         */  
  4.         var toolbar = [{  
  5.     id:'hpms_ht_export',  
  6.     text:'导出',  
  7.     iconCls:'icon-tip',  
  8.     handler:function(){  
  9.             selectExportCloumn();  
  10.     },  
  11.     disabled:false}  
  12. ];  
  13.   
  14.   
  15. /** 
  16. 选择要导出的列 
  17.  **/  
  18. function selectExportCloumn(){  
  19.     $("#exportColumnDialog").dialog("open");  
  20.       
  21. }  



3.1.2 对话框的实现代码:

[html] view plain copy
  1. <div id="exportColumnDialog" class="easyui-dialog" title="请选择要导出的信息" style="width:900px;height:400px;"  
  2.              data-options="iconCls:'icon-save',resizable:true,modal:true">  
  3.                   
  4.     <table id="columnGridObject" >  
  5.         <tr height="40px;">  
  6.           <td style="width: 130px;"> <input type="checkbox" name="exportColumn" value="ID_NO;证件号码"/>证件号码</td>  
  7.           <td style="width: 130px;"> <input type="checkbox" name="exportColumn" value="NAME;姓名"/>姓名</td>  
  8.           <td style="width: 130px;"> <input type="checkbox" name="exportColumn" value="GENDER_CODE;性别"/>性别</td>  
  9.           <td style="width: 130px;"> <input type="checkbox" name="exportColumn" value="BIRTH_DATE;出生日期"/>出生日期</td>   
  10.           <td style="width: 130px;"> <input type="checkbox" name="exportColumn" value="MARITAL_ST_CODE;婚姻状况"/>婚姻状况</td>  
  11.           <td style="width: 130px;"> <input type="checkbox" name="exportColumn" value="NATION_CODE;民族"/>民族</td>   
  12.           <td style="width: 130px;"> <input type="checkbox" name="exportColumn" value="JOB_NUMBER;工号"/>工号</td>    
  13.         </tr>  
  14.         <tr height="40px;">  
  15.             <td > <input type="checkbox" name="exportColumn" value="ORG_CODE;工作机构代码"/>工作机构代码</td>  
  16.             <td > <input type="checkbox" name="exportColumn" value="ORG_NAME;工作机构名称"/>工作机构名称</td>  
  17.             <td > <input type="checkbox" name="exportColumn" value="DEPT_CODE;部门编码"/>部门编码</td>  
  18.             <td > <input type="checkbox" name="exportColumn" value="DEPT_NAME;部门名称"/>部门名称</td>   
  19.             <td > <input type="checkbox" name="exportColumn" value="WORK_DATE;参加工作时间"/>参加工作时间</td>  
  20.             <td > <input type="checkbox" name="exportColumn" value="TEL_PHONE;电话号码"/>电话号码</td>   
  21.             <td > <input type="checkbox" name="exportColumn" value="MOBILE_PHONE;手机号码"/>手机号码</td>    
  22.         </tr>  
  23.         <tr height="40px;">  
  24.             <td > <input type="checkbox" name="exportColumn" value="JKZK;健康状况"/>健康状况</td>  
  25.             <td > <input type="checkbox" name="exportColumn" value="ZYZSLB;获得证书类别"/>获得证书类别</td>  
  26.             <td > <input type="checkbox" name="exportColumn" value="ZYZSBM;执业证书编码"/>执业证书编码</td>  
  27.             <td > <input type="checkbox" name="exportColumn" value="ZYLBDM;执业类别"/>执业类别</td>   
  28.             <td > <input type="checkbox" name="exportColumn" value="ZYFWDM;执业范围"/>执业范围</td>  
  29.             <td > <input type="checkbox" name="exportColumn" value="SFDDZY;多地点执业"/>多地点执业</td>   
  30.             <td > <input type="checkbox" name="exportColumn" value="CSZYLBDM;从事专业类别"/>从事专业类别</td>    
  31.         </tr>  
  32.         <tr height="40px;">  
  33.             <td > <input type="checkbox" name="exportColumn" value="XZGLZWDM;行政职务"/>行政职务</td>  
  34.             <td > <input type="checkbox" name="exportColumn" value="XZZWJB;行政职务级别"/>行政职务级别</td>  
  35.             <td > <input type="checkbox" name="exportColumn" value="HBGB;后备干部"/>后备干部</td>  
  36.             <td > <input type="checkbox" name="exportColumn" value="RZSJ;任职时间"/>任职时间</td>   
  37.             <td > <input type="checkbox" name="exportColumn" value="ZYJSZG;专业技术职务"/>专业技术职务</td>  
  38.             <td > <input type="checkbox" name="exportColumn" value="QDZGSJ;取得资格时间"/>取得资格时间</td>   
  39.             <td > <input type="checkbox" name="exportColumn" value="PYSJ;聘用时间"/>聘用时间</td>    
  40.         </tr>  
  41.         <tr height="40px;">  
  42.             <td > <input type="checkbox" name="exportColumn" value="ZYJSZW;专业技术职务级别"/>专业技术职务级别</td>  
  43.             <td > <input type="checkbox" name="exportColumn" value="NNRYLDQK;年内人员流动情况"/>年内人员流动情况</td>  
  44.             <td > <input type="checkbox" name="exportColumn" value="JRDWFS;进入本单位方式"/>进入本单位方式</td>  
  45.             <td > <input type="checkbox" name="exportColumn" value="DRDCSJ;调入/调出时间"/>调入/调出时间</td>   
  46.             <td > <input type="checkbox" name="exportColumn" value="BZQK;编制情况"/>编制情况</td>  
  47.             <td colspan="2">    
  48.               <input type="checkbox" name="exportColumn" value="PXHGZSQK;全科医生培训合格证书情况"/>  
  49.               全科医生培训合格证书情况  
  50.             </td>       
  51.         </tr>  
  52.         <tr height="40px;">  
  53.             <td colspan="3">   
  54.                 <input type="checkbox" name="exportColumn" value="ZYZCQK;已取得全科医生培训合格证书的医生执业注册情况"/>  
  55.                 已取得全科医生培训合格证书的医生执业注册情况  
  56.             </td>    
  57.             <td > <input type="checkbox" name="exportColumn" value="GWLB;岗位类别"/>岗位类别</td>  
  58.             <td > <input type="checkbox" name="exportColumn" value="GWDJ;岗位等级"/>岗位等级</td>   
  59.             <td > <input type="checkbox" name="exportColumn" value="EDUCATION_CODE;最高学历"/>最高学历</td>  
  60.             <td > <input type="checkbox" name="exportColumn" value="DEGREE_CODE;学位"/>学位</td>  
  61.         </tr>  
  62.         <tr height="40px;">  
  63.             <td > <input type="checkbox" name="exportColumn" value="ZYMC;所学专业"/>所学专业</td>  
  64.             <td > <input type="checkbox" name="exportColumn" value="ZKTC;专科特长"/>专科特长</td>  
  65.             <td colspan="2">   
  66.                 <input type="checkbox" name="exportColumn" value="XSTTRZ;社会/学术团体任职"/>  
  67.                 社会/学术团体任职  
  68.             </td>  
  69.             <td > <input type="checkbox" name="exportColumn" value="SFPZ;是否乡招村用"/>是否乡招村用</td>  
  70.         </tr>               
  71.         <tr>  
  72.             <td></td>  
  73.             <td></td>   
  74.             <td>  
  75.                 <a href="javascript:exportReport();" class="easyui-linkbutton search"  style="position: relative;" >确定</a>   
  76.             </td>  
  77.             <td>  
  78.                 <a href="javascript:cancel();" class="easyui-linkbutton search"  style="position: relative;" >取消</a>   
  79.             </td>  
  80.         </tr>  
  81.     </table>  
  82.                   
  83.  </div>  
  84.         <!-- 下载 -->  
  85.         <iframe id="downloadframe" style="display:none"></iframe>  
3.1.3、确定按钮的实现js代码:

[javascript] view plain copy
  1.                /** 
  2.          *导出excle                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
  3.          */  
  4.         function exportReport(){  
  5.                
  6.             //查询参数  
  7.            var params = "";  
  8.         var param = $('#queryForm').serializeArray();   
  9.         $.each(param, function() {  
  10.             if(param.name!='zyjszw' || param.name!='zyjszwjb' ||param.name!='xsch'   
  11.                     ||param.name!='kynl' ||param.name!='xsry'){  
  12.                 params += "&" + this.name + "=" + this.value;  
  13.             }  
  14.               
  15.         });  
  16.         params += "&" + "zyjszw1" + "=" + $("#zyjszw").val();  
  17.         params += "&" + "zyjszwjb1" + "=" + $("#zyjszwjb").val();  
  18.         params += "&" + "xsch1" + "=" + $("#xsch").val();  
  19.         params += "&" + "kynl1" + "=" + $("#kynl").val();  
  20.         params += "&" + "xsry1" + "=" + $("#xsry").val();  
  21.         params += "&" + "qParentId1" + "=" + $("#qParentId").val();//选中机构orgId  
  22.           
  23.           
  24.         //获取当前查询总的记录条数  
  25.         var data=$('#dataGridObject').datagrid('getData');  
  26.         var total = data.total;  
  27.               
  28.       
  29.             var rows = $('#dataGridObject').datagrid('getSelections');  
  30.             //保存选中的empids  
  31.             var empIds = "";  
  32.            //导出记录信息超过500条  
  33.             if(rows.length > 500){  
  34.                 $.messager.alert('提示',"导出信息的总条数超过500,请重新选择导出信息!",'info');  
  35.                 return ;  
  36.             }else if( 0 < rows.length < 500  && 0 < rows.length < total){  
  37.                 //遍历获取要导出人员的EMP_ID  
  38.                 for(var i = 0 ;i < rows.length ; i++ ){  
  39.                  empIds = empIds + rows[i].EMP_ID + "," ;  
  40.                }  
  41.             }else if(total == 0){  
  42.                 $.messager.alert('提示',"导出信息的总条数为0条,不能导出!",'info');  
  43.                 return ;  
  44.             }  
  45.           
  46.             params += "&" + "empIds" + "=" + empIds;//选中的员工ids 如果没选就是全部导出empIds为空  
  47.       ///////////////////////////获取前端复选框选中的字段信息//////////////////////////////////////////  
  48.             // 1、选择要导出的列  
  49.             var checked = $("input[name='exportColumn']:checked");  
  50.               
  51.             if(checked.length == 0 ){  
  52.                 $.messager.alert("提示","请选择要导出的信息","info");  
  53.                 return ;  
  54.             }else{  
  55.                  var columns = "" ;  
  56.                  //2、遍历checked 获取选中每个记录的value值  
  57.                  $.each(checked ,function(i,n){  
  58.                      //每个字段的value值用逗号连接保存在columns中  
  59.                     columns = columns + $(this).val() + ",";  
  60.                  });  
  61.                  //3、在参数后面添加上columns信息  
  62.                 params += "&columns=" + columns ;  
  63.             }  
  64.               
  65.             var downloadframe = document.getElementById('downloadframe');  
  66.             //4、将参数传递到后台处理  
  67.             var url="${base}/ht/exportWithSelectColumn.action?type=ht&xzzw1=&xzzwjb1=&zzry1=&hbgb="+params;  
  68. //////////////////////////////////////////////////////////////////////////////////////////////////        
  69.             url=encodeURI(encodeURI(url));  
  70.             downloadframe.src = url;  
  71.             downloadframe.style.display = "none";  
  72.               
  73.         }   

3.1.4、后台Controller代码:

[java] view plain copy
  1. // 根据客户要导出的信息进行导出,(高级人才、领导干部通用)  
  2.    @SuppressWarnings("unchecked")  
  3. @RequestMapping(value = "/exportWithSelectColumn")  
  4. public void exportWithSelectColumn(HttpServletRequest request,HttpServletResponse response,   
  5.         String readFileName,String titlename,String xm,String  minnl ,  
  6.         String  maxnl ,String  xb ,String  zzmm ,String xl ,String zyjszw1 ,String  xsch1 ,  
  7.         String zyjszwjb1 ,String  xsry1 ,String  kynl1  ,String yxbz,String shzt ,  
  8.         String  childorg,String qParentId1,String empIds   
  9.         ,String xzzw1,String xzzwjb1,String zzry1,String hbgb,String type,String columns ) throws IOException {  
  10.       
  11.       
  12.    AuthInfo logininfo = SessionUtil.getLoginUsers(request).get(0);  
  13. Map<String, Object> param = new HashMap<String, Object>();  
  14. try{  
  15.     xm = java.net.URLDecoder.decode(xm, "UTF-8");  
  16.     param.put("xm", xm);  
  17.     param.put("minnl", minnl);  
  18.     param.put("maxnl", maxnl);  
  19.     param.put("xb", xb);  
  20.     param.put("zzmm", zzmm);  
  21.     param.put("xl", xl);  
  22.       
  23.     param.put("zyjszw", zyjszw1);  
  24.     param.put("zyjszwjb", zyjszwjb1);  
  25.       
  26.     param.put("xsch", xsch1);  
  27.     param.put("kynl", kynl1);  
  28.     param.put("xsry", xsry1);  
  29.       
  30.       
  31.     param.put("shzt", shzt);  
  32.     param.put("yxbz", yxbz);  
  33.     param.put("childorg", childorg);  
  34.     param.put("empIds", empIds);  
  35.     param.put("qParentId", qParentId1);  
  36.       
  37.     param.put("xzzw", xzzw1) ;  
  38.     param.put("xzzwjb", xzzwjb1) ;  
  39.     param.put("zzry", zzry1) ;  
  40.     param.put("hbgb", hbgb) ;  
  41.     param.put("type", type);  
  42.       
  43.     //1、将column字符串拆分到数组中,获取每个选中记录的信息(名称字段信息格式:NAME;姓名)  
  44.     String[] cloumnStr = columns.split(",");  
  45.     //为后面 查询字段做准备  
  46.     String seachCloumn = " select " ;  
  47.     //2、定义字符串保存要导出字段的中文名称,如:姓名 性别  
  48.     List<String> seachCloumnNameEn = new ArrayList<String>();  
  49.     //3、定义字符串保存要导出字段 如:NAME  SEX   
  50.     List<String> seachCloumnNameCh = new ArrayList<String>();  
  51.     //4、遍历cloumnStr数组 ,分别获取字段英文名和字段中文名  
  52.     for(int t = 0 ; t < cloumnStr.length ; t++ ){  
  53.         //将每个字段信息如:NAME;姓名格式通过分隔符‘;’拆分到数组  
  54.         String temp[] = cloumnStr[t].split(";");  
  55.         //temp[0]的值为 NAME  seachCloumn= "select NAME,"  
  56.         seachCloumn += temp[0] + " ," ;  
  57.         //将字段英文名添加到数组seachCloumnNameEn  
  58.         seachCloumnNameEn.add(temp[0]);  
  59.         //将字段中文名经过转码之后添加到seachCloumnNameCh数组  
  60.         seachCloumnNameCh.add(java.net.URLDecoder.decode(temp[1], "UTF-8"));  
  61.     }  
  62.     //5、获取要导出的数据信息   
  63.     List<Map<String, Object>> datalist =  
  64.             tPersonService.exportWithSelectColumn(logininfo, param,  
  65.                     seachCloumn.substring(0,seachCloumn.length()-1));  
  66.   
  67.       
  68.     //6、定义当初excle的文件名称  
  69.     String fileName = "" ;  
  70.     if(StringUtils.equals("leader", type)){  
  71.         fileName = new String("领导干部信息列表.xlsx".getBytes("UTF-8"),"ISO8859-1"); //  
  72.     }else{  
  73.         fileName = new String("高级专业技术人才信息列表.xlsx".getBytes("UTF-8"),"ISO8859-1"); //  
  74.     }  
  75.     //7、获取输出流  
  76.     OutputStream os = response.getOutputStream();   
  77.     //8、清空输出流  
  78.     response.reset();   
  79.     //9、设定输出文件头  
  80.     response.setHeader("Content-Disposition""attachment; filename=" + fileName);  
  81.     //10、 定义输出类型   application/msexcel  
  82.     response.setContentType("application/msexcel");  
  83.       
  84.     try {  
  85.       
  86.         //创建EXCLE工作簿对象  
  87.         Workbook work = new XSSFWorkbook();  
  88.         // 得到excel的第0个sheet    创建Excel工作表对象  
  89.         Sheet sheet = work.createSheet();  
  90.         sheet.setColumnWidth(03766);  
  91.         sheet.setColumnWidth(13766);  
  92.         //创建单元格格式  
  93.         CellStyle columnTwo = work.createCellStyle();  
  94.         columnTwo.setAlignment(XSSFCellStyle.ALIGN_LEFT);  
  95.         columnTwo.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);  
  96.         columnTwo.setWrapText(false);  
  97.           
  98.         //创建Excel工作表的2行 (从0开始)  
  99.         Row row2 = sheet.createRow(2);  
  100.         for(int i = 0 ;i<seachCloumnNameCh.size();i++){  
  101.             Cell cell = null;  
  102.             //创建第2行的第2个单元格  
  103.             cell = row2.createCell(i+2);  
  104.             //给第2行的第2个单元格添加单元格样式  
  105.             cell.setCellStyle(columnTwo);  
  106.             //给第2行的第2个单元格赋值为字段的  中文名称  
  107.             cell.setCellValue(seachCloumnNameCh.get(i).toString());  
  108.         }  
  109.         // 填充数据从第三行开始  
  110.         for(int i = 0 ;i < datalist.size();i++){  
  111.             //获取一条数据  
  112.             Map  data = datalist.get(i);  
  113.             //创建第三行  
  114.             Row row = sheet.createRow(i + 3);  
  115.             for(int j = 0 ;j<seachCloumnNameEn.size();j++){  
  116.                 Cell cell = null;  
  117.                 //创建第三行的第二个单元格  
  118.                 cell = row.createCell(j+2);  
  119.                 //添加单元格样式  
  120.                 cell.setCellStyle(columnTwo);  
  121.                 String val = "" ;  
  122.                 if(data.get(seachCloumnNameEn.get(j).toString()) != null){  
  123.                     //获取字段对应的值  
  124.                     val = data.get(seachCloumnNameEn.get(j).toString()).toString();  
  125.                 }  
  126.                 //赋值到单元格  
  127.                 cell.setCellValue(val);  
  128.             }  
  129.         }  
  130.           
  131.         work.write(os);  
  132.         os.close();  
  133.     } catch (Exception fe) {  
  134.         throw fe;  
  135.     }  
  136.       
  137. }catch (Exception e) {  
  138.     e.printStackTrace();  
  139.     printErrorForJs(response, e);  
  140. }  
3.1.5、后台service层代码:

[java] view plain copy
  1. // 根据客户要导出的信息进行导出,(高级人才、领导干部通用)  
  2.     public List<Map<String, Object>> exportWithSelectColumn(AuthInfo logininfo, Map<String, Object> param,String seachCloumn) {  
  3.         List<Object> listAgs = new ArrayList<Object>();  
  4.         String sql = seachCloumn  + " from  t_baseInfo ";  
  5.                   
  6.                   
  7.         SQLQuery query = commonDao.createSQLQuery(sql, nullnullnull);  
  8.         //SQLQuery query =commonDao.getSessionFactory().getCurrentSession().createSQLQuery(sql);  
  9.         query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);  
  10.         List<Map<String, Object>> result = query.list();  
  11.   
  12.         return result;  
  13.     }  

四、总结:

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

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

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

[html] view plain copy
  1. <td style="width: 130px;"> <input type="checkbox" name="exportColumn" value="NAME;姓名"/>姓名</td>  

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

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

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

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

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

原文地址:https://blog.csdn.net/u012027337/article/details/77962234

阅读更多
上一篇mysql sql日期函数
下一篇mybatis>mapper中直接返回boolean型数据以及相关注意事项
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭