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

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、导出结果

在这里插入图片描述

– 求知若饥,虚心若愚。


http://www.kler.cn/a/553203.html

相关文章:

  • Linux-GlusterFS进阶分布式卷
  • 华为最新OD机试真题-通过软盘拷贝文件-Python-OD统一考试(E卷)
  • Vision Transformer图像分类实现
  • Activity 任务栈 taskAffinity 用法
  • 【机器学习与数据挖掘实战】案例14:基于随机森林分类器的汽车公司客户细分预测
  • CMU 15-445 23Fall Lab 总结
  • ​33页PDF | 基于数字化转型的数据指标与标签体系应用架构设计方案
  • JavaScript 前端面试 4(作用域链、this)
  • 【nodejs+mysql2+docker】node后端开发+docker部署简记
  • 让大模型帮我设计crnn网络及可运行demo,gpt4o豆包qwendeepseek-r1
  • jenkins+docker自动发版java后端完整流程
  • draggable+el-tag 拖动元素有div宽度抖动问题
  • pycharm画图程序如何一步一步的调试
  • 技术分享:MyBatis SQL 日志解析脚本
  • Discuz! X3.5 根目录权限设置
  • 软件开源与AI开源的区别
  • Shapr3D在ipad上无法识别鼠标点击问题
  • 机器翻译中的编码器、自注意和解码器
  • 6.编写正排索引切分字符串|倒排索引原理|引入jieba到项目(C++)
  • 树(数据结构·)