1. 程式人生 > >Jett+Spring MVC實現Excel匯出

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

原始碼