EasyExcel 自定义头信息导出

embedded/2025/2/23 1:47:18/

需求:需要在导出 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*/@ExcelIgnoreprivate 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 查询导出数据方法

    @Overridepublic 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();// 写入空数据到 writeSheetexcelWriter.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();// 写入导出数据到 writeSheetexcelWriter.write(exportExcelDataList, writeSheet, writeTable2);excelWriter.finish();}

3、导出结果

在这里插入图片描述

– 求知若饥,虚心若愚。


http://www.ppmy.cn/embedded/164496.html

相关文章

如何成为一名合格的单片机工程师----引言介绍篇(1)

前言 在当今数字化时代&#xff0c;单片机&#xff08;Microcontroller Unit&#xff0c;MCU&#xff09;已成为电子设备的核心组件之一&#xff0c;广泛应用于智能家居、工业自动化、汽车电子、物联网等领域。作为一名单片机工程师&#xff0c;你将有机会参与到各种创新项目中…

vue2的监听属性watch

● 作用&#xff1a;当被监视的属性变化时, 回调函数&#xff08;handler&#xff09;自动调用 例&#xff1a; watch:{isHot:{handler(newValue,oldValue){ /*********/},immediate: true,deep:true,} }注意点&#xff1a; ● 被监视的可以是&#xff1a;属性&#xff08;dat…

git 克隆及拉取github项目到本地微信开发者工具,微信开发者工具通过git commit、git push上传代码到github仓库

git 克隆及拉取github项目到本地微信开发者工具&#xff0c;微信开发者工具通过git commit、git push上传代码到github仓库 git 克隆及拉取github项目到本地 先在自己的用户文件夹新建一个项目文件夹&#xff0c;取名为项目名 例如这样 C:\Users\HP\yzj-再打开一个终端页面&…

Git笔记汇总,持续更新~

Git 是一个广泛使用的分布式版本控制系统&#xff0c;以下是一些常用 Git 命令的详细介绍&#xff1a; 仓库操作 1. git init 功能&#xff1a;在当前目录下初始化一个新的 Git 仓库。用法&#xff1a; git init示例&#xff1a;在 my_project 目录下初始化一个新的 Git 仓…

哈希表-两个数的交集

代码随想录-刷题笔记 349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09; 内容: 集合的使用 , 重复的数剔除掉&#xff0c;剩下的即为交集&#xff0c;最后加入数组即可。 class Solution {public int[] intersection(int[] nums1, int[] nums2) {Set<Integer…

【分布式理论14】分布式数据库存储:分表分库、主从复制与数据扩容策略

文章目录 一、分表分库1. 数据分表的必要性与方式2. 数据分库原则与优势 二、主从复制1. 读写分离架构设计2. 数据复制方式3. MySQL实现主从复制4. MySQL主从复制实践与高可用方案 三、数据扩容 随着业务的不断发展和数据量的增长&#xff0c;传统的单机关系型数据库已经逐渐不…

UDP和TCP

UDP协议 报文中应该包含 源IP&#xff0c;源端口号目的IP&#xff0c;目的端口号UDP/TCP 一个进程是否可以绑定多个端口号&#xff1f; 可以。多个进程是否可以绑定一个端口号&#xff1f; 不可以&#xff0c;因为端口号的主要作用是唯一标识一台计算机上的一个特定服务或应…

tcp协议连接,和传输数据

1、连接 这个是通用的 2、传送数据 当连接建立后&#xff0c;客户端和服务器都可以主动发送数据&#xff0c;分别如下 1》客户端先发送数据 这里是单向的&#xff0c;服务器没有对客户端的数据内容进行应答&#xff0c;只是单纯的对报文应答ack 2》服务器先发送数据