导出excel按动态表头导出

本文介绍了如何使用JavaMap结构在代码中操作head头,实现导出资源计划发车明细数据到Excel,包括数据处理、转换和日期格式化。核心部分是将ResourcePlanShipDetailVO对象转换成包含月份数据的Map结构并整理输出。
摘要由CSDN通过智能技术生成

一、实现代码 使用Map方式添加head头,对应填充值

  /**
     * 导出查看发车明细
     * @param query
     * @return
     */
    @Override
    public ExportResult monthResourcePlanDepartureProgressDetailsExportExcelData(ResourceSituationListQuery query) {
        log.info("导出参数:{}",DstJsonUtil.toString(query));
        //List<ResourcePlanShipDetailVO> shipDetail = resourcePlanService.getShipDetail(query);
        List<ResourcePlanShipDetailVO> shipDetail = resourceSituationCoreService.getCodData();
        if (CollectionUtils.isEmpty(shipDetail)) {
            log.error("导出数据为空");
            return null;
        }
        List<String> dispatchDate = new ArrayList<>();
        shipDetail.stream().forEach(e->{
            e.getShipDetails().stream().forEach(it->{
                dispatchDate.add(DstDateUtil.format(it.getDispatchDate(),DstDateUtil.Y_M_D));
            });
        });
        List<String> newDispatchDate = Lists.newArrayList(new HashSet(dispatchDate));
        List<String> newDispatchDateList = newDispatchDate.stream().sorted().collect(Collectors.toList());
        List<String> monthAndDays = new ArrayList<>();
        for (String date : newDispatchDateList) {
            monthAndDays.add(date);
        }
        List<String> headers = new ArrayList<String>() {
            {
                add("数据类型");
                add("资源情况编码");
                add("关联发车计划编码");
                add("大区城市");
                add("车辆品牌(属性)");
                add("车辆型号(属性)");
                add("车型族群(属性)");
                add("电池包度数(属性)");
                add("电池包厂商(属性)");
                add("车辆用途(属性)");
                add("发车总数");
                addAll(monthAndDays);
            }
        };
        List<String> columns = new ArrayList<String>() {
            {
                add("dataType");
                add("resourceSituationCode");
                add("shipCode");
                add("cityName");
                add("carBrandName");
                add("carModelName");
                add("carModelGroupName");
                add("esdTotalPowerName");
                add("esdCompanyName");
                add("vehicleUseName");
                add("needShipCountTotal");
                addAll(monthAndDays);
            }
        };
        List<Map<String, Object>> mapDatas = new ArrayList<>();
        shipDetail.forEach(p -> {
            mapDatas.add(converItemToMap(p,1,monthAndDays));
            mapDatas.add(converItemToMap(p,2,monthAndDays));

        });
        return ExportResult.wrap(headers, columns, mapDatas, 1);
    }

二、核心转换方法

/**
     * @Description 转换map
     * @Param item type 1:计划发车 2:实际发车
     * @Return java.util.Map<java.lang.String,java.lang.Object>
     * @Date 2024/3/12 18:59
     * @Author lwp
     */
    private Map<String,Object> converItemToMap(ResourcePlanShipDetailVO item,Integer type,List<String> monthAndDays){
        Map<String,Object> temp =new HashMap<>();
        String dataType = type == 1 ? "计划发车" :"实际发车";
        Integer needShipCountTotal = type == 1 ? item.getTotalAssignCount() : item.getTotalShipCount();
        temp.put("dataType", dataType);
        temp.put("resourceSituationCode",item.getResourceSituationCodes());
        temp.put("shipCode",item.getShipCodes());
        temp.put("cityName",item.getFullCityName());
        temp.put("carBrandName",item.getCarBrandName());
        temp.put("carModelName",item.getCarModelName());
        temp.put("carModelGroupName",item.getCarModelGroupName());
        temp.put("esdTotalPowerName",item.getEsdTotalPowerName());
        temp.put("esdCompanyName",item.getEsdCompanyName());
        temp.put("vehicleUseName",item.getVehicleUseName());
        temp.put("needShipCountTotal",needShipCountTotal);
        item.setShipDetails(item.getShipDetails().stream().sorted(Comparator.comparing(AssignDetailVO::getDispatchDate))
                .collect(Collectors.toList()));
        for (String monthAndDay : monthAndDays) {
            A: for (AssignDetailVO shipDetail : item.getShipDetails()) {
                String dispatchDate = DstDateUtil.format(shipDetail.getDispatchDate(), DstDateUtil.Y_M_D);
                if (dispatchDate.equals(monthAndDay)) {
                    temp.put(monthAndDay, type == 1 ? shipDetail.getDispatchNum() : shipDetail.getShipCount());
                    break A;
                } else {
                    temp.put(monthAndDay, type == 1 ? 0 : 0);
                }
            }
        }
        temp = MapUtils.sortMapByKey(temp);
        return temp;
    }

三、导出实体类

package com.dst.steed.fulfillment.common.domain.biz.resourceplan;

import com.dst.steed.common.convert.translation.Translation;
import lombok.Data;

import java.util.List;

/**
 * 资源计划发车明细
 */
@Data
public class ResourcePlanShipDetailVO {

    /**
     * 资源情况编码
     */
    private String resourceSituationCodes;

    /**
     * 发车计划编码
     */
    private String shipCodes;

    /**
     * 城市编码
     */
    @Translation(convertName = "convertRegionAndCityName", convertTo = "fullCityName")
    private String cityCode;

    /**
     * 城市名称
     */
    private String fullCityName;

    /**
     * 车辆品牌
     */
    @Translation(convertName = "commonConvertAttrValueIdMapValue",convertTo = "attrValueName-carBrandName")
    private String carBrand;
    private String carBrandName;

    /**
     * 车辆型号
     */
    @Translation(convertName = "commonConvertAttrValueIdMapValue",convertTo = "attrValueName-carModelName")
    private String carModel;
    private String carModelName;

    /**
     * 车型族群
     */
    @Translation(convertName = "commonConvertAttrValueIdMapValue",convertTo = "attrValueName-carModelGroupName")
    private String carModelGroup;
    private String carModelGroupName;

    /**
     * 动力电池包电量
     */
    @Translation(convertName = "commonConvertAttrValueIdMapValue",convertTo = "attrValueName-esdTotalPowerName")
    private String esdTotalPower;
    private String esdTotalPowerName;

    /**
     * 动力电池包厂商
     */
    @Translation(convertName = "commonConvertAttrValueIdMapValue",convertTo = "attrValueName-esdCompanyName")
    private String esdCompany;
    private String esdCompanyName;

    /**
     * 资产分类
     */
    @Translation(convertName = "commonConvertAttrValueIdMapValue",convertTo = "attrValueName-assetClassifyName")
    private String assetClassify;
    private String assetClassifyName;

    /**
     * 车辆用途
     */
    @Translation(convertName = "commonConvertAttrValueIdMapValue",convertTo = "attrValueName-vehicleUseName")
    private String vehicleUse;
    private String vehicleUseName;

    /**
     * 发车总计-计划发车量
     */
    private Integer totalAssignCount;

    /**
     * 发车总计-已发车量
     */
    private Integer totalShipCount;

    /**
     * 发车总计-剩余量
     */
    private Integer totalResidueCount;

    /**
     * 发车明细
     */
    private List<AssignDetailVO> shipDetails;
}

实体类属性明细类

package com.dst.steed.fulfillment.common.domain.biz.resourceplan;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.util.Date;

/**
 * 分配详情VO
 */
@Data
public class AssignDetailVO {

    /**
     * 中心分配ID
     */
    private String id;

    /**
     * 分配类型 1. 中心分配 2. 大区分配
     */
    private Integer referenceType;

    /**
     * 发车日期
     */
    @JsonFormat(pattern = "M月d日", timezone = "GMT+8")
    private Date dispatchDate;

    /**
     * 中心分配发车数量
     */
    private Integer centerDispatchNum;

    /**
     * 城市计划发车数量
     */
    private Integer dispatchNum;

    /**
     * 实际发车数量(发车明细字段)
     */
    private Integer shipCount;
}

四、展示效果

以有数据的日期展示导出头

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java 导出 Excel 时,动态表头的实现方式可以有很多种。 一种常见方式是,在导出 Excel 前就确定好表头的内容,并且将表头内容存储在一个数组或者列表里。根据这个数组或列表,我们可以动态地设置 Excel表头。 另一种方式是,在导出 Excel 时根据数据动态生成表头。这通常需要对数据进行预处理或者整理,以确定 Excel 表头的内容。 无论采用哪种方式,Java 导出 Excel 的核心思路是基于 POI 库。POI 是一个开源的 Java Excel API,它允许我们在 Java 应用程序中创建、读取和修改 Excel 文件。 具体实现时,可以使用 POI 提供的 XSSFWorkbook、Sheet 和 Row 等类和方法,来创建 Excel 表头和单元格,并填充数据。同时,还可以通过设置单元格和单元格样式,来实现格式控制和美化。 在其中一个实现方式中,代码大概会长这个样子: // 创建一个新的 Excel 工作簿 XSSFWorkbook workbook = new XSSFWorkbook(); // 创建一个新的 Sheet XSSFSheet sheet = workbook.createSheet("Sheet1"); // 创建表头内容数组 String[] headers = {"序号", "姓名", "年龄", "性别"}; // 创建表头行 XSSFRow headerRow = sheet.createRow(0); for (int i = 0; i < headers.length; i++) { // 创建单元格并设置表头内容 XSSFCell cell = headerRow.createCell(i); cell.setCellValue(headers[i]); // 设置单元格样式 XSSFCellStyle style = workbook.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); cell.setCellStyle(style); } // 填充数据 for (int i = 0; i < dataList.size(); i++) { // 创建数据行 XSSFRow dataRow = sheet.createRow(i + 1); // 获取数据对象 Data data = dataList.get(i); // 创建单元格并设置数据内容 XSSFCell cell0 = dataRow.createCell(0); cell0.setCellValue(data.getId()); XSSFCell cell1 = dataRow.createCell(1); cell1.setCellValue(data.getName()); XSSFCell cell2 = dataRow.createCell(2); cell2.setCellValue(data.getAge()); XSSFCell cell3 = dataRow.createCell(3); cell3.setCellValue(data.getSex()); // 设置单元格样式 XSSFCellStyle style = workbook.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); cell0.setCellStyle(style); cell1.setCellStyle(style); cell2.setCellStyle(style); cell3.setCellStyle(style); } // 将工作簿写入硬盘中 FileOutputStream outputStream = new FileOutputStream("data.xlsx"); workbook.write(outputStream); outputStream.close(); 总的来说,Java 导出 Excel 动态表头的实现方式多种多样,可以根据需求和场景来选择合适的方式。但无论采用哪种方式,核心思路都要基于 POI 库来进行操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值