Excel文件导出

1、首先导入依赖jar包

首先需要jar包依赖。POI提供API给Java程序对Microsoft Office格式档案读和写的功能

        <!--poi依赖-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.10.1</version>
        </dependency>

 2、创建工具类

导入一个接口Constants
package com.zero.util;

public interface Constants {

    public String DATE = "yyyy-MM-dd";

    public String DATE_TIME = "yyyy-MM-dd hh:mm:ss";

}

只是定义了两个日期格式。

创建工具类

UserExcelView
这个工具类需要继承特定的抽象类AbstractExcelView


package com.zero.view;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zero.pojo.User;
import com.zero.util.Constants;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.joda.time.DateTime;
import org.springframework.web.servlet.view.document.AbstractExcelView;


public class UserExcelView extends AbstractExcelView {

    @Override
    protected void buildExcelDocument(Map<String, Object> model, HSSFWorkbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 从model对象中获取userList
        @SuppressWarnings("unchecked")
        List<User> userList = (List<User>) model.get("userList");
        // 创建Excel的sheet
        HSSFSheet sheet = workbook.createSheet("会员列表");

        // 创建标题行
        HSSFRow header = sheet.createRow(0);
        header.createCell(0).setCellValue("ID");
        header.createCell(1).setCellValue("用户名");
        header.createCell(2).setCellValue("姓名");
        header.createCell(3).setCellValue("年龄");
        header.createCell(4).setCellValue("性别");
        header.createCell(5).setCellValue("出生日期");
        header.createCell(6).setCellValue("创建时间");
        header.createCell(7).setCellValue("更新时间");
        
        // 填充数据
        int rowNum = 1;
        for (User user : userList) {
            HSSFRow row = sheet.createRow(rowNum);
            row.createCell(0).setCellValue(user.getId());
            row.createCell(1).setCellValue(user.getUserName());
            row.createCell(2).setCellValue(user.getName());
            row.createCell(3).setCellValue(user.getAge());
            String sexStr;
            if (user.getSex() == 1) {
                sexStr = "男";
            } else if (user.getSex() == 2) {
                sexStr = "女";
            } else {
                sexStr = "未知";
            }
            row.createCell(4).setCellValue(sexStr);
            row.createCell(5).setCellValue(new DateTime(user.getBirthday()).toString(Constants.DATE));
            row.createCell(6).setCellValue(new DateTime(user.getCreated()).toString(Constants.DATE_TIME));
            row.createCell(7).setCellValue(new DateTime(user.getUpdated()).toString(Constants.DATE_TIME));

            rowNum++;
        }
        // 设置相应头信息,以附件形式下载并且指定文件名
        response.setHeader("Content-Disposition", "attachment;filename=" + new String("会员列表.xls".getBytes(),"ISO-8859-1"));
    }

}
View Code
AbstractExcelView是springmvc提供的,
在springmvc中

有一个view,它代表视图,json也是属于视图的一种。

  继承是为了实现一个方法,buildExcelDocument。这个方法是用来构建Excel的。具体怎么构建不管,只是提供。

  

exportUser方法将数据装到mv中,然后传到export-user。但是需要对export-user进行配置,因为他不是一个jsp页面,需要在配置文件中进行配置。

    <!--配置自定义的视图-->
    <bean  class="com.zero.view.UserExcelView" name="export-user"></bean>

这个时候是找不到export-user视图的

原因:当前的视图解析器是内部资源解析器,会按照下面的方式去查找视图名。

 

    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"></property>
        <property name="suffix" value=".jsp"></property>
        <property name="order" value="2"></property>
    </bean>

不满足现在的需求,需要定义其他的视图解析器。目的是可以寻找到自定义的视图。

<!--定义其他的视图解析器:可以寻找到自定义的视图,按照bean的name的属性值,当初一个视图名称去查询视图-->
    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <!--order表示视图解析器的顺序,值越小优先级越高,默认值是int的最大值,最低-->
        <!--顺序为先在这个视图解析器找,找不到再去上面找,上面的默认值是int的最大值-->
        <property name="order" value="1"></property>
    </bean>

视图解析器可以定义多个。但是视图解析器并不会知道从哪个视图解析器去找,如果不配置order仍然会报错。order是用来给视图解析器排序的。

视图解析器会优先使用优先级高的解析器,如果找不到再依据优先级去其他的视图解析器查找。

 


posted @ 2018-03-16 10:44  张小铁  阅读(172)  评论(0编辑  收藏  举报