通过EasyExcel设置自定义表头及设置特定单元格样式、颜色

news2024/9/23 1:36:01
前言

   在项目开发中,我们会遇到各种文件导出的开发场景,但是这种情况并都不常用,于是本人将自己工作中所用的代码封装成工具类,旨在记录工具类使用方法和技术分享。

实战代码

导出效果:

1、导入依赖

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.0</version>
        </dependency>

2、导出代码

	/**
	 * 导出打卡报表
	 *
	 * @param request  请求参数
	 * @param response 返回参数
	 */
	@PostMapping("/export")
	public void exportOaPersonOpenCardRecord(@RequestBody OaPersonOpenCardRecordRequest request, HttpServletResponse response) {
		List<OaPersonOpenCardRecord> oaPersonOpenCardRecordList = oaOpenCardRecordService.findOaPersonOpenCardRecordExportList(request);
		List<List<String>> headList = new ArrayList<>();
		try {
			// 设置动态头
			buildExportHead(oaPersonOpenCardRecordList, headList);
			// 获取动态数据
			List<List<Object>> exportList = new ArrayList<>();
			for (int i = 0; i < oaPersonOpenCardRecordList.size(); i++) {
				List<Object> valueList = new ArrayList<>();
				valueList.add(i + 1);
				valueList.add(oaPersonOpenCardRecordList.get(i).getUserName());
				valueList.add(oaPersonOpenCardRecordList.get(i).getOverWordCount());
				List<OaOpenCardInfo> oaOpenCardInfoList = oaPersonOpenCardRecordList.get(i).getOpenCardInfoList();
				oaOpenCardInfoList.forEach(oaOpenCardInfo -> {
					StringBuilder stringBuilder = new StringBuilder();
					if (StringUtils.isNotBlank(oaOpenCardInfo.getStartTime()) && request.getOpenTimeStatus() == 1) {
						stringBuilder.append(oaOpenCardInfo.getStartTime()).append("\n");
					}
					if (StringUtils.isNotBlank(oaOpenCardInfo.getEndTime()) && request.getOpenTimeStatus() == 1) {
						stringBuilder.append(oaOpenCardInfo.getEndTime()).append("\n");
					}
					if (StringUtils.isNotBlank(oaOpenCardInfo.getOpenCardStatus())) {
						stringBuilder.append(oaOpenCardInfo.getOpenCardStatus());
					}
					valueList.add(stringBuilder.toString());
				});
				exportList.add(valueList);
			}
			response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
			response.setCharacterEncoding("utf-8");
			String fileName = URLEncoder.encode("考勤报表", "UTF-8").replaceAll("\\+", "%20");
			response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
			EasyExcel.write(response.getOutputStream())
				.head(headList)
				.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
				.registerWriteHandler(new CellWriteHandler() {
					@Override
                    //设置特定样式
					public void afterCellDispose(CellWriteHandlerContext context) {
						Workbook workbook = context.getWriteWorkbookHolder().getWorkbook();
						CellStyle cellStyle = workbook.createCellStyle();
						// 设置换行
						cellStyle.setWrapText(true);
						// 设置表格内容垂直居中
						cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
						// 设置表格内容水平居中
						cellStyle.setAlignment(HorizontalAlignment.CENTER);
						// 设置带框线
						cellStyle.setBorderTop(BorderStyle.THIN);
						cellStyle.setBorderRight(BorderStyle.THIN);
						cellStyle.setBorderBottom(BorderStyle.THIN);
						cellStyle.setBorderLeft(BorderStyle.THIN);
						context.getCell().setCellStyle(cellStyle);
						if (BooleanUtils.isNotTrue(context.getHead())) {
							List<String> headNameList = context.getHeadData().getHeadNameList();
							String headName = headNameList.get(NumberConstant.ZERO);
							if (!headName.contains("考勤")) {
								return;
							}
							Cell cell = context.getCell();
							String stringCellValue = cell.getStringCellValue();
							if (!stringCellValue.contains("加班") && !stringCellValue.contains("正常") && !stringCellValue.contains("休息")) {
								//红色
								setCellStyle(context, IndexedColors.RED);
							} else if (stringCellValue.contains("加班")) {
								//绿色
								setCellStyle(context, IndexedColors.GREEN);
							}
						}
					}
				})
				.sheet("考勤报表").doWrite(exportList);

		} catch (Exception e) {
			log.error("导出失败", e);
		}
	}

	/***
	 * 设置特定单元格的颜色及字体
	 * @param context
	 * @param color
	 */
	private void setCellStyle(CellWriteHandlerContext context, IndexedColors color) {
		Workbook workbook = context.getWriteWorkbookHolder().getWorkbook();
		CellStyle oldCellStyle = context.getCell().getCellStyle();
		CellStyle newCellStyle = workbook.createCellStyle();
		// Copy existing style properties
		newCellStyle.cloneStyleFrom(oldCellStyle);
		// Set new font color
		Font font = workbook.createFont();
		font.setColor(color.getIndex());
		newCellStyle.setFont(font);
		// Apply new style
		context.getCell().setCellStyle(newCellStyle);
	}

	private static void buildExportHead(List<OaPersonOpenCardRecord> oaPersonOpenCardRecordList, List<List<String>> headList) {
		List<String> head0 = new ArrayList<>();
		head0.add("序号");
		List<String> head1 = new ArrayList<>();
		head1.add("姓名");
		List<String> head2 = new ArrayList<>();
		head2.add("晚上19:30以后打卡次数");
		headList.add(head0);
		headList.add(head1);
		headList.add(head2);
		if (!oaPersonOpenCardRecordList.isEmpty()) {
			List<OaOpenCardInfo> openCardInfoList = oaPersonOpenCardRecordList.get(0).getOpenCardInfoList();
			openCardInfoList.forEach(openCardInfo -> {
				List<String> head = new ArrayList<>();
				head.add("考勤");
				head.add(openCardInfo.getTitle());
				headList.add(head);
			});
		}
	}

实体类

package com.sansint.oa.param;

import com.sansint.oa.domain.OaPersonOpenCardRecord;
import lombok.Data;

/**
 * @author DJY
 * @date 2024/8/29
 */
@Data
public class OaPersonOpenCardRecordRequest extends OaPersonOpenCardRecord {

	/***
	 * 开始时间
	 */
	private String startDate;
	/***
	 * 结束时间
	 */
	private String endDate;
	/**
	 * 上班时间
	 */
	String startWorkTime = "";
	/**
	 * 下班时间
	 */
	String endWorkTime = "";
	/**
	 * 加班时刻
	 */
	String overWorkTime = "";

	/**
	 * 打开时间状态
	 */
	 Integer openTimeStatus;
}
package com.sansint.oa.domain;

import lombok.Data;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @author DJY
 * @date 2024/8/29
 */
@Data
public class OaPersonOpenCardRecord implements Serializable {
	private static final long serialVersionUID = 1L;
	/****
	 * 姓名
	 */
	private String userName;
	/****
	 * 晚上7.30以后打卡次数
	 */
	private long overWordCount;
	/***
	 * 考勤信息
	 */
	private List<OaOpenCardInfo> openCardInfoList;

	/***
	 * 考勤信息
	 */
	private Map<String,Object> openCardInfoMap;
}
package com.sansint.oa.domain;

import lombok.Data;

import java.io.Serializable;

/**
 * @author DJY
 * @date 2024/8/29
 */
@Data
public class OaOpenCardInfo implements Serializable {
	private static final long serialVersionUID = 1L;
	/****
	 * 姓名
	 */
	private String userName;
	/****
	 * 最早打卡时间
	 */
	private String startTime;
	/****
	 * 最晚打卡时间
	 */
	private String endTime;
	/****
	 * 标题
	 */
	private String title;
	/****
	 * 打卡状态
	 */
	private String openCardStatus;
	/****
	 * 打卡状态颜色
	 */
	private String openCardColor;
	/***
	 * 排序
	 */
	private Long sort;
}

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

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

相关文章

开发指南058-JPA多数据源

一般情况下&#xff0c;一个微服务只链接一个数据库&#xff0c;但是不排除有些情况下需要链多个库。链多个库比较复杂&#xff0c;介绍如下&#xff1a; 1、nocas中要配置多数据源 白框内为正常的单数据库情况。下面增加标识&#xff08;可以任意起&#xff0c;这里为eva)&…

Maven入门:自动化构建工具的基本概念与配置

一、什么是Maven 目前无论使用IDEA还是Eclipse等其他IDE&#xff0c;使用里面 ANT 工具帮助我们进行编译&#xff0c;打包运行等工作。Apache基于ANT进行了升级&#xff0c;研发出了全新的自动化构建工具Maven。 Maven使用项目对象模型&#xff08;POM-Project Object Model&…

ARM基础---编程模型---ARM汇编

一、编程模型 1.1.数据和指令集 1.数据 ARM 采用的是32位架构。 ARM 约定:Byte &#xff1a; 8 bits Halfword &#xff1a; 16 bits (2 byte)Word : 32 bits (4 byte)Doubleword 64-bits&#xff08;8byte&#xff09;&#xff08;Cortex-A处理器&#xff09; 2.指令 ARM…

红日靶场vulnstack (三)

环境搭建 直接把靶机下载下来后&#xff0c;配置环境如下&#xff0c;直接Centsos配置多一张网卡NAT模式就行。 //只有这两台主机IP和图片不同&#xff0c;其它都是一样的&#xff0c;因为图片是拿别人的 kali&#xff1a;192.168.145.171 Centos&#xff1a;192.168.145.130…

https和harbor仓库跟k8s

目录 https 做证书 harbor仓库 https https是加密的http&#xff0c;它的端口是443&#xff0c;它的协议是tcp协议。建立连接和普通的tcp是一样的&#xff0c;都是三次握手和四次挥手&#xff0c;但是它三次握手之后有一个步骤&#xff1a;SSL或者TLS握手的过程&#xff0c…

DAMA数据管理知识体系(第4章 数据架构)

课本内容 4.1 引言 概要 数据架构考虑方面 数据架构成果&#xff0c;包括不同层级的模型、定义、数据流&#xff0c;这些通常被称为数据架构的构件数据架构活动&#xff0c;用于形成、部署和实现数据架构的目标数据架构行为&#xff0c;包括影响企业数据架构的不同角色之间的协…

vue3+ts 实现模板表格文件下载~

1、效果图&#xff1a; 2、创建点击事件&#xff0c;并发起请求&#xff0c;获取模板表格文件下载url地址。 //组件 <a-button class"btn btn_width" click"download"> 下载模板 </a-button>// 文件模板下载 import { getTemplate } from /ap…

JAVA读写Excel(jxl,poi,easyExcel)

目录 一、需求描述 二、具体操作Excel的常用方法 方法一&#xff1a; 使用jxl 方法二&#xff1a; POI 方法三&#xff1a;EasyExcel 三、总结 一、需求描述 前端有时候会传送 Excel 文件给后端&#xff08;Java&#xff09;去解析&#xff0c;那我们作为后端该如何实现…

Linux内核源码-USB驱动分析

基础层次详解 通用串行总线&#xff08;USB&#xff09;主要用于连接主机和外部设备&#xff08;协调主机和设备之间的通讯&#xff09;&#xff0c;USB 设备不能主动向主机发送数据。USB 总线采用拓扑&#xff08;树形&#xff09;&#xff0c;主机侧和设备侧的 USB 控制器&a…

《亿级流量系统架构设计与实战》第十二章 评论服务

评论服务 一、概述二、单级评论模式1、模型设计2、分库分表必要性3、高并发问题 三、二级评论模式1、模型设计2、评论审核与状态3、按照热度排序4、评论读取流程图5、架构总览 四、盖楼评论模式1、数据库递归查询2、数据库保存完整楼层3、图数据库 内容总结自《亿级流量系统架构…

关于IDEA的快捷键不能使用的原因

有时候IDEA的快捷键用不了&#xff0c;这时应该是快捷键发生冲突了&#xff0c;重新设置一下即可。以批量修改变量名称的shift f6为例&#xff08;我的这个快捷键用不了&#xff09;&#xff1a; 初始的rename的快捷键为shift f6 这个快捷键是冲突的&#xff0c;所以我们需要…

探索PDF的奥秘:pdfrw库的神奇之旅

文章目录 探索PDF的奥秘&#xff1a;pdfrw库的神奇之旅背景&#xff1a;为何选择pdfrw&#xff1f;pdfrw是什么&#xff1f;如何安装pdfrw&#xff1f;五个简单的库函数使用方法场景应用&#xff1a;pdfrw在实际工作中的应用常见问题与解决方案总结 探索PDF的奥秘&#xff1a;p…

安防监控视频平台LntonAIServer视频智能分析平台新增视频质量诊断功能

随着安防行业的快速发展&#xff0c;视频监控系统已经成为维护公共安全和个人隐私的重要工具。然而&#xff0c;由于各种因素的影响&#xff0c;视频流的质量可能会受到影响&#xff0c;从而导致监控效果不佳。为了解决这一问题&#xff0c;LntonAIServer推出了全新的视频质量诊…

基于.NET6的WPF基础总结(下)

目录 一、集合控件 1. ListBox可选项列表 2. ListView数据列表控件 3. DataGrid数据表格控件 4. ComboBox下拉框控件 5. TabControl 6. TreeView 树形控件 7. Menu菜单 8. ContextMenu上下文菜单 二、图像控件 1. Ellipse 椭圆 2. Line线段 3. Rectangle矩形 4.…

如何打造中小学在线教学平台?Java SpringBoot集成Vue,教育资源管理新篇章

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

基于Transformer架构训练LLM大语言模型:Transformer架构工作原理

视频讲解&#xff1a;Transformer架构的工作原理讲解_哔哩哔哩_bilibili 一 Transformer架构总体架构 1 总体架构图 总体架构说明&#xff1a; 输入层 词嵌入&#xff08;Word Embeddings&#xff09;: 输入文本中的每个词都被映射到一个高维空间中的向量&#xff0c;这些向…

HTML静态网页成品作业(HTML+CSS)——动漫大耳朵图图网页(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

智能化的知识管理:大模型在知识图谱构建中的突破性应用

转自&#xff1a;大模型奇点说 知识图谱是一种以图形结构组织数据的知识表示形式&#xff0c;其中&#xff0c;概念、事件、实体等知识单元通过节点呈现&#xff0c;而它们之间的各种关系则通过边来描述。知识图谱的显著特点在于&#xff0c;通过关系的定义&#xff0c;为节点提…

EmguCV学习笔记 VB.Net 9.3 移动检测类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

第十一课,多分支判断

一&#xff0c;多分支结构 某些场景下&#xff0c;判断条件不止一个&#xff0c;可能有多个。 语法格式&#xff08;下图左&#xff09;&#xff1a; *需要注意&#xff1a;这里仅是以5种选择作为例子&#xff0c; 可以根据自己的需要&#xff0c;在if...else的中间插入任意…