Jett+Spring MVC实现Excel导出

接上文,由于本人在使用Jxls进行Excel导出时遇到数据遍历时Shift Row的格式问题无法解决,同时项目又较为紧张,于是尝试了使用Jett,幸好该框架基本能满足本人的需求,同时感觉各项功能的支持也不错,于是转而使用Jett。

初识Jett

模版制作

如下为制作好的模版,使用${}来标识我们需要填充的数据。【A4:D4】处使用 遍历一个集合,我们对集合的每个元素取名为e ,每个元素的又可以使用${e.属性}来进行获取
Jett+Spring MVC实现Excel导出_第1张图片

包依赖

我们使用Maven来进行包依赖管理


    org.apache.poi
    poi
    3.13


    net.sf.jett
    jett-core
    0.9.1

注意

使用Maven的 maven-resources-plugin 插件管理 resources 时,Maven会对模版进行转码处理,因此需要对xls格式的文件进行过滤,使其不处理。


    
        
            org.apache.maven.plugins
            maven-resources-plugin
            2.6
            
                
                    pdf
                    swf
                    data
                    xls
                
            
        
    

数据填充

try (InputStream is = AppTest.class.getClassLoader().getResourceAsStream("template.xls")) {
    try (OutputStream os = new FileOutputStream("output.xls")) {
        Map model = new HashMap<>();
        model.put("report_year", 2015);
        model.put("report_month", 8);
        List userList = generateSampleEmployeeData();
        model.put("employees", userList);
        Workbook workbook = new ExcelTransformer().transform(is, model);
        workbook.write(os);
    } catch (IOException | InvalidFormatException e) {
        e.printStackTrace();
    }
} catch (IOException e) {
    e.printStackTrace();
}

效果展示

Jett+Spring MVC实现Excel导出_第2张图片

与Spring MVC结合

编写View

我们继承Spring提供的 AbstractView 抽象类。

package com.closer.jett.common;

import net.sf.jett.transform.ExcelTransformer;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.servlet.view.AbstractView;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;

/**
 * JettExcelView
 * Created by Zhang Jinlong on 2015/11/4.
 */
public class JettExcelView extends AbstractView {

    private static final String CONTENT_TYPE = "application/vnd.ms-excel";


    private String templatePath;
    private String exportFileName;

    public JettExcelView(String templatePath, String exportFileName) {
        this.templatePath = templatePath;
        if (exportFileName != null) {
            try {
                exportFileName = URLEncoder.encode(exportFileName, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        this.exportFileName = exportFileName;
        setContentType(CONTENT_TYPE);
    }

    @Override
    protected void renderMergedOutputModel(
            Map model,
            HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        try (InputStream is = getClass().getClassLoader().getResourceAsStream(templatePath)) {
            response.setContentType(getContentType());
            response.setHeader("content-disposition", "attachment;filename=" + exportFileName + ".xls");
            ServletOutputStream os = response.getOutputStream();
            Workbook workbook = new ExcelTransformer().transform(is, model);
            workbook.write(os);
        }
    }
}

请求处理

@RequestMapping(value = "/report")
public ModelAndView export() {
    Map model = new HashMap<>();
    model.put("report_year", 2015);
    model.put("report_month", 8);
    List userList = generateSampleEmployeeData();
    model.put("employees", userList);
    return new ModelAndView(new JettExcelView("template.xls", "output"), model);
}

最后

这里只是写了一个简单的例子,Jett还有很多对Excel导出的用法,这里不一一细说,详细可以查阅官网Jett

源码

你可能感兴趣的:(服务端开发)