开发者

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);
        }

    导出效果

    Java如何利用Easyexcel动态导出表头列

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜