基于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"});
    }
}
相关推荐
骄马之死26 分钟前
Spring 核心知识点(IOC + AOP + 事务)
java·后端·spring
学计算机的计算基29 分钟前
2026 年 AI 助手三国杀:Claude Code vs 腾讯马维斯 vs MiniMax Mavis,我同时用了三周,结论很意外
java·人工智能·python·算法·langchain
_Aaron___30 分钟前
Spring AI 应用上线前,先把大模型调用变成可观测链路
java·人工智能·spring
小糯米60130 分钟前
C语言 自定义类型:联合和枚举
java·c语言·开发语言
weixin_5231853232 分钟前
Java基础知识总结(二):JVM内存结构与变量生命周期
java·开发语言·jvm
我是大猴子38 分钟前
连接池+虚拟线程
java
技术小结-李爽38 分钟前
【工具】如何认识Maven
java·maven
小碗羊肉1 小时前
【RabbitMQ高级】如何保证消息的可靠性?
java·rabbitmq·java-rabbitmq
xiaoshuaishuai81 小时前
C# 多线程之间对比
java·开发语言·c#
越努力越幸运662 小时前
Java 无需 Office 环境实现 Word 转 HTML
java