Java如何利用Easyexcel動(dòng)態(tài)導(dǎo)出表頭列
Java利用Easyexcel動(dòng)態(tài)導(dǎo)出表頭列
需要定義動(dòng)態(tài)導(dǎo)出的表頭列集合
其中 fieldName 為要導(dǎo)出的字段名稱(chēng) 也就是 數(shù)據(jù)對(duì)象 中與之對(duì)應(yīng)的字段名稱(chēng)
headName 為與字段對(duì)應(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)出的字段名稱(chēng) */ private String fieldName; /** * 要導(dǎo)出的表頭名稱(chēng) */ private String headName; }
導(dǎo)出util類(lèi)
直接上代碼
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ù)對(duì)象 * @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í)體類(lèi)的class對(duì)象 Class<?> objClass = obj.getClass(); //設(shè)置實(shí)體類(lèi)屬性的集合 Field[] fields = ReflectUtil.getFields(objClass); for (String prop : propList) { //循環(huán)實(shí)體類(lèi)對(duì)象集合 for (Field field : fields) { field.setAccessible(true); //判斷實(shí)體類(lèi)屬性跟特定字段集合名是否一樣 if (field.getName().equals(prop)) { T object = (T) field.get(obj); //獲取屬性對(duì)應(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) { // 簡(jiǎn)單設(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)文章
Dapr在Java中的服務(wù)調(diào)用實(shí)戰(zhàn)過(guò)程詳解
這篇文章主要為大家介紹了Dapr在Java中的服務(wù)調(diào)用實(shí)戰(zhàn)過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Springboot實(shí)現(xiàn)對(duì)配置文件中的明文密碼加密詳解
我們?cè)赟pringBoot項(xiàng)目當(dāng)中,會(huì)把數(shù)據(jù)庫(kù)的用戶名密碼等配置直接放在yaml或者properties文件中,這樣維護(hù)數(shù)據(jù)庫(kù)的密碼等敏感信息顯然是有一定風(fēng)險(xiǎn)的。所以本文為大家整理了對(duì)配置文件中的明文密碼加密的方法,希望對(duì)大家有所幫助2023-03-03Mybatis中resultMap標(biāo)簽和sql標(biāo)簽的設(shè)置方式
這篇文章主要介紹了Mybatis中resultMap標(biāo)簽和sql標(biāo)簽的設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Java中JDK動(dòng)態(tài)代理的超詳細(xì)講解
JDK 的動(dòng)態(tài)代理是基于攔截器和反射來(lái)實(shí)現(xiàn)的,JDK代理是不需要第三方庫(kù)支持的,只需要JDK環(huán)境就可以進(jìn)行代理,下面這篇文章主要給大家介紹了關(guān)于Java中JDK動(dòng)態(tài)代理的超詳細(xì)講解,需要的朋友可以參考下2022-10-10