EasyExcel 对于不定长Excel表头(动态表头)的处理

需求

最近在做公司自己的工作流项目,不同的项目-业务 除开固定字段,都可自定义不同的字段以便不同的业务处理不同的工作流,其中关于报表的excel导出时,要求除开必要的字段,还需要导出自定义所需的字段。
EasyExcel 对于不定长Excel表头(动态表头)的处理_第1张图片

下面这些是自定义字段
EasyExcel 对于不定长Excel表头(动态表头)的处理_第2张图片
选择字段
EasyExcel 对于不定长Excel表头(动态表头)的处理_第3张图片
会拼接在视图后面
EasyExcel 对于不定长Excel表头(动态表头)的处理_第4张图片

官方文档例子

/**
 * 动态头,实时生成头写入
 * 

* 思路是这样子的,先创建List头格式的sheet仅仅写入头,然后通过table 不写入头的方式 去写入数据 * *

* 1. 创建excel对应的实体对象 参照{@link DemoData} *

* 2. 然后写入table即可 */ @Test public void dynamicHeadWrite() { String fileName = TestFileUtil.getPath() + "dynamicHeadWrite" + System.currentTimeMillis() + ".xlsx"; EasyExcel.write(fileName) // 这里放入动态头 .head(head()).sheet("模板") // 当然这里数据也可以用 List> 去传入 .doWrite(data()); } private List<List<String>> head() { List<List<String>> list = new ArrayList<List<String>>(); List<String> head0 = new ArrayList<String>(); head0.add("字符串" + System.currentTimeMillis()); List<String> head1 = new ArrayList<String>(); head1.add("数字" + System.currentTimeMillis()); List<String> head2 = new ArrayList<String>(); head2.add("日期" + System.currentTimeMillis()); list.add(head0); list.add(head1); list.add(head2); return list; }

业务实现

通过EasyExcel的官方文档中 动态头,实时生成头写入实现

public ByteArrayOutputStream export(WorkSearch search) {
        search.setCurrentPage(EXPORT_START_ROW);
        search.setPageSize(EXPORT_MAX_SIZE);

        PageVO<BtWorkDTO> page = list(search);
        List<BtWorkDTO> pageData = page.getPageData();

        //动态头   BASE_DYNAMIC_HEAD:固定展示字段(类型为List>)
        List<List<String>> dynamicHeadList = new ArrayList<>(BASE_DYNAMIC_HEAD);
        //每行的数据集
        List<List<String>> rowDataList = new ArrayList<>();

        //选择展示的自定义字段
        String defFieldIdStr = search.getDefFieldIdStr();
        if (StringUtil.isNotBlank(defFieldIdStr)) {
            //用户选择的所需导出的自定义字段
            List<BtBizDefFieldDTO> defFieldList = btBizDefFieldService.listByIds(defFieldIdStr);
            defFieldList.forEach(item -> dynamicHeadList.add(Collections.singletonList(item.getName())));
        }
        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        if (!pageData.isEmpty()) {
            pageData.forEach(data -> {
                List<String> eachRowData = new ArrayList<>();

                //基础表头信息添加
                for (List<String> baseHeadSingle : BASE_DYNAMIC_HEAD) {
                    String baseHead = baseHeadSingle.get(0);
                    addRowBaseVal(baseHead, eachRowData, data);
                }

                //选择的自定义字段值列表
                List<BtWorkFieldDTO> workFieldList = data.getWorkFieldList();
                if (Objects.nonNull(workFieldList) && !workFieldList.isEmpty()) {
                    //自定义字段的 字段名称-自定义字段值 映射的Map
                    Map<String, String> fieldName4ValueMap = workFieldList.stream().collect(HashMap::new, (m, v) -> m.put(v.getFieldName(), v.getValue()), HashMap::putAll);

                    for (List<String> dynamicHead : dynamicHeadList) {
                        String head = dynamicHead.get(0);
                        if (BASE_DYNAMIC_HEAD.contains(dynamicHead)) {
                            continue;
                        }
                        eachRowData.add(mustHaveValue(fieldName4ValueMap.get(head)));
                    }
                }
                rowDataList.add(eachRowData);
            });
        }

        //.head() 动态头
        EasyExcel.write(bos).excelType(ExcelTypeEnum.XLSX).head(dynamicHeadList).sheet("default").doWrite(rowDataList);
        return bos;
    }

效果

实现结果
EasyExcel 对于不定长Excel表头(动态表头)的处理_第5张图片
EasyExcel 对于不定长Excel表头(动态表头)的处理_第6张图片

官方文档参考

https://alibaba-easyexcel.github.io/quickstart/write.html

你可能感兴趣的:(Java基础知识,框架,java)