EasyExcel导出Excel文件——合并单元格多层级数据导出

合并单元格多层数据导出

思维脑图

在这里插入图片描述

代码实现

/*** 导出所有信息** @param request 请求体*/
@Override
public void getWilliamExportList(WilliamReqVo request, HttpServletResponse response) throws Exception {List<SysDictData> dataByType = dictDataService.getDictDataByType("status");Map<String, String> calendarStatus = dataByType.stream().collect(Collectors.toMap(SysDictData::getDictValue, SysDictData::getDictLabel));List<WilliamAllExportVo> list = baseMapper.getWilliamExportData(request);if (CollectionUtils.isNotEmpty(list)) {list.forEach(s -> s.setStatus(calendarStatus.get(s.getStatus())));}// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postmanresponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("某某表" + DateUtil.format(new Date(), SysConstants.DATE_FORMAT), "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");ExcelWriterBuilder writerBuilder = EasyExcel.write(response.getOutputStream(), WilliamAllExportVo.class);//合并策略addMergeStrategy(list, writerBuilder);writerBuilder.sheet("信息表").doWrite(list);
}/*** 合并策略** @param list          数据集* @param writerBuilder excel写对象*/
private static void addMergeStrategy(List<WilliamAllExportVo> list, ExcelWriterBuilder writerBuilder) {// 第一级,选定键值进行分层准备Map<String, List<WilliamAllExportVo>> collect = list.stream().collect(Collectors.groupingBy(s -> s.getProjectSn() + s.getMonth()));Map<String, List<WilliamAllExportVo>> collect2 = list.stream().collect(Collectors.groupingBy(s -> s.getProjectSn() + s.getMonth() + s.getTitle()));//第一层合并单元格处理for (int i = 1; i < list.size(); ) {WilliamAllExportVo exportVo = list.get(i);//计算集合长度,确定有多少行int size = collect.get(exportVo.getProjectSn() + exportVo.getMonth()).size();//按照分层合并范围的属性,设置j的数值for (int j = 0; j < 10; j++) {OnceAbsoluteMergeStrategy strategy = new OnceAbsoluteMergeStrategy(i, i + size - 1, j, j);writerBuilder.registerWriteHandler(strategy);}i = i + size;}//第二层合并单元格处理,for (int i = 1; i < list.size(); ) {WilliamAllExportVo exportVo = list.get(i);int size = collect2.get(exportVo.getProjectSn() + exportVo.getMonth() + exportVo.getTitle()).size();for (int j = 10; j < 14; j++) {OnceAbsoluteMergeStrategy strategy = new OnceAbsoluteMergeStrategy(i, i + size - 1, j, j);writerBuilder.registerWriteHandler(strategy);}i = i + size;}
}

逻辑分析

1. 数据准备与状态映射

首先,通过dictDataService.getDictDataByType(“status”)获取字典数据,这通常用于将数据库中的状态码(如数字或简短字符串)转换为更加友好的展示标签。之后,使用Java 8的Stream API将这些数据转换成一个Map,键为状态值,值为状态标签,便于后续替换列表中项目的状态字段。

List<SysDictData> dataByType = dictDataService.getDictDataByType("project_calendar_status");
Map<String, String> calendarStatus = dataByType.stream().collect(Collectors.toMap(SysDictData::getDictValue, SysDictData::getDictLabel));

接着,调用baseMapper.getWilliamExportData(request)获取项目日历导出数据列表,然后遍历列表,使用前面构建的状态映射替换项目状态字段的代码值为描述文本。

2. 设置响应头及内容类型

让HTTP响应能够以Excel文件的形式下载。首先,设置了响应的内容类型为Excel的OpenXML格式,然后通过URLEncoder.encode方法对文件名进行编码,以防止中文乱码,并使用特定的Content-Disposition头部来指示浏览器以附件形式下载文件,并给出文件名。

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("某某表" + DateUtil.format(new Date(), SysConstants.DATE_FORMAT), "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

3. 使用EasyExcel导出数据

EasyExcel是一个用于简化Excel操作的Java库,它允许开发者以更简洁的方式读写Excel文件。在这里,通过EasyExcel.write(response.getOutputStream(), WilliamAllExportVo.class)初始化一个Excel写入器,然后调用addMergeStrategy方法注册合并单元格的策略,最后在指定的工作表中写入数据。

4. 单元格合并策略

addMergeStrategy方法实现了Excel表格中单元格的合并策略。这里的逻辑是首先按照编号(projectSn)和月份(month)进行第一级分组,然后在同一组内再按照标题(title)进行第二级分组,分别对不同列范围内的连续行进行合并。

对于第一级分组(第1至第9列),合并所有属于同一项目、同一月份的行。
对于第二级分组(第10至第13列),在第一级的基础上,进一步根据标题合并。
使用了OnceAbsoluteMergeStrategy类,该类为EasyExcel提供的单元格合并策略之一,参数分别为起始行号、结束行号、起始列号、结束列号,指定了合并的具体范围。

知识点总结

  • 数据映射:利用Map和Stream API进行数据转换,提高代码的可读性和效率。
  • HTTP响应处理:设置正确的响应头以实现文件下载,以及解决中文乱码问题。
  • EasyExcel库:简化Excel文件的生成和读取过程,提升开发效率。
  • 单元格合并:通过自定义策略实现Excel中数据的分组和单元格合并,提升报表的可读性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1421384.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【51】Camunda8-Zeebe核心引擎-Zeebe Gateway

概述 Zeebe网关是Zeebe集群的一个组件,它可以被视为Zeebe集群的联系点,它允许Zeebe客户端与Zeebe集群内的Zeebe代理进行通信。有关Zeebe broker的更多信息,请访问我们的附加文档。 总而言之,Zeebe broker是Zeebe集群的主要部分,它完成所有繁重的工作,如处理、复制、导出…

【OpenVINO™】在 C# 中使用OpenVINO™ 部署PP-YOLOE实现物体检测

前言 OpenVINO™ C# API 是一个 OpenVINO™ 的 .Net wrapper&#xff0c;应用最新的 OpenVINO™ 库开发&#xff0c;通过 OpenVINO™ C API 实现 .Net 对 OpenVINO™ Runtime 调用&#xff0c;使用习惯与 OpenVINO™ C API 一致。OpenVINO™ C# API 由于是基于 OpenVINO™ 开发…

在实时超声病变检测中挖掘负面时间背景以抑制假阳性

文章目录 Mining Negative Temporal Contexts for False Positive Suppression in Real-Time Ultrasound Lesion Detection摘要挖掘负面时间背景以抑制假阳性&#xff1a;实时超声病变检测的新方法方法实验结果 Mining Negative Temporal Contexts for False Positive Suppress…

谷歌全球倾斜摄影OSGB数据转换正式版V1.0发布!

谷歌全球倾斜摄影OSGB数据转换正式版V1.0来了&#xff01; 五一放假前发布了V0.2版本&#xff0c;在这个版本中&#xff0c;生成了台北地区倾斜摄影OSGB数据&#xff0c;共有335GB&#xff0c;同时针对一些比较严重的问题进行了修复&#xff0c;包括修复瓦片缺失&#xff0c;数…

体重秤蓝牙语音芯片方案-WT2605蓝牙音频ic在电子秤上的应用

在快节奏的现代生活中&#xff0c;健康成为了每个人关注的焦点。而体重作为健康指标之一&#xff0c;更是备受关注。如今&#xff0c;一款全新的智能体重秤蓝牙语音芯片方案正悄然改变着我们的健康管理方式&#xff0c;让健康触手可及。 性能&#xff1a; 1&#xff1a;蓝牙语…

共享充电宝语音芯片ic方案支持远程4g无线更新语音

一、简介 共享充电宝语音芯片ic方案支持远程4g无线wifi蓝牙更新语音 共享充电宝已经是遍布在大街小巷的好产品&#xff0c;解决了携带充电宝麻烦的痛点 但是很多的共享充电宝在人机交互方便&#xff0c;还做得不够好&#xff0c;比如&#xff1a;借、还设备没有语音提示&…

每天认识新职业——网络工程师

一、网络工程师是什么 网络工程师是通过学习和训练&#xff0c;掌握网络技术的理论知识和操作技能的网络技术人员。网络工程师能够从事计算机信息系统的设计、建设、运行和维护工作。相关职业&#xff1a;系统集成工程师、计算机硬件工程师职业其他名称&#xff1a;网络管理员、…

第二证券今日投资参考:VA、VE景气上行 猪价步入慢涨趋势

上周五&#xff0c;沪指午后在地产、金融等板块的带动下震荡上升&#xff0c;创业板指等弱势下探。到收盘&#xff0c;沪指微涨0.01%报3154.55点&#xff0c;深证成指跌0.58%报9731.24点&#xff0c;创业板指跌1.15%报1878.17点&#xff0c;科创50指数跌1.5%&#xff1b;两市算…

力扣HOT100 - 155. 最小栈

解题思路&#xff1a; 辅助栈 class MinStack {private Stack<Integer> stack;private Stack<Integer> min_stack;public MinStack() {stack new Stack<>();min_stack new Stack<>();}public void push(int val) {stack.push(val);if (min_stack.i…

[Go] 结构体不初始化仍然能够调用其方法

文章目录 背景复现原理验证验证2结论参考文档 背景 在写代码的时候&#xff0c;偶然没有将结构体初始化&#xff0c;又调用了该结构体的方法&#xff0c;编译器竟然没有报错&#xff0c;而且运行也是正常的。 复现 写了一个小 demo 用于复现&#xff0c;可以看到&#xff0c…

tomcat 设置JVM 参数

tomcat 启动的服务 设置jvm 设置的文件目录&#xff1a; /tomcat/bin/catalina.sh 添加设置参数&#xff1a; JAVA_OPTS“$JAVA_OPTS -server -Xms1024m -Xmx4096m -XX:MetaspaceSize1024m -XX:MaxMetaspaceSize2048m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/data/se…

led灯哪个品牌质量好?分享五款耐用又护眼的护眼台灯

led灯哪个品牌质量好&#xff1f;在LED照明日益普及的今天&#xff0c;选择一款质量上乘、耐用且护眼的LED台灯显得尤为重要。本文将为大家推荐五款备受好评的护眼台灯品牌&#xff0c;这些品牌凭借其卓越的照明效果、舒适的视觉体验以及优质的售后服务&#xff0c;成为了市场上…

LLM大语言模型(十五):LangChain的Agent中使用自定义的ChatGLM,且底层调用的是remote的ChatGLM3-6B的HTTP服务

背景 本文搭建了一个完整的LangChain的Agent&#xff0c;调用本地启动的ChatGLM3-6B的HTTP server。 为后续的RAG做好了准备。 增加服务端role&#xff1a;observation ChatGLM3的官方demo&#xff1a;openai_api_demo目录 api_server.py文件 class ChatMessage(BaseModel…

蛋白胨(Peptone)主要应用于微生物发酵领域 我国进口量持续增长

蛋白胨&#xff08;Peptone&#xff09;主要应用于微生物发酵领域 我国进口量持续增长 蛋白胨&#xff08;Peptone&#xff09;是一种有机化合物&#xff0c;分子式为C5H9NO2。蛋白胨外观呈淡黄至棕黄色粉剂&#xff0c;含有肉香气味&#xff0c;易溶于水&#xff0c;不溶于乙醚…

FENDI CLUB精酿啤酒馆与传统啤酒销售模式的不同

精酿啤酒火了&#xff0c;国产品牌精酿也在迅速崛起&#xff0c;为精酿啤酒这一小众品类发展加足了马力。与此同时&#xff0c;精酿酒吧、精酿小酒馆也开始出现了增长。这标志着中国精酿啤酒市场的快速发展和国产品牌的崭新局面。 FENDI CLUB精酿啤酒已经在不少地方开始积极开…

下载文件名称乱码或变成了随机码

如图 后端是有正常返回附件名称的,浏览器开发工具中也正常显示了这个数据,但是下载下来的文件名称确实一堆随机码. 其实这个问题的原因是因为跨域 查看console: Refused to get unsafe header "content-disposition" 现象,后端传递到前端的fileName不能被识别,下载…

python脚本打包封装为EXE文件并加密

背景说明 当你编写好一个python脚本&#xff0c;但不想把源码公开&#xff0c;那如何将脚本分享给其他人呢&#xff1f; 有2种办法&#xff1a; 封装为EXE 将Python脚本打包成可执行文件(exe)&#xff0c;一个常用的工具是PyInstaller。打包过程结束后&#xff0c;在该脚本同…

【cocos creator】2.4.0 import android.support.v4.app.ActivityCompat;失败的解决方案

时间是2024年5月&#xff0c;某cocos creator项目用的是2.4.0编辑器。需求是获取录音权限&#xff0c;需要import ActivityCompat。但是失败&#xff0c;提示Cannot resolve symbol app。 尝试了一些方案失败之后&#xff0c;决定升级cocos creator编辑器版本。升级到2.4.10。…

Leetcode—100296. 两个字符串的排列差【简单】

2024每日刷题&#xff08;135&#xff09; Leetcode—100296. 两个字符串的排列差 实现代码 class Solution { public:int findPermutationDifference(string s, string t) {int maps[26];int mapt[26];for(int i 0; i < s.size(); i) {int idxs s[i] - a;int idxt t[i…

爬虫 Python将网页内容保存为PDF(url转pdf) 譬如下载某个专栏下的全部文章

我看到一个不错的教程&#xff0c;想下载教程下全部文章到本地&#xff0c;有时间看看&#xff0c;但是问了作者没有电子档&#xff0c;就想办法了。 PS: 我一天天的到底在干嘛&#xff01;唉… 需求: 爬取一个网页里全部文章且存为pdf 参考链接: 【已解决】Python将网页内容…