Jett+Spring MVC实现Excel导出

来源:互联网 发布:金猪报喜源码下载 编辑:程序博客网 时间:2024/05/01 05:12

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

初识Jett

模版制作

如下为制作好的模版,使用${}来标识我们需要填充的数据。【A4:D4】处使用<jt></jt> 遍历一个集合,我们对集合的每个元素取名为e ,每个元素的又可以使用${e.属性}来进行获取
这里写图片描述

包依赖

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

<dependency>    <groupId>org.apache.poi</groupId>    <artifactId>poi</artifactId>    <version>3.13</version></dependency><dependency>    <groupId>net.sf.jett</groupId>    <artifactId>jett-core</artifactId>    <version>0.9.1</version></dependency>

注意

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

<build>    <plugins>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-resources-plugin</artifactId>            <version>2.6</version>            <configuration>                <nonFilteredFileExtensions>                    <nonFilteredFileExtension>pdf</nonFilteredFileExtension>                    <nonFilteredFileExtension>swf</nonFilteredFileExtension>                    <nonFilteredFileExtension>data</nonFilteredFileExtension>                    <nonFilteredFileExtension>xls</nonFilteredFileExtension>                </nonFilteredFileExtensions>            </configuration>        </plugin>    </plugins></build>

数据填充

try (InputStream is = AppTest.class.getClassLoader().getResourceAsStream("template.xls")) {    try (OutputStream os = new FileOutputStream("output.xls")) {        Map<String, Object> model = new HashMap<>();        model.put("report_year", 2015);        model.put("report_month", 8);        List<Employee> 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();}

效果展示

这里写图片描述

与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<String, Object> 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<String, Object> model = new HashMap<>();    model.put("report_year", 2015);    model.put("report_month", 8);    List<Employee> userList = generateSampleEmployeeData();    model.put("employees", userList);    return new ModelAndView(new JettExcelView("template.xls", "output"), model);}

最后

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

源码

0 0
原创粉丝点击