最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

需要定義動(dòng)態(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;

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

    /**
     * 動(dòng)態(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("生成動(dòng)態(tài)EXL失敗,字段", e);
        }
        long endTime = System.currentTimeMillis();
        log.info("動(dòng)態(tài)導(dǎo)出耗時(shí):{}", 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ù)反射獲取實(shí)體類的class對象
        Class<?> objClass = obj.getClass();
        //設(shè)置實(shí)體類屬性的集合
        Field[] fields = ReflectUtil.getFields(objClass);
        for (String prop : propList) {
            //循環(huán)實(shí)體類對象集合
            for (Field field : fields) {
                field.setAccessible(true);
                //判斷實(shí)體類屬性跟特定字段集合名是否一樣
                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);
    }

}

運(yùn)行代碼

 @PostMapping("/exlOut")
    public void exlOut(HttpServletResponse response) {
        //導(dǎo)出字段集合
        List<ExcelHeader> excelHeaders = Arrays.asList(new ExcelHeader("phone", "手機(jī)號(hào)"), 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é)

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

相關(guān)文章

  • Java設(shè)計(jì)模式之享元模式

    Java設(shè)計(jì)模式之享元模式

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之享元模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • JavaScript中的isTrusted屬性及其應(yīng)用場景詳解

    JavaScript中的isTrusted屬性及其應(yīng)用場景詳解

    在現(xiàn)代 Web 開發(fā)中,JavaScript 是構(gòu)建交互式應(yīng)用的核心語言,隨著前端技術(shù)的不斷發(fā)展,開發(fā)者需要處理越來越多的復(fù)雜場景,例如事件處理、數(shù)據(jù)傳遞和狀態(tài)管理等,本文將通過一個(gè)實(shí)際案例,深入探討 isTrusted 屬性的來源、作用,需要的朋友可以參考下
    2025-01-01
  • Java常見的鎖策略圖文詳解(附實(shí)例代碼)

    Java常見的鎖策略圖文詳解(附實(shí)例代碼)

    Java中的鎖方法是指通過特定的機(jī)制來確保多線程環(huán)境下對共享資源的互斥訪問,以避免數(shù)據(jù)不一致和競態(tài)條件,這篇文章主要介紹了Java常見鎖策略的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-10-10
  • 簡單了解Java位域的一些知識(shí)

    簡單了解Java位域的一些知識(shí)

    這篇文章主要介紹了簡單了解Java位域的一些知識(shí),這個(gè)概念是在 Effective Java中了解到的, 可以通過EnumSet來代替位域這種方式表達(dá),需要的朋友可以參考下
    2019-07-07
  • SpringMVC中的請求參數(shù)接收方式

    SpringMVC中的請求參數(shù)接收方式

    這篇文章主要介紹了SpringMVC中的請求參數(shù)接收方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • springboot單獨(dú)在指定地方輸出sql的方法

    springboot單獨(dú)在指定地方輸出sql的方法

    一般線上項(xiàng)目都是將日志進(jìn)行關(guān)閉,因?yàn)閙ybatis日志打印,時(shí)間長了,會(huì)占用大量的內(nèi)存,如果我想在我指定的地方進(jìn)行打印sql情況,本文就給大家介紹了springboot單獨(dú)在指定地方輸出sql的方法,需要的朋友可以參考下
    2023-10-10
  • java返回json請求中文變成問號(hào)的問題及解決

    java返回json請求中文變成問號(hào)的問題及解決

    這篇文章主要介紹了java返回json請求中文變成問號(hào)的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • SpringBoot自定義Banner使用詳解

    SpringBoot自定義Banner使用詳解

    這篇文章主要介紹了SpringBoot自定義Banner使用詳解,啟動(dòng) Spring Boot 時(shí),幾乎總是能在控制臺(tái)上方看到如下橫幅,這個(gè)也叫字符畫、英文ASCII藝術(shù)字,這就是banner,我們來看一下如何使用,需要的朋友可以參考下
    2024-01-01
  • 換了最新的idea如何將原來舊版本的idea設(shè)置導(dǎo)進(jìn)新的idea中

    換了最新的idea如何將原來舊版本的idea設(shè)置導(dǎo)進(jìn)新的idea中

    這篇文章主要介紹了換了最新的idea如何將原來舊版本的idea設(shè)置導(dǎo)進(jìn)新的idea中,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • mybatis的insert插入后獲取自增id的方法詳解(從controller到mapper)

    mybatis的insert插入后獲取自增id的方法詳解(從controller到mapper)

    這篇文章主要介紹了mybatis的insert插入后獲取自增id的示例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-10-10

最新評論

镇远县| 西峡县| 正阳县| 沧州市| 肇东市| 宁乡县| 承德市| 兴化市| 盖州市| 奈曼旗| 玛纳斯县| 金乡县| 商南县| 汾阳市| 探索| 乐都县| 兴海县| 宣汉县| 新乡县| 林西县| 大荔县| 略阳县| 东乡县| 绥棱县| 甘谷县| 安西县| 德江县| 东宁县| 搜索| 临武县| 和林格尔县| 莱阳市| 西乌珠穆沁旗| 郎溪县| 宁武县| 韶山市| 富蕴县| 石门县| 庆阳市| 句容市| 海南省|