• SpringMVC生成导出Excel表格


    情景描述:

    在页面查询出员工信息,点击”导出Excel“按钮,将员工信息生成Excel表格,并将Excel表格下载到本地。

    /**
         * 将部门员工导出到Excel
         * @param ou  部门名称
         * @return
         */
        @RequestMapping("/exportExc.action")
        public void ExportExc(@RequestParam("ou")String ou,HttpServletRequest request,HttpServletResponse response){
            
            System.out.println("导出到Excel"+ou);
            
            //第一步:创建一个webbook,对应一个Excel文件
            HSSFWorkbook wb = new HSSFWorkbook();
            
            //第二步:在webbook中添加一个sheet,对应Excel中的一个sheet
            HSSFSheet sheet = wb.createSheet(ou+"员工信息表");
            //第三步,在sheet中添加一个表头即第0行
            HSSFRow row = sheet.createRow(0);
            
               
            
            //第四步:创建单元格 ,并设置表表头居中
            
            HSSFCellStyle style= wb.createCellStyle();
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);  //表头样式
            
            HSSFCell cell =row.createCell(0);
            cell.setCellValue("员工编号");
            cell.setCellStyle(style);
            sheet.setColumnWidth(0,4000);
            cell =row.createCell(1);
            cell.setCellValue("员工姓名");
            cell.setCellStyle(style);
            sheet.setColumnWidth(1,4000);
            cell =row.createCell(2);
            cell.setCellValue("部门");
            cell.setCellStyle(style);
            sheet.setColumnWidth(2,6000);
            cell =row.createCell(3);
            cell.setCellValue("岗位");
            cell.setCellStyle(style);
            cell =row.createCell(4);
            cell.setCellValue("岗位类型");
            cell.setCellStyle(style);
            cell =row.createCell(5);
            cell.setCellValue("是否在职");
            cell.setCellStyle(style);
            cell =row.createCell(6);
            cell.setCellValue("生日");
            cell.setCellStyle(style);
            cell =row.createCell(7);
            cell.setCellValue("性别");
            cell.setCellStyle(style);
            cell =row.createCell(8);
            cell.setCellValue("民族");
            cell.setCellStyle(style);
            cell =row.createCell(9);
            cell.setCellValue("");
            cell.setCellStyle(style);
            cell =row.createCell(10);
            cell.setCellValue("名字");
            cell.setCellStyle(style);
            cell =row.createCell(11);
            cell.setCellValue("密码");
            cell.setCellStyle(style);        
            
            //第五步:写入实体数据
            
            Department oneDepart = dService.getNextDepartment(ou);
            System.out.println("查出的部门:"+oneDepart);
            List<Employee> employees = oneDepart.getEmployees();
            System.out.println("待存入的员工信息:"+employees);
            //将员工对象存进单元行
            for (int i = 0; i < employees.size(); i++) {
                row= sheet.createRow(i+1);   //创建新的单元行
                Employee employee = employees.get(i);
                row.createCell(0).setCellValue(employee.getUid()); //创建一个单元格,存入uid
                row.createCell(1).setCellValue(employee.getCn());
                row.createCell(2).setCellValue(employee.getDepartment().getOu());
                row.createCell(3).setCellValue(employee.getJobtitlename());
                row.createCell(4).setCellValue(employee.getJobtypename());
                row.createCell(5).setCellValue(employee.getHrstatus());
                row.createCell(6).setCellValue(employee.getBirthday());
                row.createCell(7).setCellValue(employee.getSex());
                row.createCell(8).setCellValue(employee.getFolk());
                row.createCell(9).setCellValue(employee.getSn());
                row.createCell(10).setCellValue(employee.getGivenName());
                row.createCell(11).setCellValue(employee.getUserPassword());
                
            }
            //第六步,将文件存入指定路径
             try{
    
                  // 设置response参数,可以打开下载页面
                  String fileName=ou+"员工表.xls";
                /*  fileName = URLEncoder.encode(fileName, "utf-8");*/
                  request.setCharacterEncoding("utf-8");
                  response.setCharacterEncoding("utf-8");
                  response.setContentType("application/x-download");
                  response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("utf-8"), "ISO8859-1"));
                  
                  OutputStream out = response.getOutputStream();
                  wb.write(out);
                  out.close();
                  
              }catch(Exception e){
                  e.printStackTrace();
              }
        }

    之前用的ajax请求后台地址,一直没法下载,前台页面弹不出下载框
    问题原因:
    那是因为response原因,一般请求浏览器是会处理服务器输出的response,例如生成png、文件下载等,然而ajax请求只是个“字符型”的请求,json,text,html,xml,即请求的内容是以文本类型存放的。文件的下载是以二进制形式进行的,虽然可以读取到返回的response,但只是读取而已,是无法执行的,说白点就是js无法调用到浏览器的下载处理机制和程序。
    解决方案:
        隐藏表单,用提交表单的形式
        用window.open() 或 window.location.href()
        创建iframe,iframe的src可以是文件地址url来请求后台并下载文件

    参考文献:http://blog.csdn.net/maomao_0324/article/details/74931050

  • 相关阅读:
    CURL POST提交json类型字符串数据和伪造IP和来源
    windows下nginx的配置
    常用JS兼容问题工具
    无限级分类--Array写法
    JS获取对象指定属性在样式中的信息
    解决IE和Firefox获取来源网址Referer的JS方法
    异步轮询函数
    响应式布局--特殊设备检测
    jQuery Validate校验
    [LeetCode#124]Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/Actexpler-S/p/7941800.html
Copyright © 2020-2023  润新知