Jett+Spring MVC实现Excel导出

接上文,由于本人在使用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

源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值