Java如何利用Easyexcel动态导出表头列
目录
- Java利用Easyexcel动态导出表头列
- 需要定义动态导出的表头列集合
- headName 为与字段对应的表头
- 导出util类
- CellStyle()是设置的默认样式
- 导出效果
- 总结
Java利用Easyexcel动态导出表头列
需要定义动态导出的表头列集合
其中 fieldName 为要导出的字段名称 也就是 数据对象 中与之对应的字段名称
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; /** * 动态导出 exl * @author: chenjiaxiang * @create: 2023/4/11 16:20 **/ @Slf4j public class EasyExcelUtils { /** * 动态导出exl * * @param headers 要导出的头集合 * @param dataList 数据集合 */ public static <T> void dynamicExportExcel(List<ExcelHeader> headers, List&编程客栈lt;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)) //文件样式 .registerWriteHandl编程er(new CellStyle()) .sheet("sheet").doWrite(allList); } catch (IOException e) { log.error("生成动态EXL失败,字段", e); } long endTime = System.currentTimeMillis(); log.info("动态导出耗时:{}", 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 数据对编程客栈象 * @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) { //循环实体类对象集合 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); }www.devze.com }
运行代码
@PostMapping("/exlOut") public void exlOut(HttpServletResponse response) { //导出字段集合 List<ExcelHeader> excelHeaders = Arrays.asList(new ExcelHeader("phone", "手机号"), new ExcelHeader("sexStr", "性别")); //数据集合 List<GetSchoolExpertsDeriveExlVo> getSchoolAqxRvDIKwExpertsDeriveExlVos = Arrays.asList(new GetSchoolExpertsDeriveExlVo("男", "1231231"), new GetSchoolExpertsDeriveExlVo("nn", "adadad")); EasyExcelUtils.dynamicExportExcel(excelHeaders,getSchoolExpertsDeriveExlVos,response); }
导出效果
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论