WebTest.java 4.2 KB
Newer Older
Z
zhuangjiaju 已提交
1 2 3
package com.alibaba.easyexcel.test.demo.web;

import java.io.IOException;
4
import java.net.URLEncoder;
Z
zhuangjiaju 已提交
5 6
import java.util.ArrayList;
import java.util.Date;
7
import java.util.HashMap;
Z
zhuangjiaju 已提交
8
import java.util.List;
9
import java.util.Map;
Z
zhuangjiaju 已提交
10 11 12

import javax.servlet.http.HttpServletResponse;

13
import org.springframework.beans.factory.annotation.Autowired;
Z
zhuangjiaju 已提交
14 15 16 17 18 19
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

Z
zhuangjiaju 已提交
20
import com.alibaba.excel.EasyExcel;
21
import com.alibaba.fastjson.JSON;
Z
zhuangjiaju 已提交
22 23 24 25

/**
 * web读写案例
 *
Z
zhuangjiaju 已提交
26
 * @author Jiaju Zhuang
Z
zhuangjiaju 已提交
27 28 29
 **/
@Controller
public class WebTest {
30 31 32 33

    @Autowired
    private UploadDAO uploadDAO;

Z
zhuangjiaju 已提交
34
    /**
35
     * 文件下载(失败了会返回一个有部分数据的Excel)
罗成 已提交
36 37 38 39 40 41
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DownloadData}
     * <p>
     * 2. 设置返回的 参数
     * <p>
     * 3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
Z
zhuangjiaju 已提交
42 43 44
     */
    @GetMapping("download")
    public void download(HttpServletResponse response) throws IOException {
庄家钜's avatar
庄家钜 已提交
45
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
Z
zhuangjiaju 已提交
46 47
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
48 49 50
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
Z
zhuangjiaju 已提交
51
        EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data());
Z
zhuangjiaju 已提交
52 53
    }

54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
    /**
     * 文件下载并且失败的时候返回json(默认失败了会返回一个有部分数据的Excel)
     *
     * @since 2.1.1
     */
    @GetMapping("downloadFailedUsingJson")
    public void downloadFailedUsingJson(HttpServletResponse response) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        try {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("测试", "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            // 这里需要设置不关闭流
            EasyExcel.write(response.getOutputStream(), DownloadData.class).autoCloseStream(Boolean.FALSE).sheet("模板")
                .doWrite(data());
        } catch (Exception e) {
            // 重置response
            response.reset();
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            Map<String, String> map = new HashMap<String, String>();
            map.put("status", "failure");
            map.put("message", "下载文件失败" + e.getMessage());
            response.getWriter().println(JSON.toJSONString(map));
        }
    }

Z
zhuangjiaju 已提交
83 84
    /**
     * 文件上传
罗成 已提交
85 86 87 88 89 90
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link UploadData}
     * <p>
     * 2. 由于默认异步读取excel,所以需要创建excel一行一行的回调监听器,参照{@link UploadDataListener}
     * <p>
     * 3. 直接读即可
Z
zhuangjiaju 已提交
91 92 93 94
     */
    @PostMapping("upload")
    @ResponseBody
    public String upload(MultipartFile file) throws IOException {
95
        EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();
Z
zhuangjiaju 已提交
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
        return "success";
    }

    private List<DownloadData> data() {
        List<DownloadData> list = new ArrayList<DownloadData>();
        for (int i = 0; i < 10; i++) {
            DownloadData data = new DownloadData();
            data.setString("字符串" + 0);
            data.setDate(new Date());
            data.setDoubleData(0.56);
            list.add(data);
        }
        return list;
    }
}