
注解
package com.baidu.activitidemo.annotation;
import com.baidu.activitidemo.handler.ExcelSelectedHandler;
import java.lang.annotation.*;
/**
* 设置列的下拉选择值, 需要配合{@link ExcelSelectedHandler}使用
*
* @author li
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExcelSelected {
/**
* 一般使用此属性的值进行下拉值的填充
*
* @return {@link String[]}
*/
String[] value() default {};
/**
* 慎用此属性,建议使用value
* 此处值应为一个SpEL,返回值需要是一个数组或集合
* 此表达式若有值(无论是否调用是否成功),则会忽略value属性
* 使用示例:#root.getBean('userService')?.getSelectedList('2')
* 此处的使用示例中的 #root指的是applicationContext
*
* @return {@link String}
*/
String dynamicAccess() default "";
/**
* 下拉起始行
* -1表示表头的下一行,代码自动获取
*
* @return int
*/
int firstRow() default -1;
/**
* 下拉结束行
* -1表示使用默认值1000
*
* @return int
*/
int lastRow() default -1;
}
Handler
package com.baidu.activitidemo.handler;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import com.baidu.activitidemo.annotation.ExcelSelected;
import com.baidu.activitidemo.config.SpringContextUtil;
import lombok.Data;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.springframework.expression.Expression;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/**
* 设置列的下拉选择值, 需要配合注解{@link ExcelSelected}使用
* eg:EasyExcel.write(fileName, Person.class).registerWriteHandler(new ExcelRemarkHandler(Person.class))
*
* @author lxh
* @date 2022/9/24 8:59
*/
@Data
public class ExcelSelectedHandler<T> implements SheetWriteHandler {
/** 解析后的下拉数据 */
private Map<Integer, ExcelSelectedResolve> excelSelectedResolveMap;
/** spring表达式解析器 */
private SpelExpressionParser spelExpressionParser;
/** 标准上下文 */
private StandardEvaluationContext standardEvaluationContext;
/** 默认不在新sheet页中设置下拉值 */
private boolean inNewSheetFlag = false;
/** 当前最大规格 */
private Integer currentMaxLength;
/** 允许最大规格 */
public Integer allowMaxLength = 200;
/** 默认下拉的行数:1000 */
private int defaultRowNumber;
/** 需要解析的类 */
private Class<T> clazz;
/** 字母 */
private static final char[] alphabet = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W'