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("导出信息失败!");
                    
                    }
                 }        
}

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

完美!

 

想的太多,做的太少,中间的落差就是烦恼,要么去做,要么别想 少尉【11】

 

 

posted on 2017-12-28 18:52  雨点的名字  阅读(13855)  评论(3编辑  收藏  举报