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

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用EasyExcel自定义设置表头颜色和批注的步骤如下: 1. 导入相关的依赖包: ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy; import com.alibaba.excel.write.style.row.SimpleRowHeightStyleStrategy; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; ``` 2. 创建一个类来自定义样式,继承`CellStyle`类,并实现`setCellStyle`方法: ```java public class CustomCellStyle extends CellStyle { private static final short CUSTOM_COLOR = IndexedColors.YELLOW.getIndex(); @Override public void setCellStyle(Cell cell) { Workbook workbook = cell.getSheet().getWorkbook(); CellStyle style = workbook.createCellStyle(); // 设置背景颜色 style.setFillForegroundColor(CUSTOM_COLOR); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 设置批注 Drawing<?> drawing = cell.getSheet().createDrawingPatriarch(); CreationHelper factory = workbook.getCreationHelper(); ClientAnchor anchor = factory.createClientAnchor(); Comment comment = drawing.createCellComment(anchor); RichTextString richTextString = factory.createRichTextString("这是一个批注"); comment.setString(richTextString); cell.setCellComment(comment); cell.setCellStyle(style); } } ``` 3. 在代码中使用自定义样式: ```java public class Main { public static void main(String[] args) { // 读取Excel文件 List<List<Object>> data = EasyExcel.read("input.xlsx").sheet().doReadSync(); // 写入Excel文件 EasyExcel.write("output.xlsx") .sheet() .registerWriteHandler(new SimpleColumnWidthStyleStrategy()) .registerWriteHandler(new SimpleRowHeightStyleStrategy()) .registerWriteHandler(new CustomCellStyle()) // 注册自定义样式 .doWrite(data); } } ``` 以上代码将会将输入文件中的数据写入到输出文件中,并在表头单元格设置黄色背景色和批注内容为"这是一个批注"。 注意:以上示例代码仅适用于`.xlsx`格式的Excel文件。如果需要处理`.xls`格式的Excel文件,需要使用`HSSFWorkbook`替代`XSSFWorkbook`。另外,如果需要自定义其他样式,可以参考`CellStyle`类的相关方法来设置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2024暴富

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值