easyExcel使用模版填充excel,合并单元格

一、最终效果

在这里插入图片描述

二、制作模版

1、制作填充模版
在这里插入图片描述
模版在代码中保存的位置
在这里插入图片描述

2、Controller

/*** 下载模板*/
@RequestMapping(value = "exportData")
public void exportData(KqKqb kqKqb,HttpServletResponse response, HttpServletRequest request) throws IOException {kqKqbService.exportData(kqKqb,response,request);
}

3、Service(获取数据的逻辑不重要,重点单元格合并)

public void exportData(KqKqb kqKqb,HttpServletResponse response, HttpServletRequest request) throws IOException {//获取填充数据KqKqb entity = dao.get(kqKqb);Integer ycqts = entity.getYcqts();//本月应出勤天数String officeName = entity.getOfficeName();//单位名称List<Map<String, Object>> mapLit = ListUtils.newArrayList();KqKqbZb zbSql = new KqKqbZb();zbSql.setMonth(entity.getMonth());zbSql.setOfficeCode(entity.getOfficeCode());List<KqKqbZb> zbList = zbDao.findList(zbSql);String year =  kqKqb.getMonth().split("-")[0];String month =  kqKqb.getMonth().split("-")[1];//list填充数据封装String empCode = "";Integer xh = 0;for (KqKqbZb kqKqbZb : zbList) {//工号不重复序列加号加自增1if(!empCode.equals(kqKqbZb.getEmpCode())){empCode = kqKqbZb.getEmpCode();xh++;}kqKqbZb.setXh(xh);mapLit.add(JSON.parseObject(JSON.toJSONString(kqKqbZb), Map.class));}//模版所在位置String templateName = "员工考勤表上传模板1.xlsx";String serverPath = request.getSession().getServletContext().getRealPath("/");String ftlPath = serverPath + "ftl\\kh\\";String templateFileName = ftlPath + templateName;//文件名封装String fileName = month + "月-" + officeName + "-员工考勤表";response.setHeader("Content-disposition", "attachment;filename=" + String.valueOf(URLEncoder.encode(fileName, "UTF-8")) + ".xlsx");// 设置文件头编码格式response.setContentType("APPLICATION/OCTET-STREAM;charset=UTF-8");// 设置类型//定义合并规则List<Integer> mergeColumnIndex = ListUtils.newArrayList(0, 1, 2,35,36,37,38,39,40);//第几列所在行开始合并ExcelMergeStrategy loopMergeStrategy = new ExcelMergeStrategy(4, 2, mergeColumnIndex); // 从第4行开始,每隔2行合并,mergeColumnIndex需要合并行所在的列//开始填充ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(response.getOutputStream());excelWriterBuilder.registerWriteHandler(loopMergeStrategy);excelWriterBuilder.autoCloseStream(true);ExcelWriter excelWriter = excelWriterBuilder.withTemplate(templateFileName).build();WriteSheet writeSheet = EasyExcel.writerSheet().build();FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();excelWriter.fill(mapLit, fillConfig, writeSheet);Map<String, Object> map = MapUtils.newHashMap();map.put("officeName", officeName);map.put("year", year);map.put("month", month);map.put("ycqts", ycqts);excelWriter.fill(map, writeSheet);excelWriter.finish();
}

核心:从第0、1、2等列和第4行开始,每两行合并单元格

//定义合并规则
List<Integer> mergeColumnIndex = ListUtils.newArrayList(0, 1, 2,35,36,37,38,39,40);//第几列所在行开始合并
ExcelMergeStrategy loopMergeStrategy = new ExcelMergeStrategy(4, 2, mergeColumnIndex); // 从第4行开始,每隔2行合并,mergeColumnIndex需要合并行所在的列

4、新建合并策略类

package com.jeesite.modules.util;import com.alibaba.excel.write.handler.RowWriteHandler;
import com.alibaba.excel.write.handler.context.RowWriteHandlerContext;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.util.CellRangeAddress;import java.util.List;/*** @Description EasyExcel 导出合并单元格*/
@Slf4j
@Data
public class ExcelMergeStrategy implements RowWriteHandler {/** 要合并的列 (下表也是从0开始)*/private List<Integer> mergeColumnIndex;/** 用第几行开始合并 ,默认为1,因为第0行是标题,EasyExcel 的默认也是*/private int mergeBeginRowIndex = 1;/*** Each row*/private int eachRow;private int columnExtend = 1;public ExcelMergeStrategy(int mergeBeginRowIndex, int eachRow, List<Integer> mergeColumnIndex) {this.mergeBeginRowIndex = mergeBeginRowIndex;this.eachRow = eachRow;this.mergeColumnIndex = mergeColumnIndex;}@Overridepublic void afterRowDispose(RowWriteHandlerContext context) {if (context.getHead() || context.getRelativeRowIndex() == null) {return;}//当前行int curRowIndex = context.getRowIndex();//当前列if (curRowIndex > mergeBeginRowIndex) {if (context.getRelativeRowIndex() % eachRow == 0) {for (Integer columnIndex : mergeColumnIndex) {CellRangeAddress cellRangeAddress = new CellRangeAddress(context.getRowIndex(),context.getRowIndex() + eachRow - 1,columnIndex, columnIndex + columnExtend - 1);context.getWriteSheetHolder().getSheet().addMergedRegionUnsafe(cellRangeAddress);}}}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高级算法设计与分析 学习笔记10 平摊分析

动态表&#xff0c;可以变长。 一溢出就另起一个两倍大小的表。 可以轻易证明把n个数字放进去的时间复杂度是O(n)&#xff0c;n n/2 n/4……也就2n&#xff0c;插入数字本身也就是n&#xff0c;加起来最多不超过3n. 这种复杂度究竟是怎么算的&#xff1f;毕竟每次插入复杂度…

Vulhub zico 2靶机详解

项目地址 https://download.vulnhub.com/zico/zico2.ova实验过程 将下载好的靶机导入到VMware中&#xff0c;设置网络模式为NAT模式&#xff0c;然后开启靶机虚拟机 使用nmap进行主机发现&#xff0c;获取靶机IP地址 nmap 192.168.47.1-254根据对比可知Zico 2的一个ip地址为…

阿里云ACP认证考试题库

最近有好些同学&#xff0c;考完阿里云ACP了&#xff0c;再来跟我反馈&#xff1a;自己花700买的阿里云ACP题库&#xff0c;结果答案是错的&#xff01; 或者考完后发现&#xff0c;买的阿里云ACP题库覆盖率只有50%&#xff01; 为避免大家继续踩坑&#xff0c;给大家分享一个阿…

短视频去水印解析api接口使用文档

短视频去水印解析api接口&#xff0c;支持各大平台短视频和图集。 请求示例&#xff1a;https://www.dspqsy.vip/spapi?key密钥&url短视频链接 返回数据格式&#xff1a;JSON 请求方式&#xff1a;GET/POST 请求参数&#xff1a;url (短视频分享的URL) PHP 源码&…

从存储到人工智能洞察: 利用 MinIO 和 Polars 简化数据管道

将 MinIO 的高性能、可扩展企业对象存储的强大功能与 Polars&#xff08;闪电般快速的 DataFrame 库&#xff09;的快速内存数据处理功能相结合&#xff0c;可以显著提高数据管道的性能。在 AI 工作流中尤其如此&#xff0c;其中预处理大型数据集和执行特征选择是关键步骤。在这…

Linux操作系统中dubbo

1、简介 dubbo框架是做微服务通信的&#xff0c;是由阿里巴巴开发&#xff0c;后捐赠给阿帕奇基金会。 2、与OpenFeign的区别 dubbo是采用RPC协议实现微服务通信&#xff0c;OpenFeign是采用Http请求的方式实现的。 OpenFeign 最简单的&#xff0c;就是Spring公司开发的&am…

RabbitMQ 队列之战:Classic 和 Quorum 的性能洞察

RabbitMQ 是一个功能强大且广泛使用的消息代理&#xff0c;它通过处理消息的传输、存储和交付来促进分布式应用程序之间的通信。作为消息代理&#xff0c;RabbitMQ 充当生产者&#xff08;发送消息的应用程序&#xff09;和使用者&#xff08;接收消息的应用程序&#xff09;之…

2024年软考网络工程师中级题库

1【考生回忆版】以下不属于5G网络优点的是&#xff08;A) A.传输过程中消耗的资源少&#xff0c;对设备的电池更友好 B.支持大规模物联网&#xff0c;能够连接大量低功耗设备&#xff0c;提供更高效的管理 C.引入了网络切片技术&#xff0c;允许将物理网络划分为多个虚拟网络…

Elasticsearch7.7.1集群不能相互发现的问题解决以及Elasticsearch7.7.1安装analysis-ik中文分词插件的应用

一、Elasticsearch7.7.1集群不能相互发现的问题解决 在使用elasticsearch7.7.1搭建集群&#xff0c;使用了3台服务器作为节点&#xff0c;但在搭建的过程中发现每台服务器的elasticsearch服务都正常&#xff0c;但是不能相互发现&#xff0c;期间进行了一些配置的修改偶尔出现了…

uniapp中实现评分组件,多用于购买商品后,对商品进行评价等场景

前言 uni-rate是uniapp框架中提供的一个评分组件。它可以用于用户评价、打分等场景。uni-rate组件可以根据设定的星星总数&#xff0c;展示用户评分的效果&#xff0c;用户可以通过点击星星或滑动星星的方式进行评分。同时&#xff0c;uni-rate组件也支持自定义星星图标、星星…

Vue 技术进阶 day2 数据监视的原理、其他内置指令、自定义指令、生命周期、组件化、VueComponent构造函数

目录 1.Vue监测数据的原理 1.1 原理 1.1.1 数据劫持 1.1.2 观察者模式(Vue内部的实现) 1.1.3 更新组件 1.1.4 计算属性和侦听器 1.2 后添加属性做响应式&#xff08;Vue.set / vm.$set&#xff09; 1.3 对象和数组的响应式 1.4 数据监视案例 2.指令 2.1 内置指令 2.…

丹摩智算平台部署 Llama 3.1:实践与体验

文章目录 前言部署前的准备创建实例 部署与配置 Llama 3.1使用心得总结 前言 在最近的开发工作中&#xff0c;我有机会体验了丹摩智算平台&#xff0c;部署并使用了 Llama 3.1 模型。在人工智能和大模型领域&#xff0c;Meta 推出的 Llama 3.1 已经成为了目前最受瞩目的开源模…

初识Linux · O(1)调度算法

目录 前言&#xff1a; O(1)调度算法 前言&#xff1a; 在初识进程的那一块&#xff0c;我们已经知道了进程并不是一直占用cpu资源的&#xff0c;而是存在时间片的概念&#xff0c;即&#xff0c;每个进程都有一定的时间来执行该进程&#xff0c;时间一到&#xff0c;该进程…

C++:类中的特殊关键字,运算重载符

1.My_string类中重载以下的运算符&#xff1a; 、[] 、>、<、、>、<、&#xff01;、、输入输出(>>、<<) 主函数&#xff1a; #include <iostream> #include "my_string.h"using namespace std;int main() {My_string s1("cat…

centos72009源码编译R语言

./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Pconnect -Psparkr -Phive -Phive-thriftserver -Pmesos -Pyarn -Dhadoop.version3.4.0 -Pkubernetes spark3.5.3 源码版本 ./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Pconnect -P…

[Python学习日记-31] Python 中的函数

[Python学习日记-31] Python 中的函数 简介 语法定义 函数的参数 简介 引子&#xff1a; 你是某公司的一个高级程序员&#xff0c;现在老板让你写一个监控程序&#xff0c;需要24小时全年无休的监控公司网站服务器的系统状况&#xff0c;当 CPU、Memory、Disk 等指标的使用…

计算机毕业设计 基于Python高校岗位招聘和分析平台的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

【C++掌中宝】类和对象(二):隐藏的this指针

文章目录 引言1. 定义与用法1.1 隐式存在的 this 指针1.2 this 指针的用途与示例 2. 本质3. 特点4. this 指针的作用机制5. 成员函数中的 this 指针6. 空指针与 this 指针的特殊情况7. 注意事项8. 总结结语 引言 在 C 编程中&#xff0c;类是面向对象编程的核心&#xff0c;而…

【代码实现】opencv 高斯模糊和pytorch 高斯模糊

wiki百科 Gaussian Blur&#xff0c;也叫高斯平滑&#xff0c;是在Adobe Photoshop、GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果&#xff0c;通常用它来减少图像噪声以及降低细节层次。 opencv实现 opencv实现高斯滤波有两种方式&#xff0c; 1、是使用自带的cv2…

在MacOS上安装MongoDB数据库

一、安装方法 1.1 安装包安装 首先&#xff0c;打开MongoDB 官网下载安装包&#xff0c;下载链接&#xff1a;https://www.mongodb.com/try/download/community。 根据自己的系统环境自行选择下载的版本。将下载好的 MongoDB 安装包解压缩&#xff0c;并将文件夹名改为 mon…