java动态渲染列导出以及分页列表

1.查询方法

java 复制代码
    @Override
    public DishAppStallPersonnelPageBaseVo pageList(Page<DishAppStallPersonnelPageVo> page, DishAppStallPersonnelPageDto pageDto) {
        // 获取已绑定的收银门店集合
        Map<String, MutablePair<String, StoreInfoListVO>> storeMap = getStoreIds();
        List<BaseAttributesJsonVo> stallList = this.infoService.getAttributesList(List.of(), DishInfoTypeEnum.DISH_INFO_STALL.getCode());
        // 校验是否有新增门店
        this.checkStallPersonnelStore(stallList, storeMap);
        // 获取门店id集合
        List<String> storeIds = StrUtil.isNotBlank(pageDto.getKeyword()) ? storeMap.entrySet().stream().filter(entry ->
                entry.getKey().contains(pageDto.getKeyword())).map(entry -> entry.getValue().getLeft()).collect(Collectors.toList())
                : new ArrayList<>(storeMap.values().stream().map(MutablePair::getLeft).collect(Collectors.toList()));
        Page<DishAppStallPersonnelPageVo> pageList = baseMapper.getPageList(page, storeIds);
        if (CollUtil.isEmpty(pageList.getRecords())) {
            return DishAppStallPersonnelPageBaseVo.builder()
                    .isStall(CollUtil.isEmpty(stallList) ? 0 : 1)
                    .pageList(CultivatePage.coverPageList(page))
                    .build();
        }
        // 设置档口人员列表
        pageList.getRecords().forEach(pageListVo -> {
            pageListVo.setStallPersonnelList(JSON.parseArray(pageListVo.getStallPersonnelJson(), BaseAttributesJsonVo.class));
        });
        //处理每条数据的长度不一样,要处理成一样的,并且保证顺序一致
        processStallPointData(stallList, pageList.getRecords(), storeMap);
        return DishAppStallPersonnelPageBaseVo.builder()
                .isStall(CollUtil.isEmpty(stallList) ? 0 : 1)
                .pageList(CultivatePage.coverPageList(pageList))
                .build();
    }



public void export(HttpServletResponse response, DishAppStallPersonnelPageDto pageDto) {
        // 获取已绑定的收银门店集合
        Map<String, MutablePair<String, StoreInfoListVO>> storeMap = getStoreIds();
        // 获取获取系统最新档口数据集合(动态渲染列)
        List<BaseAttributesJsonVo> stallList = this.infoService.getAttributesList(List.of(), DishInfoTypeEnum.DISH_INFO_STALL.getCode());
        // 校验是否有新增门店
        this.checkStallPersonnelStore(stallList, storeMap);
        // 获取门店id集合
        List<String> storeIds = StrUtil.isNotBlank(pageDto.getKeyword()) ? storeMap.entrySet().stream().filter(entry ->
                entry.getKey().contains(pageDto.getKeyword())).map(entry -> entry.getValue().getLeft()).collect(Collectors.toList())
                : new ArrayList<>(storeMap.values().stream().map(MutablePair::getLeft).collect(Collectors.toList()));
        List<DishAppStallPersonnelPageVo> summaryVoList = this.baseMapper.getDataList(storeIds);
        if (CollUtil.isNotEmpty(summaryVoList)) {
            // 设置档口人员列表
            summaryVoList.forEach(pageListVo -> {
                pageListVo.setStallPersonnelList(JSON.parseArray(pageListVo.getStallPersonnelJson(), BaseAttributesJsonVo.class));
            });
        }
        //处理每条数据的长度不一样,要处理成一样的,并且保证顺序一致
        processStallPointData(stallList, summaryVoList, storeMap);
        //获取动态表头
        List<List<String>> list = new ArrayList<>();
        list.add(Collections.singletonList("门店名称"));
        List<List<String>> headers = EasyExcelUtil.getHeaders(stallList, list);
        //获取动态数据
        List<List<Object>> dataList = EasyExcelUtil.getDataList(summaryVoList);
        EasyExcelUtil.rankingExportData(dataList, headers, "档口人员数据", "档口人员数据表", response);
    }

2.处理动态列数据

java 复制代码
 /**
     * 处理每条数据的长度不一样,要处理成一样的,并且保证顺序一致
     *
     * @param attributesJsonVos 档口集合
     * @param pageListVoList    待处理数据
     * @param storeMap          门店集合
     */
    private void processStallPointData(List<BaseAttributesJsonVo> attributesJsonVos, List<DishAppStallPersonnelPageVo> pageListVoList, Map<String, MutablePair<String, StoreInfoListVO>> storeMap) {
        //获取所有技能点,并且按照sort字段排序
        List<BaseAttributesJsonVo> sortedStallList = attributesJsonVos.stream().sorted(Comparator.comparing(BaseAttributesJsonVo::getSort)).collect(Collectors.toList());
        LinkedHashMap<String, BaseAttributesJsonVo> skillCountVoMap = sortedStallList.stream().collect(Collectors.toMap(BaseAttributesJsonVo::getName, baseAttributesJsonVo -> baseAttributesJsonVo, (k1, k2) -> k1, LinkedHashMap::new));
        Map<String, BaseAttributesJsonVo> skillCountMap;
        Map<String, StoreInfoListVO> storeInfoMap = storeMap.values().stream().collect(Collectors.toMap(MutablePair::getLeft, MutablePair::getRight));
        for (DishAppStallPersonnelPageVo pageListVo : pageListVoList) {
            skillCountMap = pageListVo.getStallPersonnelList().stream().collect(Collectors.toMap(BaseAttributesJsonVo::getName, attributesJsonVo -> attributesJsonVo, (k1, k2) -> k1));
            Map<String, BaseAttributesJsonVo> baseAttributesJsonVoMap = skillCountMap;
            List<BaseAttributesJsonVo> attributesJsonVoList = new LinkedList<>();
            skillCountVoMap.forEach((name, skillCountVo) -> {
                if (baseAttributesJsonVoMap.containsKey(name)) {
                    attributesJsonVoList.add(baseAttributesJsonVoMap.get(name));
                } else {
                    attributesJsonVoList.add(BaseAttributesJsonVo.builder()
                            .id(skillCountVo.getId())
                            .sort(skillCountVo.getSort())
                            .name(skillCountVo.getName())
                            .value(null).build());
                }
            });
            pageListVo.setStallPersonnelList(attributesJsonVoList);
            pageListVo.setStoreName(storeInfoMap.get(pageListVo.getStoreId()).getName());
        }
    }

3.导出工具类

java 复制代码
package com.fantaibao.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.http.Header;
import cn.idev.excel.EasyExcel;
import cn.idev.excel.util.ListUtils;
import com.fantaibao.handler.CustomCellStyleHandler;
import com.fantaibao.handler.CustomCellWriteHandler;
import com.fantaibao.handler.CustomRowHeightHandler;
import com.fantaibao.module.vo.appDish.BaseAttributesJsonVo;
import com.fantaibao.module.vo.appDish.DishAppStallPersonnelPageVo;
import org.apache.poi.ss.usermodel.*;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;

/**
 * easyExcel导入导出工具类
 * @author yier
 */

public class EasyExcelUtil {
    /**
     * 获取动态表头
     * @param stallList 数据集合
     * @param list 已存在的动态表头
     * @return 返回动态表头
     */
    public static List<List<String>> getHeaders(List<BaseAttributesJsonVo> stallList, List<List<String>> list) {
        if (CollUtil.isNotEmpty(stallList) && CollUtil.isNotEmpty(stallList)) {
            for (BaseAttributesJsonVo baseAttributesJsonVo : stallList) {
                List<String> head = new ArrayList<>();
                head.add(baseAttributesJsonVo.getName());
                list.add(head);
            }
        }
        return list;
    }

    /**
     * 获取表内容数据
     * @param dataList 数据集合
     * @return 表内容数据
     */
    public static List<List<Object>> getDataList(List<DishAppStallPersonnelPageVo> dataList) {
        List<List<Object>> list = ListUtils.newArrayList();
        if (CollUtil.isNotEmpty(dataList)) {
            for (DishAppStallPersonnelPageVo rankingDTO : dataList) {
                List<Object> data = ListUtils.newArrayList();
                data.add(rankingDTO.getStoreName());
                if (CollUtil.isNotEmpty(rankingDTO.getStallPersonnelList())) {
                    for (BaseAttributesJsonVo skillCountVo : rankingDTO.getStallPersonnelList()) {
                        data.add(Objects.nonNull(skillCountVo.getValue()) ? skillCountVo.getValue() : "");
                    }
                }
                list.add(data);
            }
        }
        return list;
    }

    /**
     * 导出排行榜数据
     *
     * @param list      导出数据
     * @param headers   表头
     * @param fileName  导出文件名称
     * @param sheetName sheet名称
     * @param response  响应对象
     * @throws Exception 抛出异常
     */
    public static void rankingExportData(List<List<Object>> list, List<List<String>> headers, String fileName,
                                         String sheetName, HttpServletResponse response) throws Exception {
        EasyExcelUtil.export(response, fileName + ".xlsx", sheetName, list, headers);
    }

    /**
     * Excel导出功能(根据自定义表头)
     *
     * @param response  响应数据
     * @param fileName  文件名
     * @param sheetName sheet名
     * @param list      数据列表
     * @param headers   表头集合
     */
    public static void export(HttpServletResponse response, String fileName, String sheetName,
                              List<List<Object>> list, List<List<String>> headers) throws Exception {
        ServletOutputStream outputStream = response.getOutputStream();
        response.setCharacterEncoding("utf-8");
        response.setHeader(Header.CONTENT_DISPOSITION.toString(), "attachment; filename=".concat(URLEncoder.encode(fileName, StandardCharsets.UTF_8)));
        response.setContentType("application/octet-stream");
        EasyExcel.write(outputStream)
                .head(headers)
                .sheet(sheetName)
                .registerWriteHandler(new CustomRowHeightHandler())
                .registerWriteHandler(new CustomCellStyleHandler())
                .registerWriteHandler(new CustomCellWriteHandler())
                .doWrite(list);
    }

    /**
     * 导入Excel,返回列表形式的数据
     *
     * @param inputStream Excel文件流
     * @return List<List < String>> 二维列表,第一行是表头,后续行是数据
     */
    public static List<List<String>> importExcel(InputStream inputStream) {
        List<List<String>> data = new ArrayList<>();
        try {
            Workbook workbook = WorkbookFactory.create(inputStream);
            Sheet sheet = workbook.getSheetAt(0);
            Iterator<Row> rowIterator = sheet.iterator();
            while (rowIterator.hasNext()) {
                Row row = rowIterator.next();
                List<String> rowData = new ArrayList<>();
                Iterator<Cell> cellIterator = row.cellIterator();
                while (cellIterator.hasNext()) {
                    Cell cell = cellIterator.next();
                    rowData.add(getCellStringValue(cell));
                }
                data.add(rowData);
            }
            workbook.close();
        } catch (Exception e) {
            throw new RuntimeException("导入Excel失败: " + e.getMessage(), e);
        }
        return data;
    }

    /**
     * 获取单元格的字符串值
     */
    private static String getCellStringValue(Cell cell) {
        if (cell == null) {
            return "";
        }
        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue().trim();
            case NUMERIC:
                double value = cell.getNumericCellValue();
                if (value == (long) value) {
                    return String.valueOf((long) value);
                } else {
                    return String.valueOf(value);
                }
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                try {
                    return cell.getStringCellValue();
                } catch (Exception e) {
                    return String.valueOf(cell.getNumericCellValue());
                }
            default:
                return "";
        }
    }

    /**
     * 将Excel数据转换为Map列表格式
     */
    public static List<Map<String, String>> convertToMapList(List<List<String>> excelData) {
        if (excelData == null || excelData.isEmpty()) {
            return new ArrayList<>();
        }
        List<Map<String, String>> result = new ArrayList<>();
        // 第一行是表头
        List<String> headers = excelData.get(0);
        for (int i = 1; i < excelData.size(); i++) {
            List<String> rowData = excelData.get(i);
            Map<String, String> rowMap = new HashMap<>();
            for (int j = 0; j < headers.size(); j++) {
                String header = headers.get(j);
                String value = j < rowData.size() ? rowData.get(j) : "";
                rowMap.put(header, value);
            }
            result.add(rowMap);
        }
        return result;
    }
}
相关推荐
星火开发设计2 小时前
共用体 union:节省内存的特殊数据类型
java·开发语言·数据库·c++·算法·内存
2301_803554522 小时前
阻塞,非阻塞,同步,异步以及linux上的5种IO模型阻塞,非阻塞,信号驱动,异步,IO复用
java·服务器·网络
仰望星空_Star2 小时前
Java证书操作
java·开发语言
河北小博博2 小时前
分布式系统稳定性基石:熔断与限流的深度解析(附Python实战)
java·开发语言·python
岳轩子2 小时前
JVM Java 类加载机制与 ClassLoader 核心知识全总结 第二节
java·开发语言·jvm
J_liaty2 小时前
Spring Boot + MinIO 文件上传工具类
java·spring boot·后端·minio
2601_949613022 小时前
flutter_for_openharmony家庭药箱管理app实战+药品详情实现
java·前端·flutter
木井巳2 小时前
【递归算法】求根节点到叶节点数字之和
java·算法·leetcode·深度优先
没有bug.的程序员2 小时前
Spring Boot 事务管理:@Transactional 失效场景、底层内幕与分布式补偿实战终极指南
java·spring boot·分布式·后端·transactional·失效场景·底层内幕