POI实现动态导出功能

前言:

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

一、实现效果:

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

二、实现效果图:

导出文件如下:

打开excle内如如下:

三、实现代码:

3.1 、 前端代码:

3.1.1、 导出按钮实现:

[javascript] view plaincopy

  1. /**
  2. *操作按钮
  3. */
  4. vartoolbar = [{
  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. functionselectExportCloumn(){
  17. $("#exportColumnDialog").dialog("open");
  18. }






3.1.2 对话框的实现代码:

[html] view plaincopy

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

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

[javascript] view plaincopy

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

3.1.4、后台Controller代码:

[java] view plaincopy

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

3.1.5、后台service层代码:

[java] view plaincopy

  1. // 根据客户要导出的信息进行导出,(高级人才、领导干部通用)
  2. publicList<Map<String, Object>> exportWithSelectColumn(AuthInfo logininfo, Map<String, Object> param,String seachCloumn) {
  3. List<Object> listAgs = newArrayList<Object>();
  4. String sql = seachCloumn  + " from  t_baseInfo ";
  5. SQLQuery query = commonDao.createSQLQuery(sql, null,null,null);
  6. //SQLQuery query =commonDao.getSessionFactory().getCurrentSession().createSQLQuery(sql);
  7. query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
  8. List<Map<String, Object>> result = query.list();
  9. returnresult;
  10. }



四、总结:

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

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

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

[html] view plaincopy

  1. <tdstyle="width: 130px;"><inputtype="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

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

  1. POI实现动态导出功能

    前言:  今天工作很闲,无意中发现同事做的一个动态导出功能,之前自己也利用POI做过excle的导出功能,但都是通过提前 定义导出文件,写死要导出的字段,在访问数据库获取导出信息,在写入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. php 动态分页,PHP动态分页函数,PHP开发分页必备啦
  2. 工程打包是什么意思_承包工程是什么意思
  3. vs服务器连接xp系统,xp系统远程连接服务器
  4. freebsd点到点的ipsec ***
  5. 数据结构与算法——冒泡排序(改进后)
  6. 伸缩菜单----html文件
  7. python非参数检验
  8. OPENCV函数介绍:normalize()
  9. 淘宝开店怎么寻找货源?淘宝怎么样申请开店吗?
  10. 推荐几个值得关注的技术公众号
  11. 机器学习中,从一张图片中提取出感兴趣的区域(以交通标志为例)
  12. HEVC intra MPM
  13. 梳理STM32F429之通信传输部分---NO.8 硬件SPI
  14. java 读取ppt_Java 读取PPT文本和图片
  15. OSGi架构学习与设计
  16. 桌面的此电脑图标变成了快捷方式如何解决?
  17. 用友T3软件超值的打印秘籍,你值得收藏!
  18. java viewer 控件_插件制作过程记录(使用TreeViewer贡献视图)
  19. 扬州全景拍摄,扬州全景图片欣赏
  20. ChinaSkills全国职业院校技能大赛Debian样题六||本专栏基于此试题,订阅前必读!!!

热门文章

  1. 大灯照出来的光有阴影_汽车近光灯前有黑色阴影正常吗
  2. 十七点安全知识详细了解进程和病毒
  3. Java 读取PDF中表格的工具
  4. Cocos2d-x 3.10 sdk 升级至 Cocos2d-x sdk 3.17.1 simulator 编译问题汇总
  5. Java政府门户网站官网网站(含源码+论文+答辩PPT等)
  6. 让Github飞起来
  7. 为共享此计算机的所有用户安装,HP共用打印机安装的方法
  8. forceUpdate是什么
  9. 腾讯云服务器遭入侵,安装挖矿木马病毒3
  10. jncie(jnciE认证考试)