Java如何利用Easyexcel动态导出表头列

 更新时间:2025年04月23日 09:39:17   作者:C__jx  
这篇文章主要介绍了Java利用Easyexcel动态导出表头列的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Java利用Easyexcel动态导出表头列

需要定义动态导出的表头列集合

其中 fieldName 为要导出的字段名称 也就是 数据对象 中与之对应的字段名称

headName 为与字段对应的表头

(我这里默认用的就是导出表头集合中字段排序就是导出的表头排序 如有需要,可以自己定义导出表头顺序)

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author: chenjiaxiang
 * @create: 2023/4/11 11:05
 **/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ExcelHeader {

    /**
     * 要导出的字段名称
     */
    private String fieldName;

    /**
     * 要导出的表头名称
     */
    private String headName;
}

导出util类

直接上代码

import cn.hutool.core.util.ReflectUtil;
import com.alibaba.excel.EasyExcel;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 动态导出 exl
 * @author: chenjiaxiang
 * @create: 2023/4/11 16:20
 **/
@Slf4j
public class EasyExcelUtils {

    /**
     * 动态导出exl
     *
     * @param headers  要导出的头集合
     * @param dataList 数据集合
     */
    public static <T> void dynamicExportExcel(List<ExcelHeader> headers, List<T> dataList, HttpServletResponse response) {
        long startTime = System.currentTimeMillis();
        List<List<T>> allList = new ArrayList<>();
        for (T detail : dataList) {
            allList.addAll(EasyExcelUtils.dataList(headers, detail));
        }
        try (ServletOutputStream outputStream = response.getOutputStream()) {
            EasyExcel.write(outputStream).head(EasyExcelUtils.headers(headers))
                    //文件样式
                    .registerWriteHandler(new CellStyle())
                    .sheet("sheet").doWrite(allList);
        } catch (IOException e) {
            log.error("生成动态EXL失败,字段", e);
        }
        long endTime = System.currentTimeMillis();
        log.info("动态导出耗时:{}", endTime - startTime);
    }

    //excel表头
    public static List<List<String>> headers(List<ExcelHeader> excelHeaders) {
        List<List<String>> headers = new ArrayList<>();
        for (ExcelHeader header : excelHeaders) {
            List<String> head = new ArrayList<>();
            head.add(header.getHeadName());
            headers.add(head);
        }
        return headers;
    }

    /**
     * 要导出的字段
     *
     * @param exportFields 表头集合
     * @param obj          数据对象
     * @return 集合
     */
    @SneakyThrows
    public static <T> List<List<T>> dataList(List<ExcelHeader> exportFields, T obj) {
        List<List<T>> list = new ArrayList<>();
        List<T> data = new ArrayList<>();
        List<String> propList = exportFields.stream().map(ExcelHeader::getFieldName).collect(Collectors.toList());
        //先根据反射获取实体类的class对象
        Class<?> objClass = obj.getClass();
        //设置实体类属性的集合
        Field[] fields = ReflectUtil.getFields(objClass);
        for (String prop : propList) {
            //循环实体类对象集合
            for (Field field : fields) {
                field.setAccessible(true);
                //判断实体类属性跟特定字段集合名是否一样
                if (field.getName().equals(prop)) {
                    T object = (T) field.get(obj);
                    //获取属性对应的值
                    data.add(object);
                }
            }
        }
        list.add(data);
        return list;
    }

}

CellStyle()是设置的默认样式

import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;

import java.util.List;

/**
 * @author: chenjiaxiang
 * @create: 2022-08-11 14:53
 **/
public class CellStyle extends AbstractColumnWidthStyleStrategy {

    @Override
    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> cellDataList, Cell cell, Head head,
                                  Integer relativeRowIndex, Boolean isHead) {
        // 简单设置
        Sheet sheet = writeSheetHolder.getSheet();
        sheet.setColumnWidth(cell.getColumnIndex(), 5000);
    }

}

运行代码

 @PostMapping("/exlOut")
    public void exlOut(HttpServletResponse response) {
        //导出字段集合
        List<ExcelHeader> excelHeaders = Arrays.asList(new ExcelHeader("phone", "手机号"), new ExcelHeader("sexStr", "性别"));
        //数据集合
        List<GetSchoolExpertsDeriveExlVo> getSchoolExpertsDeriveExlVos = Arrays.asList(new GetSchoolExpertsDeriveExlVo("男", "1231231"), new GetSchoolExpertsDeriveExlVo("nn", "adadad"));
        EasyExcelUtils.dynamicExportExcel(excelHeaders,getSchoolExpertsDeriveExlVos,response);
    }

导出效果

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring MVC项目开发踩过的一些bug

    Spring MVC项目开发踩过的一些bug

    这篇文章主要给大家介绍了关于Spring MVC项目开发踩过的一些bug,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Java微信获取用户资料报错48001解决办法

    Java微信获取用户资料报错48001解决办法

    这篇文章主要介绍了Java微信获取用户资料报错48001的解决办法,这个问题大家在工作可能经常会遇到,文中通过示例代码将解决的办法介绍的非常详细,需要的朋友可以参考下
    2025-09-09
  • 使用Feign调用时添加验证信息token到请求头方式

    使用Feign调用时添加验证信息token到请求头方式

    这篇文章主要介绍了使用Feign调用时添加验证信息token到请求头方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java中包和导包、Scanner类、输入源的详细讲解

    Java中包和导包、Scanner类、输入源的详细讲解

    包是Java中用来组织类和接口的一种机制,通过使用包,可以避免命名冲突,同时也方便管理代码结构,这篇文章主要介绍了Java中包和导包、Scanner类、输入源的详细讲解,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-08-08
  • 如何解决 Java 中的 IndexOutOfBoundsException 异常(最新推荐)

    如何解决 Java 中的 IndexOutOfBoundsException 异

    当我们在 Java 中使用 List 的时候,有时候会出现向 List 中不存在的位置设置新元素的情况,从而导致 IndexOutOfBoundsException 异常,本文将会介绍这个问题的产生原因以及解决方案
    2023-10-10
  • Spring Data Neo4j Cypher查询使用

    Spring Data Neo4j Cypher查询使用

    本文介绍了Spring Data Neo4j Cypher查询使用的几种方法,包括使用Repository接口、动态查询、服务层组合、外部查询文件和图形化查询构建器, 感兴趣的可以了解一下
    2024-11-11
  • Java编写实现多人聊天室

    Java编写实现多人聊天室

    这篇文章主要为大家详细介绍了Java编写实现多人聊天室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Springboot3整合Elasticsearch8(elasticsearch-java)最佳实践

    Springboot3整合Elasticsearch8(elasticsearch-java)最佳实践

    文章推荐使用Elasticsearch官方新客户端(ElasticsearchJavaAPIClient)替代已废弃的RestHighLevelClient,对比SpringDataElasticsearch和easy-es的优缺点,详解SpringBoot3整合步骤及高阶用法,强调新客户端功能全且适配最新版本,感兴趣的朋友一起看看吧
    2025-07-07
  • java数学类Math BigInteger BigDecimal使用介绍

    java数学类Math BigInteger BigDecimal使用介绍

    这篇文章主要为大家介绍了java数学类Math、BigInteger、BigDecimal的使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 详解Spring Security认证流程

    详解Spring Security认证流程

    这篇文章主要介绍了Spring Security认证流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02

最新评论