基于EasyExcel实现的动态表头工具类

  1. 工具类
java 复制代码
package net.lesscoding.utils;

import cn.hutool.core.bean.BeanUtil;
import com.alibaba.excel.EasyExcel;
import com.google.common.collect.Lists;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author eleven
 * @date 2024/1/10 16:35
 * @apiNote
 */
public class DynamicHeaderUtil<T> {

    private static void setResponseHeader(HttpServletResponse response, String fileName) throws UnsupportedEncodingException {
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        response.setHeader("Connection", "close");
        response.setHeader("Content-Type", "application/octet-stream");
    }

    private static  <T> List<List<Object>> dataList(List<T> list, String... fields) {
        return list.stream()
                .map(entity -> Arrays.stream(fields)
                        .map(field -> Optional.ofNullable(BeanUtil.beanToMap(entity).get(field)).orElse(""))
                        .collect(Collectors.toList()))
                .collect(Collectors.toList());
    }

    private static List<List<String>> dynamicHeader(String[] head) {
        return Arrays.stream(head)
                .map(item -> Lists.newArrayList(item.split(",")))
                .collect(Collectors.toList());
    }

    public static <T> void exportExcel(HttpServletResponse response, List<T> list, String fileName, String[] headerArray, String[] fields) throws Exception {
        setResponseHeader(response, fileName);
        try (ServletOutputStream outputStream = response.getOutputStream()){
            EasyExcel.write(outputStream)
                    // 这里放入动态头
                    .head(dynamicHeader(headerArray))
                    .sheet("模板")
                    .doWrite(dataList(list, fields));
        }

    }
}
  1. 使用
java 复制代码
package net.lesscoding.controller;

import cn.dev33.satoken.annotation.SaIgnore;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import net.lesscoding.entity.Account;
import net.lesscoding.mapper.AccountMapper;
import net.lesscoding.utils.DynamicHeaderUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * @author eleven
 * @date 2024/1/10 16:34
 * @apiNote
 */
@RestController
@RequestMapping("/test")
@SaIgnore
public class TestController {
    @Autowired
    private AccountMapper accountMapper;


    @GetMapping("/download")
    public void download(HttpServletResponse response) throws Exception {
        List<Account> accounts = accountMapper.selectList(new QueryWrapper<Account>()
                .last("limit 10"));
        DynamicHeaderUtil.exportExcel(response,
                accounts,
                "test",
                new String[]{
                        "个人信息,网络信息,省份",
                        "个人信息,网络信息,IP",
                        "个人信息,昵称",
                        "个人信息,账号",
                        "个人信息,Mac",
                },
                new String[]{"region", "nickname", "account", "mac"});
    }
}
相关推荐
生活真难2 分钟前
SpringCloud - 任务调度 - xxl-job-java
java·spring boot·spring cloud
人道领域40 分钟前
【黑马点评日记】:用户签到功能详解——从Bitmap入门到避坑指南
java·数据库·redis·后端
梦梦代码精43 分钟前
《企业开源商城选型:商业闭环、二次开发与成本平衡》
java·开发语言·低代码·开源·github
狼与自由1 小时前
灰度发布的策略
java
神仙别闹1 小时前
基于QT(C++)实现线性表的建立、插入、删除、查找等基本操作
java·c++·qt
Kiyra1 小时前
从上传到可问答:Interview Agent 的知识库 RAG 链路
java·人工智能·后端·spring·职场和发展
拙野1 小时前
工作中Mybatis动态SQL的使用
java·sql·mybatis
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题】【Java基础篇】第39题:说说反射的用途及实现原理,Java获取反射(Class)的三种方法
java·开发语言·后端·python·面试
PeterLi1 小时前
踩坑实录:JRebel 启动报 Mapper 重复 ID 异常,IDEA 普通启动却正常?
java·后端
小碗羊肉2 小时前
【JavaWeb | 第五篇】JDBC
java·开发语言·数据库