EasyExcel 自定义头信息导出

news/2025/2/22 18:57:41/

需求:需要在导出 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/news/1574231.html

相关文章

TikTok账户安全指南:如何取消两步验证?

TikTok账户安全指南&#xff1a;如何取消两步验证&#xff1f; 在这个数字化的时代&#xff0c;保护我们的在线账户安全变得尤为重要。TikTok&#xff0c;作为全球流行的社交媒体平台&#xff0c;其账户安全更是不容忽视。两步验证作为一种增强账户安全性的措施&#xff0c;虽…

高斯积分的证明

内容来源 B站视频BV1LC4y1P7gM 高斯积分 ∫ 0 ∞ e − x 2 d x \int^\infty_0e^{-x^2}\mathcal{d}x ∫0∞​e−x2dx 添加新元 设 f ( t ) [ ∫ 0 t e − x 2 d x ] 2 f(t)\left[\int^t_0e^{-x^2}\mathcal{d}x\right]^2 f(t)[∫0t​e−x2dx]2 现目标 求 lim ⁡ t → ∞ f …

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_test_full_name

ngx_test_full_name 声明在 src\core\ngx_file.c static ngx_int_t ngx_test_full_name(ngx_str_t *name); 定义在 src\core\ngx_file.c static ngx_int_t ngx_test_full_name(ngx_str_t *name) { #if (NGX_WIN32)u_char c0, c1;c0 name->data[0];if (name->len <…

SPRING10_SPRING的生命周期流程图

经过前面使用三大后置处理器BeanPostProcessor、BeanFactoryPostProcessor、InitializingBean对创建Bean流程中的干扰,梳理出SPRING的生命周期流程图如下

✨2.快速了解HTML5的标签类型

✨✨HTML5 的标签类型丰富多样&#xff0c;每种类型都有其独特的功能和用途&#xff0c;以下是一些常见的 HTML5 标签类型介绍&#xff1a; &#x1f98b;结构标签 &#x1faad;<html>&#xff1a;它是 HTML 文档的根标签&#xff0c;所有其他标签都包含在这个标签内&am…

向 OpenAI ChatGPT 提问如何学习黑客

Ailx10 互联网行业 安全攻防员 ​目录 如何学习黑客攻击&#xff1f; 如何学习计算机网络安全&#xff1f; 如何学习渗透测试&#xff1f; 如何学习Cobalt Strike &#xff1f; OpenAI ChatGPT 是一个人工智能回答问题系统&#xff0c;最近非常火&#xff0c;以至于很多…

【Scrapy】Scrapy教程7——存储数据

上一节我们对爬虫程序的默认回调函数parse做了改写,提取的数据可以在Scrapy的日志中打印出来了,光打印肯定是不行的,还需要把数据存储,数据可以存到文件,也可以存到数据库,我们一一来看。 存储数据到文件 首先我们看看如何将数据存储到文件,在讲[[【Scrapy】Scrapy教程…

WPF 中显示图形的方式深度解析

一、引言 Windows Presentation Foundation(WPF)凭借其强大的图形渲染能力,为开发者打造美观、交互性强的桌面应用程序提供了有力支持。在 WPF 里,有多种显示图形的方式,每种方式都有独特的用途和特点。本文将详细介绍 DrawingImage、Shape、Image、GeometryDrawing、Dra…