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è)參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)過程
- Java使用EasyExcel生成動(dòng)態(tài)表頭和多Sheet數(shù)據(jù)的Excel實(shí)例
- SpringBoot3整合EasyExcel動(dòng)態(tài)實(shí)現(xiàn)表頭重命名
- EasyExcel如何導(dǎo)出多級且動(dòng)態(tài)的表頭
- springboot結(jié)合easyexcel實(shí)現(xiàn)動(dòng)態(tài)表頭的實(shí)踐
- EasyExcel動(dòng)態(tài)表頭基礎(chǔ)用法及最佳實(shí)踐詳解
相關(guān)文章
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
換了最新的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的示例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-10-10

