当前位置: 首页 > news >正文

EasyExcel 自定义头信息导出

需求:需要在导出 excel时,合并单元格自定义头信息(动态生成),然后才是字段列表头即导出数据。

EasyExcel - 使用table去写入:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write#%E4%BD%BF%E7%94%A8table%E5%8E%BB%E5%86%99%E5%85%A5

一、代码实现

1、查询导出数据

1.1 导出实体类

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.converters.localdatetime.LocalDateTimeStringConverter;
import lombok.Data;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 用户信息 导出DTO
 */
@Data
@ExcelIgnoreUnannotated
public class UserExportExcelDTO implements Serializable {
    private static final long serialVersionUID = -5255117385546252447L;

    /**
     * 用户ID
     */
    @ExcelIgnore
    private Long userId;

    /**
     * 用户名
     */
    @ExcelProperty(value = "用户名")
    private String username;

    /**
     * 年龄
     */
    @ExcelProperty(value = "年龄")
    private Integer age;

    /**
     * 电话号码
     */
    @ExcelProperty(value = "电话号码")
    private String phone;

    /**
     * 昵称
     */
    @ExcelProperty(value = "昵称")
    private String nickname;

    /**
     * 姓名
     */
    @ExcelProperty(value = "姓名")
    private String name;

    /**
     * 创建时间
     * 使用 converter或者 @DateTimeFormat格式化时间,如果两者同时使用,@DateTimeFormat优先级高
     */
    @ExcelProperty(value = "创建时间", converter = LocalDateTimeStringConverter.class) // yyyy-MM-dd HH:mm:ss
    @DateTimeFormat("yyyy年MM月dd日")
    private LocalDateTime createTime;

}

1.2 查询导出数据方法

    @Override
    public List<UserExportExcelDTO> listExportExcelData(UserPageQueryRequest pageRequest) {
        pageRequest.setCurrentPage(1L);
        pageRequest.setPageSize((long) Integer.MAX_VALUE);
        BasePageResult<UserPageDTO> basePageResult = pageQuery(pageRequest);
        if(!basePageResult.isSuccess()){
            return Collections.EMPTY_LIST;
        }
        return basePageResult.getPageList().stream().map(userPageDTO -> {
            UserExportExcelDTO exportExcelDTO = new UserExportExcelDTO();
            BeanUtils.copyProperties(userPageDTO, exportExcelDTO);
            return exportExcelDTO;
        }).collect(Collectors.toList());
    }

2、EasyExcel使用 table写入

    /**
     * 用户导出接口
     *
     * @param pageRequest 分页查询请求体
     */
    @SneakyThrows
    @ApiOperation(value = "用户导出接口")
    @GetMapping("/exportExcel")
    public void exportExcel(HttpServletResponse response, @RequestBody UserPageQueryRequest pageRequest) {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode("用户信息", StandardCharsets.UTF_8.name()).replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

        // 查询导出数据
        List<UserExportExcelDTO> exportExcelDataList = userService.listExportExcelData(pageRequest);

        // 自定义头信息
        StringBuilder headName = new StringBuilder();
        LocalDateTime startTime = pageRequest.getCreateTimeStart();
        LocalDateTime endTime = pageRequest.getCreateTimeEnd();
        if (startTime != null && endTime != null) {
            String startTimeStr = LocalDateTimeUtil.format(startTime, DatePattern.CHINESE_DATE_PATTERN);
            String endTimeStr = LocalDateTimeUtil.format(endTime, DatePattern.CHINESE_DATE_PATTERN);
            headName.append(startTimeStr).append("至").append(endTimeStr);
        }
        headName.append("时间段的用户信息");

        List<List<String>> headList = new ArrayList<>();
        List<String> head = new ArrayList<>();
        head.add(headName.toString());
        headList.add(head);

        /**
         * 创建 ExcelWriter
         * 1.创建写入的工作表,不需要表头。命名为"sheet1"。
         */
        ExcelWriter excelWriter = null;
        try {
            excelWriter = EasyExcelFactory.write(response.getOutputStream()).build();
        } catch (IOException e) {
            log.error("导出车辆在线率统计异常:e=", e);
        }
        WriteSheet writeSheet = EasyExcel.writerSheet("sheet1").needHead(Boolean.FALSE).build();

        /**
         * 2.创建并写入表格数据,设置表头为 headList,需要表头。
         * tableNo:表格序号,从0开始。
         * OnceAbsoluteMergeStrategy:创建一个合并单元格策略。
         */
        WriteTable writeTable1 = EasyExcel.writerTable(0)
                .head(headList)
                .registerWriteHandler(new OnceAbsoluteMergeStrategy(0, 2, 0, 5))
                .needHead(Boolean.TRUE)
                .build();
        // 写入空数据到 writeSheet
        excelWriter.write(new ArrayList<>(), writeSheet, writeTable1);

        /**
         * 3.创建写入表格,基于AnysCarOfflineStatisticsVo类定义表头,需要表头。
         * writerTable(3):因为 writeTable1从0开始,并合并了 3行,所以 writeTable2是从第4个行(tableNo = 3)开始写入。
         * SimpleColumnWidthStyleStrategy:设置列宽策略
         */
        WriteTable writeTable2 = EasyExcel.writerTable(3)
                .head(UserExportExcelDTO.class)
                .registerWriteHandler(new SimpleColumnWidthStyleStrategy(25))
                .relativeHeadRowIndex(2)
                .needHead(Boolean.TRUE)
                .build();
        // 写入导出数据到 writeSheet
        excelWriter.write(exportExcelDataList, writeSheet, writeTable2);
        excelWriter.finish();
    }

3、导出结果

在这里插入图片描述

– 求知若饥,虚心若愚。

相关文章:

  • OpenVela——专为AIoT领域打造的开源操作系统
  • 分布式同步锁:原理、实现与应用
  • 交换路由——控制VLAN之间通信
  • axios post请求 接收sse[eventsource]数据的
  • Go 语言函数返回对象 vs 传递指针赋值:性能对比与最佳实践
  • 深入解析 Flutter 性能优化:从原理到实践
  • 【Java学习】继承
  • 使用nvm管理node.js版本,方便vue2,vue3开发
  • ROS-相机话题-获取图像-颜色目标识别与定位-目标跟随-人脸检测
  • Django 5 实用指南(一)安装与配置
  • 数据结构——哈希表
  • Superset配置Report Alert实践及二次开发实践
  • 析言GBI:用自然语言交互重构企业数据分析范式
  • python自动化制作常规的日报数据可视化
  • DeepSeek大模型思考与初探
  • StableDiffusion+ComfyUI
  • 【MySQL排错 】mysql: command not found 数据库安装后无法加载的解决办法
  • java_使用Spring Cloud Gateway + nacos实现跨域访问
  • 太空飞船任务,生成一个地球发射、火星着陆以及下一次发射窗口返回地球的动画3D代码
  • 数据结构:哈希表(二)
  • 市自规局公告收回新校区建设用地,宿迁学院:需变更建设主体
  • 融创中国:今年前4个月销售额约112亿元
  • 青岛双星名人集团管理权之争:公司迁址,管理层更迭
  • “20后”比“60后”更容易遭遇极端气候事件
  • 超燃!走过莫斯科街头的“中国排面”
  • 打造多元文旅消费场景,第四届长三角城市戏剧节启幕