关注微信公众号(首席摸鱼师)免费查看全部文章
前言:
在SpringBoot项目中经常会使用EasyExcel做导入导出功能,有时会有这样的一个需求,就是在生成导入模板时,能自动的将一些选项值,字典值,状态值等带出来让用户自己去选择,可以避免填错其他值或者不知道填什么的一些问题,对用户来说是比较友好的
EasyExcel中提供了一个处理器接口:SheetWriteHandler,用于在导出Excel时处理sheet的创建和写入操作。它继承自WriteHandler接口,主要作用是在创建sheet前后执行特定的逻辑。可以利用SheetWriteHandler创建一个自定义的SheetWriteHandler并注册到EasyExcel中来实现这一目的,但每次不同的业务功能都需要定义却显得非常麻烦,本着省力少做多摸鱼的原则,我们可以将它封装成注解,下来主要说一下详细步骤。
一、 导入EasyExcel依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.1 </version>
</dependency>
版本根据自己需要修改
二、创建一个下拉注解
import java.lang.annotation.*;
/**
* 定义Excel列下拉列表属性的注解
* * @author wfeil211@foxmail.com
*/
@Documented
@Target({
ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelSelected {
/**
* 方式一:固定的下拉选项
*/
String[] source() default {
};
/**
* 方式二:提供动态下拉选项的类
*/
Class<? extends ExcelDynamicSelect>[] sourceClass() default {
};
/**
* 下拉列表的起始行(默认从第二行开始)。
*/
int firstRow() default 1;
/**
* 下拉列表的结束行(默认到第65536行)。
*/
int lastRow() default 65536;
}
其中有4个属性,分别代表如下:
* source:适合少量数据,固定写好的值
* sourceClass:自定义数据源,适合复杂数据来源,可以从数据库查询进行组装
* firstRow:生效下拉的起始行,可修改
* lastRow:生效下拉的结束行,可修改
三、 创建一个ExcelSelectedResolve类,用来解析下拉列表数据来源
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
/**
* 根据 ExcelSelected 注解解析下拉列表数据源。
*
* @author wfeil211@foxmail.com
*/
@Data
@Slf4j
public class ExcelSelectedResolve {
/**
* 下拉选项数组。
*/
private String[] source;
/**
* 下拉列表的起始行。
*/
private int firstRow;
/**
* 下拉列表的结束行。
*/
private int lastRow;
/**
* 解析下拉列表数据来源
*
* @param excelSelected 下拉框注解对象
* @return 下拉框选项数组
*/
public String[] resolveSelectedSource(ExcelSelected excelSelected) {
if (excelSelected == null) {
return null;
}
// 方式一:获取固定下拉框的内容
String[] source = excelSelected.source();
if (source.length > 0) {
return source;
}
// 方式二:获取动态下拉框的内容
Class<? extends ExcelDynamicSelect>[] classes = excelSelected.sourceClass();
if (classes.length > 0) {
try {
ExcelDynamicSelect excelDynamicSelect = classes[0]