zoukankan      html  css  js  c++  java
  • springMVC(4)---生成excel文件并导出

    springMVC(4)---生成excel文件并导出

            在开发过程中,需要将数据库中的数据以excel表格的方式导出。

           首先说明。我这里用的是Apache的POI项目,它是目前比较成熟的HSSF接口,用来处理Excel对象。其实POI不仅仅只能处理excel,它还可以处理word、PowerPoint、Visio、甚至Outlook。

          一.首先介绍利用POI如何生成excel。              

         首先在生成Excel前,我们需要理解一下Excel文件的组织形式。在POI中,是这样理解的:一个Excel文件对应一个workbook,一个workerbook是有若干个sheet组成的。一个sheet有多个row,一个row一般存在多个cell。

         对于上面的四个名词我们可以在下图理解:

        对于生成Excel,POI提供了如下几个基本对象:

         HSSFWorkbook             excel 的文档对象

         HSSFSheet                excel 的表单

         HSSFRow                  excel 的行

         HSSFCell                 excel 的格子单元

         从上面的图片和Excel的组织结构,我们就可以明白创建Excel的步骤。

            1、生成文档对象HSSHWorkbook。

            2、通过HSSFWorkbook生成表单HSSFSheet。

            3、通过HSSFSheet生成行HSSFRow

            4、通过HSSFRow生成单元格HSSFCell。

       下面展示代码:

                 第一步、导入jar包                                                      

     <dependency>
           <groupId>org.apache.poi</groupId>
           <artifactId>poi-ooxml</artifactId>
              <version>3.9</version>
         </dependency> 

             第二步,创建Model对象                                                

    public class Person {
    
        private String id;
        private String name;
        private String password;
        private String age;
        
        
        public Person(String id, String name, String password, String age) {
            super();
            this.id = id;
            this.name = name;
            this.password = password;
            this.age = age;
        }
    //提供set和get方法
    }

            第三步.下载界面 exportexcel.jsp                                  

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <html>
    
    <!-- 正常数据导出肯定要传入参数,我这里没有用ajax传参,简单用链接传参 -->
    <script type="text/javascript">
    function download(){
         var url="download_excel?id=10&name=张三";
         window.open(url);
    }
    </script>
    <body>
    <form action="">
    <input type="button" value="报表导出" onclick="download()"/>
    </form>
    </body>
    </html>

              第四步、ExcleController.java                            

    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.ssm.service.impl.ExcleImpl;
    
    @Controller
    public class ExcleController {
        //这里直接new了
        ExcleImpl  excleImpl=new ExcleImpl();
        
    @RequestMapping(value="/jsp/download_excel")    
    
    //获取url链接上的参数
    public @ResponseBody String dowm(HttpServletResponse response,@RequestParam("id") String id,@RequestParam("name") String name){
         response.setContentType("application/binary;charset=UTF-8");
                  try{
                      ServletOutputStream out=response.getOutputStream();
                      try {
                          //设置文件头:最后一个参数是设置下载文件名(这里我们叫:张三.pdf)
                          response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(name+".xls", "UTF-8"));
                      } catch (UnsupportedEncodingException e1) {
                          e1.printStackTrace();
                      }
                   
                      String[] titles = { "用户id", "用户姓名", "用户密码", "用户年龄" }; 
                      excleImpl.export(titles, out);      
                      return "success";
                  } catch(Exception e){
                      e.printStackTrace();
                      return "导出信息失败";
                  }
              }
    }

            第五步、ExcleImpl 报表导出实现层                  

    import java.util.ArrayList;
    
    import javax.servlet.ServletOutputStream;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    
    import com.ssm.model.Person;
    
    public class ExcleImpl {
    
    public void export(String[] titles, ServletOutputStream out) throws Exception{
        try{
                         // 第一步,创建一个workbook,对应一个Excel文件
                         HSSFWorkbook workbook = new HSSFWorkbook();
                         
                         // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
                         HSSFSheet hssfSheet = workbook.createSheet("sheet1");
                         
                         // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
                         
                         HSSFRow row = hssfSheet.createRow(0);
                        // 第四步,创建单元格,并设置值表头 设置表头居中
                         HSSFCellStyle hssfCellStyle = workbook.createCellStyle();
                         
                         //居中样式
                         hssfCellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
             
                         HSSFCell hssfCell = null;
                         for (int i = 0; i < titles.length; i++) {
                             hssfCell = row.createCell(i);//列索引从0开始
                             hssfCell.setCellValue(titles[i]);//列名1
                             hssfCell.setCellStyle(hssfCellStyle);//列居中显示                
                         }
                         
                         // 第五步,写入实体数据 
                          Person  person1=new Person("1","张三","123","26");
                          Person  person2=new Person("2","李四","123","18");
                          Person  person3=new Person("3","王五","123","77");
                          Person  person4=new Person("4","徐小筱","123","1");
                          
                          //这里我把list当做数据库啦
                          ArrayList<Person>  list=new ArrayList<Person>();
                          list.add(person1);
                          list.add(person2);
                          list.add(person3);
                          list.add(person4);
                         
                             for (int i = 0; i < list.size(); i++) {
                                 row = hssfSheet.createRow(i+1);                
                                 Person person = list.get(i);
                                 
                                 // 第六步,创建单元格,并设置值
                                 String  id = null;
                                 if(person.getId() != null){
                                         id = person.getId();
                                 }
                                row.createCell(0).setCellValue(id);
                                 String name = "";
                                 if(person.getName() != null){
                                     name = person.getName();
                                 }
                                row.createCell(1).setCellValue(name);
                                 String password = "";
                                 if(person.getPassword() != null){
                                     password = person.getPassword();
                                 }
                                 row.createCell(2).setCellValue(password);
                                 String age=null;
                                 if(person.getAge() !=null){
                                     age = person.getAge();
                                 }
                                 row.createCell(3).setCellValue(age);
                             }
        
                         // 第七步,将文件输出到客户端浏览器
                         try {
                             workbook.write(out);
                             out.flush();
                            out.close();
             
                         } catch (Exception e) {
                             e.printStackTrace();
                         }
                     }catch(Exception e){
                         e.printStackTrace();
                        throw new Exception("导出信息失败!");
                        
                        }
                     }        
    }

        第六步:最终效果,当我点击报表导出按钮                      

    完美!

  • 相关阅读:
    easyui datagrid 让某行复选框置灰不能选
    easyui前台改变datagrid某单元格的值
    javascript Date format(js日期格式化)
    SVN中trunk,branches,tags用法详解
    ecshop后台新功能权限的添加
    jquery创建一个新的节点对象(自定义结构/内容)的好方法
    kafka系列九、kafka事务原理、事务API和使用场景
    kafka系列八、kafka消息重复和丢失的场景及解决方案分析
    kafka系列七、kafka核心配置
    kafka系列六、java管理kafka Topic
  • 原文地址:https://www.cnblogs.com/windy-xmwh/p/11239406.html
Copyright © 2011-2022 走看看