ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

easyPOI导出

2022-07-21 16:01:49  阅读:192  来源: 互联网

标签:return String 导出 new fileName headers import easyPOI


文档:http://doc.wupaas.com/docs/easypoi/easypoi-1c0u6ksp2r091

1.依赖

        <!-- easypoi的支持 -->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-web</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-annotation</artifactId>
            <version>3.2.0</version>
        </dependency>

2.实体类

注解: @Excel(name = "字典id")

name值即为excel标题行

3.controller

@GetMapping("/export/test/{id}")
public ResponseEntity<byte[]> exportProtocol(@PathVariable("id") Integer id, HttpServletRequest request, HttpServletResponse response){
    return testService.export(id,request,response);
}

4.service

public ResponseEntity<byte[]> exportProtocol(Integer protocolId, HttpServletRequest request, HttpServletResponse response) {
    //准备参数集合
    List<A> datas1 = new ArrayList<>();
    List<B> datas3 = new ArrayList<>();
    List<Map<String,Object>> sheetsList = new ArrayList<>();
    //sheet1
    sheetsList.add(makeSheet("sheet页名称1", A.class, datas1));
    //sheet2
    sheetsList.add(makeSheet("sheet页名称2", B.class, datas2));
    //工具类获取Workbook对象
    Workbook workbook = ExcelExportUtil.exportExcel(sheetsList, ExcelType.HSSF);
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    try {
        workbook.write(out);
        String fileName = DownloadUtil.processFileName("测试文件导出-文件名.xls",request,response);
        return DownloadUtil.downloadFile(out,fileName);
    }catch (Exception e){
        e.printStackTrace();
    }
    return null;
}

    /**
     * 封装sheet
     * @param sheetName sheet名称
     * @param pojoClass 实体类
     * @param datas 数据
     * @param <T>
     * @return
     */
    public static <T> Map<String, Object> makeSheet(String sheetName, Class<T> pojoClass, List<T> datas) {
        ExportParams sheet = new ExportParams();
        sheet.setSheetName(sheetName);
        Map<String, Object> map = new HashMap<>();
        map.put("title", sheet);
        map.put("entity", pojoClass);
        map.put("data", datas);
        return map;
    }

5.工具类

package com.test.utils;

import lombok.SneakyThrows;
import org.apache.commons.lang.StringUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.FileCopyUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

/**
 * Mvc 导出文件
 */
public class DownloadUtil {
    private DownloadUtil() {}

    @SneakyThrows
    public static ResponseEntity<byte[]> downloadFile(File file, String fileName) {
        HttpHeaders headers = new HttpHeaders();
        //通知浏览器以attachment(下载方式)打开
        headers.setContentDispositionFormData("attachment",
                new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
        //application/octet-stream : 二进制流数据(最常见的文件下载)。
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        return new ResponseEntity<>(FileCopyUtils.copyToByteArray(file),
                headers, HttpStatus.CREATED);
    }

    @SneakyThrows
    public static ResponseEntity<byte[]> downloadFile(ByteArrayOutputStream out, String fileName) {
        HttpHeaders headers = new HttpHeaders();
        //通知浏览器以attachment(下载方式)打开
        headers.setContentDispositionFormData("attachment",
                new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
        //application/octet-stream : 二进制流数据(最常见的文件下载)。
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        return new ResponseEntity<>(out.toByteArray(),
                headers, HttpStatus.CREATED);
    }


    public static String processFileName(String fileName, HttpServletRequest request, HttpServletResponse response) {
        String userAgent = request.getHeader("USER-AGENT");
        try {
            if (StringUtils.contains(userAgent, "MSIE")) {
                //IE浏览器
                fileName = URLEncoder.encode(fileName, "UTF8");
            } else if (StringUtils.contains(userAgent, "Mozilla")) {
                //google,火狐浏览器
                fileName = new String(fileName.getBytes(), "ISO8859-1");
            } else if(StringUtils.contains(fileName,"Postman")){
                fileName = new String(fileName.getBytes(),"ISO8859-1");
            } else {
                fileName = URLEncoder.encode(fileName, "UTF8");
                //其他浏览器
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return fileName;
    }
}

标签:return,String,导出,new,fileName,headers,import,easyPOI
来源: https://www.cnblogs.com/bgtong/p/16502239.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有