前言
easyexcel 由于其比poi更为简单api和更高性能的情况下,easyexcel 但格式下载不符合要求。比如下载格式设置自定义下拉框,对字体进行设置,对部分列进行隐藏的个性化需求。
实践
一、引入maven依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.6</version>
</dependency>
二、定义需要设置状态的注解
@Target({
ElementType.FIELD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExcelStyle {
String fontName() default "宋体";
short fontHeightInPoints() default 12;
HorizontalAlignment horizontalAlignment() default HorizontalAlignment.CENTER;
VerticalAlignment verticalAlignment() default VerticalAlignment.CENTER;
boolean wrapText() default false;
boolean richText() default false;
boolean isRequire() default false;
}
三、定义需要封装对象
@Data
public class CommonCallBackData<T> {
private Font font;
private CellStyle cellStyle;
private List<T> dataList;
private Integer relativeRowIndex;
private Cell cell;
private Workbook workbook;
private Field field;
private ExcelStyle annotation;
private Boolean isHead;
private Boolean isRequire;
}
四、定义需要导出一下需要设置注解
public class BaseType {
/**
* 如果要是excel是否需要使用富文本
* @return 是否需要使用富文本
*/
public Boolean isGetRich(){
return false;
};
/**
* 设置单元格格式
* @return 是设置单元格格式
*/
public Boolean isGetCellStyle(){
return false;
};
}
五、设置隐藏列和富文本和必填参数
@Slf4j
public class TitleHandler<T> implements CellWriteHandler {
private Class<?> c;
private List<T> dataList;
private Consumer<CommonCallBackData<T>> fontConsumer;
private Consumer<CommonCallBackData<T>> cellStyleConsumer;
private Consumer<CommonCallBackData<T>> richTextConsumer;
private List<Integer> hiddenColumnIndexes;
public TitleHandler(Class<?> c, List<T> dataList, Consumer<CommonCallBackData<T>> fontConsumer,
Consumer<CommonCallBackData<T>> cellStyleConsumer,
Consumer<CommonCallBackData<T>> richTextConsumer, List<Integer> hiddenColumnIndexes) {
this.c = c;
this.fontConsumer = fontConsumer;
this.cellStyleConsumer = cellStyleConsumer;
this.richTextConsumer = richTextConsumer;
this.dataList