欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java如何利用Easyexcel動態(tài)導(dǎo)出表頭列

 更新時間:2025年04月23日 09:39:17   作者:C__jx  
這篇文章主要介紹了Java利用Easyexcel動態(tài)導(dǎo)出表頭列的實例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

Java利用Easyexcel動態(tài)導(dǎo)出表頭列

需要定義動態(tài)導(dǎo)出的表頭列集合

其中 fieldName 為要導(dǎo)出的字段名稱 也就是 數(shù)據(jù)對象 中與之對應(yīng)的字段名稱

headName 為與字段對應(yīng)的表頭

(我這里默認(rèn)用的就是導(dǎo)出表頭集合中字段排序就是導(dǎo)出的表頭排序 如有需要,可以自己定義導(dǎo)出表頭順序)

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 {

    /**
     * 要導(dǎo)出的字段名稱
     */
    private String fieldName;

    /**
     * 要導(dǎo)出的表頭名稱
     */
    private String headName;
}

導(dǎo)出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;

/**
 * 動態(tài)導(dǎo)出 exl
 * @author: chenjiaxiang
 * @create: 2023/4/11 16:20
 **/
@Slf4j
public class EasyExcelUtils {

    /**
     * 動態(tài)導(dǎo)出exl
     *
     * @param headers  要導(dǎo)出的頭集合
     * @param dataList 數(shù)據(jù)集合
     */
    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("生成動態(tài)EXL失敗,字段", e);
        }
        long endTime = System.currentTimeMillis();
        log.info("動態(tài)導(dǎo)出耗時:{}", 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;
    }

    /**
     * 要導(dǎo)出的字段
     *
     * @param exportFields 表頭集合
     * @param obj          數(shù)據(jù)對象
     * @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());
        //先根據(jù)反射獲取實體類的class對象
        Class<?> objClass = obj.getClass();
        //設(shè)置實體類屬性的集合
        Field[] fields = ReflectUtil.getFields(objClass);
        for (String prop : propList) {
            //循環(huán)實體類對象集合
            for (Field field : fields) {
                field.setAccessible(true);
                //判斷實體類屬性跟特定字段集合名是否一樣
                if (field.getName().equals(prop)) {
                    T object = (T) field.get(obj);
                    //獲取屬性對應(yīng)的值
                    data.add(object);
                }
            }
        }
        list.add(data);
        return list;
    }

}

CellStyle()是設(shè)置的默認(rèn)樣式

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) {
        // 簡單設(shè)置
        Sheet sheet = writeSheetHolder.getSheet();
        sheet.setColumnWidth(cell.getColumnIndex(), 5000);
    }

}

運行代碼

 @PostMapping("/exlOut")
    public void exlOut(HttpServletResponse response) {
        //導(dǎo)出字段集合
        List<ExcelHeader> excelHeaders = Arrays.asList(new ExcelHeader("phone", "手機號"), new ExcelHeader("sexStr", "性別"));
        //數(shù)據(jù)集合
        List<GetSchoolExpertsDeriveExlVo> getSchoolExpertsDeriveExlVos = Arrays.asList(new GetSchoolExpertsDeriveExlVo("男", "1231231"), new GetSchoolExpertsDeriveExlVo("nn", "adadad"));
        EasyExcelUtils.dynamicExportExcel(excelHeaders,getSchoolExpertsDeriveExlVos,response);
    }

導(dǎo)出效果

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java漢字轉(zhuǎn)拼音案例詳解

    Java漢字轉(zhuǎn)拼音案例詳解

    這篇文章主要介紹了Java漢字轉(zhuǎn)拼音案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Dapr在Java中的服務(wù)調(diào)用實戰(zhàn)過程詳解

    Dapr在Java中的服務(wù)調(diào)用實戰(zhàn)過程詳解

    這篇文章主要為大家介紹了Dapr在Java中的服務(wù)調(diào)用實戰(zhàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • elasticsearch集群cluster示例詳解

    elasticsearch集群cluster示例詳解

    這篇文章主要為大家介紹了elasticsearch集群cluster示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • Springboot實現(xiàn)對配置文件中的明文密碼加密詳解

    Springboot實現(xiàn)對配置文件中的明文密碼加密詳解

    我們在SpringBoot項目當(dāng)中,會把數(shù)據(jù)庫的用戶名密碼等配置直接放在yaml或者properties文件中,這樣維護數(shù)據(jù)庫的密碼等敏感信息顯然是有一定風(fēng)險的。所以本文為大家整理了對配置文件中的明文密碼加密的方法,希望對大家有所幫助
    2023-03-03
  • 詳解Spring中bean生命周期回調(diào)方法

    詳解Spring中bean生命周期回調(diào)方法

    本篇文章主要介紹了詳解Spring中bean生命周期回調(diào)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Mybatis中resultMap標(biāo)簽和sql標(biāo)簽的設(shè)置方式

    Mybatis中resultMap標(biāo)簽和sql標(biāo)簽的設(shè)置方式

    這篇文章主要介紹了Mybatis中resultMap標(biāo)簽和sql標(biāo)簽的設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • JavaStream將List轉(zhuǎn)為Map示例

    JavaStream將List轉(zhuǎn)為Map示例

    這篇文章主要為大家介紹了JavaStream將List轉(zhuǎn)為Map示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Java中JDK動態(tài)代理的超詳細講解

    Java中JDK動態(tài)代理的超詳細講解

    JDK 的動態(tài)代理是基于攔截器和反射來實現(xiàn)的,JDK代理是不需要第三方庫支持的,只需要JDK環(huán)境就可以進行代理,下面這篇文章主要給大家介紹了關(guān)于Java中JDK動態(tài)代理的超詳細講解,需要的朋友可以參考下
    2022-10-10
  • 帶你全面認(rèn)識Java中的異常處理

    帶你全面認(rèn)識Java中的異常處理

    在你所寫過的代碼中,你已經(jīng)接觸過一些異常了,我們可以通過一些簡單的代碼讓我們理解一些簡單的異常,下面這篇文章主要給大家介紹了關(guān)于Java中異常處理的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • 手把手教你SpringBoot整合Mybatis

    手把手教你SpringBoot整合Mybatis

    這篇文章主要介紹了手把手教你SpringBoot整合Mybatis,Mybatis是一款持久化框架,可以幫我們省去大部分jdbc的代碼,需要的朋友可以參考下
    2023-03-03

最新評論