基于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 小时前
JDK25模块导入声明
java·后端·java ee
_小马快跑_3 小时前
Java 的 8 大基本数据类型:为何是不可或缺的设计?
java
Re_zero6 小时前
线上日志被清空?这段仅10行的 IO 代码里竟然藏着3个毒瘤
java·后端
洋洋技术笔记6 小时前
Spring Boot条件注解详解
java·spring boot
程序员清风1 天前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林5511 天前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java
华仔啊1 天前
挖到了 1 个 Java 小特性:var,用完就回不去了
java·后端
SimonKing1 天前
SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询
java·后端·程序员
日月云棠2 天前
各版本JDK对比:JDK 25 特性详解
java
用户8307196840822 天前
Spring Boot 项目中日期处理的最佳实践
java·spring boot