Spring Boot整合EasyExcel,动态导出表头和数据

前端页面设置了列表表头 的动态查询,用户可以自己设置那些需要关注的字段,为此,后端需要保持导出的表头与前端一致。

本文介绍如何使用spring boot+easyExcel,动态导出数据。

步骤1.设置实体类

java 复制代码
@Data
public class RepairWorkOrder extends BaseEntity {
    //自增主键ID
    private Integer id;
    //工单号码
    @TableField(condition = SqlCondition.LIKE)
    private String orderNo;
	//设备SN
    @TableField(condition = SqlCondition.LIKE)
    private String deviceSn;
    //设备型号
    @TableField(condition = SqlCondition.LIKE)
    private String deviceModel;
    //设备类型
    private String deviceType;
    //工单类型(0-售后工单、1-自制工单)
    private Integer type;
  }

步骤2.设置导出实体

java 复制代码
@SuppressWarnings("serial")
@Data
@ColumnWidth(20)
public class RepairWorkOrderExportDTO {

    @ExcelProperty(value = "工单号")
    private String orderNo;
		//工单状态:0-待定性定责 1-待分配维修工程师 2-待维修测试 3-待交付 4-已完成
    @ExcelProperty(value = "工单状态")
    private String statusString;
    private Integer status;
    @ExcelProperty(value = "设备SN")
    private String deviceSn;
     //设备型号
    @ExcelProperty(value = "设备型号")
    private String deviceModel;
    //工单类型(0-售后工单、1-自制产品维修)
    @ExcelProperty(value = "工单类型")
    private String typeString;
    private Integer type;
}

步骤3.加依赖(EasyExcel Spring Boot Starter)

xml 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel-spring-boot-starter</artifactId>
    <version>3.3.2</version>
</dependency>

步骤4.动态导出工具方法

数据列表:dataList

导出表头列表:includeColumnFieldNames,这里使用LinkedHashSet,保证导出表头的顺序和传入的参数顺序一致。

响应:response

java 复制代码
    public void exportDynamicExcel(
            List<RepairWorkOrderExportDTO> dataList,
            LinkedHashSet<String> includeColumnFieldNames,
            HttpServletResponse response) throws IOException {
    
        if (ObjectUtil.isNull(dataList)) {
            throw new ValidateException("导出参数不能为空");
        }
    
        if (ObjectUtil.isEmpty(includeColumnFieldNames)) {
            throw new ValidateException("导出字段列表不能为空");
        }
    
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        String fileName = "维修工单列表_" + System.currentTimeMillis() + ".xlsx";
        response.setHeader("Content-Disposition", "attachment; filename=\"" +
            java.net.URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20") + "\"");
        try (OutputStream out = response.getOutputStream()) {
            ExcelWriterBuilder writerBuilder = EasyExcel.write(out, RepairWorkOrderExportDTO.class)
                    .includeColumnFiledNames(includeColumnFieldNames)
                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                    .registerConverter(LocalDateStringConverter.INSTANCE)   //Date日期转化工具,如无date类型可以去掉
                    .registerConverter(LocalDateTimeStringConverter.INSTANCE)  //DateTime日期转化工具,如无dateTime类型可以去掉
                    ;
    
            writerBuilder.sheet("维修工单列表").doWrite(dataList);
        } catch (Exception e) {
            log.error("导出异常", e);
            throw new ValidateException("导出异常");
        }
    }

步骤5.状态等字段翻译成文字

这里我就使用最简单的方法了,遍历然后翻译。

java 复制代码
private void translateStatus(List<RepairWorkOrderExportDTO> list) {
       if (list == null || list.isEmpty()) {
           return;
       }

       for (RepairWorkOrderExportDTO dto : list) {
           if (dto == null) {
               continue;
           }

           dto.setTypeString(dto.getType() == 0 ? Constant.type0 : Constant.type1);
           dto.setStatusString(STATUS_MAP.getOrDefault(dto.getStatus(), "未知状态"));
           Integer warrantyStatus = dto.getWarrantyStatus();
           
           String deviceType = dto.getDeviceType();
           if (deviceType != null){
               if (ServiceOrderEnum.UAV.getDescEN().equals(dto.getDeviceType())){
                   dto.setDeviceType(ServiceOrderEnum.UAV.getDesc());
               }
               if (ServiceOrderEnum.LOAD.getDescEN().equals(dto.getDeviceType())){
                   dto.setDeviceType(ServiceOrderEnum.LOAD.getDesc());
               }
               if (ServiceOrderEnum.NEST.getDescEN().equals(dto.getDeviceType())){
                   dto.setDeviceType(ServiceOrderEnum.NEST.getDesc());
               }

           }

       }
   }
相关推荐
_Evan_Yao22 分钟前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd1 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼1 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
thefool1122662 小时前
TCP 1
java·1024程序员节
paopaokaka_luck4 小时前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
金銀銅鐵4 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手4 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
paopaokaka_luck6 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_32241428046 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
考虑考虑7 小时前
JDK26的JEP 500属性
java·后端·java ee