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

2024-09-04 10:20

本文主要是介绍通过EasyExcel设置自定义表头及设置特定单元格样式、颜色,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

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

实战代码

导出效果:

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 propertiesnewCellStyle.cloneStyleFrom(oldCellStyle);// Set new font colorFont font = workbook.createFont();font.setColor(color.getIndex());newCellStyle.setFont(font);// Apply new stylecontext.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;
}

这篇关于通过EasyExcel设置自定义表头及设置特定单元格样式、颜色的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135754

相关文章

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

linux hostname设置全过程

《linuxhostname设置全过程》:本文主要介绍linuxhostname设置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录查询hostname设置步骤其它相关点hostid/etc/hostsEDChina编程A工具license破解注意事项总结以RHE