当前位置: 首页 > news >正文

通过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;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • OpenAI澄清:“GPT Next”不是新模型。
  • 完整指南:CNStream流处理多路并发框架适配到NVIDIA Jetson Orin (三) 代码编译、各种问题解决、代码修改
  • Oracle VM VirtualBox 下 Ubuntu22 虚拟机配置双网络
  • Ubuntu20.04+ros-noetic配置Cartographer
  • sqli-lab靶场学习(一)——Less1-4
  • Java小程序案例:电子日历记事本
  • Win11下面的StartAllBack的安装、使用流程
  • 传统CV算法——特征匹配算法
  • 瑜伽馆预约系统小程序搭建,全民健身下的市场机遇
  • VMware命令
  • 缓存类型以及读写策略
  • SSH远程连接服务
  • 关于Netty详细介绍,Netty原理架构解析
  • 【word导出带图片】使用docxtemplater导出word,通知书形式的word
  • LoRA微调模型结构可训参数和配置详解
  • [译]Python中的类属性与实例属性的区别
  • 【个人向】《HTTP图解》阅后小结
  • Angular6错误 Service: No provider for Renderer2
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • ECMAScript6(0):ES6简明参考手册
  • nfs客户端进程变D,延伸linux的lock
  • PAT A1050
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Promise初体验
  • Service Worker
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 警报:线上事故之CountDownLatch的威力
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 浅谈web中前端模板引擎的使用
  • 学习Vue.js的五个小例子
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • ionic异常记录
  • postgresql行列转换函数
  • puppet连载22:define用法
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​虚拟化系列介绍(十)
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # Redis 入门到精通(七)-- redis 删除策略
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • ${ }的特别功能
  • (CPU/GPU)粒子继承贴图颜色发射
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (js)循环条件满足时终止循环
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (三)终结任务
  • (算法)大数的进制转换
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)【Hibernate总结系列】使用举例
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)大型网站架构演变和知识体系
  • (转)关于多人操作数据的处理策略