Java如何利用Easyexcel動態(tài)導出表頭列
更新時間:2025年04月23日 09:39:17 作者:C__jx
這篇文章主要介紹了Java利用Easyexcel動態(tài)導出表頭列的實例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
Java利用Easyexcel動態(tài)導出表頭列
需要定義動態(tài)導出的表頭列集合
其中 fieldName 為要導出的字段名稱 也就是 數(shù)據對象 中與之對應的字段名稱
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; /** * 動態(tài)導出 exl * @author: chenjiaxiang * @create: 2023/4/11 16:20 **/ @Slf4j public class EasyExcelUtils { /** * 動態(tài)導出exl * * @param headers 要導出的頭集合 * @param dataList 數(shù)據集合 */ 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)導出耗時:{}", 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 數(shù)據對象 * @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) { //循環(huán)實體類對象集合 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", "性別")); //數(shù)據集合 List<GetSchoolExpertsDeriveExlVo> getSchoolExpertsDeriveExlVos = Arrays.asList(new GetSchoolExpertsDeriveExlVo("男", "1231231"), new GetSchoolExpertsDeriveExlVo("nn", "adadad")); EasyExcelUtils.dynamicExportExcel(excelHeaders,getSchoolExpertsDeriveExlVos,response); }
導出效果
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Springboot實現(xiàn)對配置文件中的明文密碼加密詳解
我們在SpringBoot項目當中,會把數(shù)據庫的用戶名密碼等配置直接放在yaml或者properties文件中,這樣維護數(shù)據庫的密碼等敏感信息顯然是有一定風險的。所以本文為大家整理了對配置文件中的明文密碼加密的方法,希望對大家有所幫助2023-03-03Mybatis中resultMap標簽和sql標簽的設置方式
這篇文章主要介紹了Mybatis中resultMap標簽和sql標簽的設置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01