通过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实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

Linux从文件中提取特定内容的实用技巧分享

《Linux从文件中提取特定内容的实用技巧分享》在日常数据处理和配置文件管理中,我们经常需要从大型文件中提取特定内容,本文介绍的提取特定行技术正是这些高级操作的基础,以提取含有1的简单需求为例,我们可... 目录引言1、方法一:使用 grep 命令1.1 grep 命令基础1.2 命令详解1.3 高级用法2

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南

《SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南》本文将基于开源项目springboot-easyexcel-batch进行解析与扩展,手把手教大家如何在SpringBo... 目录项目结构概览核心依赖百万级导出实战场景核心代码效果百万级导入实战场景监听器和Service(核心

Python清空Word段落样式的三种方法

《Python清空Word段落样式的三种方法》:本文主要介绍如何用python-docx库清空Word段落样式,提供三种方法:设置为Normal样式、清除直接格式、创建新Normal样式,注意需重... 目录方法一:直接设置段落样式为"Normal"方法二:清除所有直接格式设置方法三:创建新的Normal样