SpringMVC-Excel视图的使用

SpringMVC-Excel视图的使用

1. 功能介绍

这里的主要功能是:从数据库中导出所有用户的信息,生成一张Excel表。

使用到的视图:AbstractXlsView

1.1. AbstractXlsView介绍

该类实现了视图接口,是一个抽象类,不能生成实例对象,它自己定义了一个抽象方法——buildExcelDocument要去实现。其他的方法Spring的AbstractXlsView已经实现了。所以对于我们而言只需要实现这个方法就可以使用Excel的视图功能了。

1.2. buildExcelDocument方法介绍

方法如下:

/**
     * 创建excel文件
     * @param model——spring mvc数据模型
     * @param workbook ——POI workbook对象
     * @param httpServletRequest
     * @param httpServletResponse
     * @throws Exception
     */
    @Override
    protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {

    }

​ 这个方法的主要任务是创建一个Workbook,它要用到POI的API,后面会配上其maven坐标。这里的参数如代码中给出。在SpringMVC中已经对导出Excel做了很多的封装,所以很多细节不需要我们关心。

2. 功能实现

2.1. 导入POI的坐标
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>
2.2. 创建接口:ExcelExportService

​ 假设需要一个导出所有用户信息的功能,但是将来也许还有其他的导出功能,为了方便,先定义一个接口,这个接口主要是让开发者自定义生成Excel的规则。

public interface ExcelExportService {

    /**
     * 自定义生成excel文件的规则
     * @param model 数据模型
     * @param workbook excel workbook
     */
    public void makeWoorkBook(Map<String,Object> model, Workbook workbook);
}
2.3. 创建ExcelView

​ 有了ExcelExportService接口还需一个可实例化的Excel视图类——ExcelView,对于导出而言,还需要一个下载文件名称,所以还会定义一个文件名(FileName属性),由于该视图不是一个逻辑视图,所以无需视图解析器也可以运行。其定义代码如下:

package com.itlearn.excel;

import com.itlearn.service.excel.ExcelExportService;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.view.document.AbstractXlsView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

public class ExcelView extends AbstractXlsView {

    //文件名
    private String fileName = null;

    //导出视图自定义接口
    private ExcelExportService exportService;
    //构造方法
    public ExcelView(ExcelExportService exportService){
        this.exportService = exportService;
    }
    //构造方法2
    public ExcelView(String viewName,ExcelExportService exportService){
        this.setBeanName(viewName);
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public ExcelExportService getExportService() {
        return exportService;
    }

    public void setExportService(ExcelExportService exportService) {
        this.exportService = exportService;
    }

    @Override
    protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception {
        //没有自定义的接口
        if (exportService ==null){
            throw new RuntimeException("导出服务接口不能为null");
        }
        //文件名不为空,为空则使用请求路径中的字符串作为文件名
        if (!StringUtils.isEmpty(fileName)){
            //进行字符串的转化
            String reqCharset = request.getCharacterEncoding();
            reqCharset = reqCharset == null?"UTF-8":reqCharset;
            fileName = new String(fileName.getBytes(reqCharset),"ISO8859-1");
            //设置下面文件名
            response.setHeader("Content-disposition","attachment;fileName="+fileName);
        }
        //回调接口方法,使用自定义生成Excel文档
        exportService.makeWoorkBook(model,workbook);
    }
}

​ 这样就可以根据需要进行自定义生成Excel的规则,接着我们需要在用户控制器中加入新的方法,来满足导出所有用户的操作。

2.4. 实现导出Excel

在用户控制器中加入新的方法

***********import************
@Controller
public class UserController {

    @Autowired
    private IUserService service;

    @RequestMapping(value = "/export",method = RequestMethod.GET)
    public ModelAndView export(){
        //模型和视图
        ModelAndView mv = new ModelAndView();
        //Excel视图,并设置自定义导出接口
        ExcelView ev = new ExcelView(exportService());
        //文件名
        ev.setFileName("所有用户.xlsx");
        //设置SQL后台参数
        //分页 插件
        List<User> userList = service.findAll();
        //加入到数据模型 中
        mv.addObject("userList",userList);
        mv.setView(ev);
        return mv;
    }
	
	//使用Lambda表达式实现ExcelExportService接口
    public ExcelExportService exportService(){
        //使用Lambda表达式自定义导出excel规则
        return (Map<String,Object> model, Workbook workbook) ->{
            //获取用户列表
            List<User> userList = (List<User>) model.get("userList");
            //生成sheet
            Sheet sheet = workbook.createSheet("所有用户");
            //加载标题
            Row title = sheet.createRow(0);
            title.createCell(0).setCellValue("编号");
            title.createCell(1).setCellValue("用户名");
            title.createCell(2).setCellValue("出生日期");
            title.createCell(3).setCellValue("性别");
            title.createCell(4).setCellValue("地址");
            //遍历角色列表,生成一行行数据
            for (int i = 0;i<userList.size();i++){
                User user = userList.get(i);
                int userIdx = i+1;
                Row row = sheet.createRow(userIdx);
                row.createCell(0).setCellValue(user.getId());
                row.createCell(1).setCellValue(user.getUsername());
                row.createCell(2).setCellValue(DateFormatUtil.dateToString(user.getBirthday()));
                row.createCell(3).setCellValue(user.getSex());
                row.createCell(4).setCellValue(user.getAddress());
            }
        };
    }
}

​ 这样就实现了导出Excel,使用Lambda表达式实现ExcelExportService接口(Java8以上)。这里使用了ExcelExportService接口,就可以在自己的控制器上自定义导出规则,根据需要完成开发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值