1.导出方法接收一个list集合,和一个Class类型,和HttpServletResponse 对象
2.导出是可能会有下拉列表,所以需要一个map存储下拉列表数据源,传入参数后只需一行代码即可导出
3.导入方法需要传入file文件,以及一个Class类型,导入之后将会返回一个list集合,里面的对象就是传入类型的对象,传入参数后只需一行代码即可导入
实现过程:
首先导入poi依赖
<!--poi-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.8</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.8</version>
</dependency>
需要创建4个注解
一个是@EnableExport
,必须实体类有这个注解才能导出(可以设置文件名/标题和背景颜色)
import com.jiuren.common.constant.ColorEnum;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 设置允许导出(EnableExport ,必须有这个注解才能导出)
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface EnableExport {
/**
* 设置文件名/标题
*/
String fileName();
/**
* 设置背景颜色
*/
ColorEnum cellColor() default ColorEnum.BLANK;
}
然后就是@EnableExportField
,有这个注解的字段才会导出到Excel里面,并且可以设置列宽和背景颜色
package com.jiuren.common.annotation;
import com.jiuren.common.constant.ColorEnum;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 设置该字段允许导出
* 并且可以设置宽度
* 以及设置下拉列表字段的key 用来匹配对应的label导出
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EnableExportField {
/**
* 列宽
*/
int colWidth() default 100;
/**
* 标题名称
*/
String colName();
/**
* 设置get方法
*/
String useGetMethod() default "";
/**
* 设置背景颜色
*/
ColorEnum cellColor() default ColorEnum.BLANK;
/**
* 标记导出excel列的日期格式(如果字段不是日期则为空)
*/
String dateFormat() default "";
/**
* 替换类型
* 使用说明: 如果你的实体类对象sex属性或者status属性实际获取到的值并不是0/1,或者ON/OFF那么就不会进行替换
* 根据下划线分隔,翻译过来的意思就是将0替换成女,将1替换成男
* replace = {"0_女", "1_男"}
* private int sex;
* 根据下划线分隔,翻译过来的意思就是将ON替换成开启,将OFF替换成关闭
* replace = {"ON_开启", "OFF_关闭"}
* private String status;
*/
String[] replace() default {
};
}
再就是@EnableSelectList
,允许使用下拉列表
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 允许使用下拉列表
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EnableSelectList {
}
还有@ImportIndex
,导入的时候设置Excel中的列对应的序号
package com.jiuren.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 导入时索引
* 从0开始
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ImportIndex {
/**
* 索引
*/
int index() ;
/**
* 设置set方法
*/
String useSetMethodName() default "";
}
还有颜色的枚举
import org.apache.poi.hssf.util.HSSFColor;
public enum ColorEnum {
RED("红色", HSSFColor.RED.index),
GREEN("绿色", HSSFColor.GREEN.index),
BLANK("白色", HSSFColor.WHITE.index),
YELLOW("黄色", HSSFColor.YELLOW.index),
BLUE("蓝色", HSSFColor.CORNFLOWER_BLUE.index),
ROYAL_BLUE("宝蓝色", HSSFColor.ROYAL_BLUE.index),
CORAL("珊瑚", HSSFColor.CORAL.index),
ORCHID("兰花", HSSFColor.ORCHID.index),
MAROON("栗色", HSSFColor.MAROON.index),
LEMON_CHIFFON("柠檬雪纺", HSSFColor.LEMON_CHIFFON.index),
CORNFLOWER_BLUE("矢车菊蓝", HSSFColor.CORNFLOWER_BLUE.index),
LAVENDER("薰衣草", HSSFColor.LAVENDER.index),
PALE_BLUE("淡蓝", HSSFColor.PALE_BLUE.index),
LIGHT_TURQUOISE("浅绿松石", HSSFColor.LIGHT_TURQUOISE.index),
LIGHT_GREEN("浅绿色", HSSFColor.LIGHT_GREEN.index),
LIGHT_YELLOW("浅黄色", HSSFColor.LIGHT_YELLOW.index),
ROSE("玫瑰色", HSSFColor.ROSE.index),
SKY_BLUE("天蓝色", HSSFColor.SKY_BLUE.index);
private String name;
private short index;
private ColorEnum(String name, short index) {
this.name = name;
this.index = index;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public short getIndex() {
return index;
}
public void setIndex(short index) {
this.index = index;
}
}
一些用到的常量
/**
* 自定义Excel中常用常量类
*
* @author LWL
* @date 2022/04/24 17:50
*/
public class ExcelConstants {
/**
* 常用日期格式
*/
public static final String YYYY_MM_DD = "yyyy-MM-dd";
public static final String YYYY_MM_DD_CHINESE = "yyyy年MM月dd日";
public static final String YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";
public static final String YYYY_MM_DD_HH_MM_CHINESE = "yyyy年MM月dd日 HH时mm分";
public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
public static final String YYYY_MM_DD_HH_MM_SS__CHINESE = "yyyy年MM月dd日 HH时mm分ss秒";
public static final String YYYY_MM_DD_HH_MM_SS_SSS = "yyyy-MM-dd HH:mm:ss.SSS";
public static final String YYYY_MM_DD_HH_MM_SS_SSS__CHINESE = "yyyy年MM月dd日 HH时mm分ss秒SSS毫秒";
public static final String YYYY_MM_DD_HH_MM_NO_SEPARATOR = "yyyyMMddHHmm";
public static final String YYYY_MM_DD_HH_MM_SS_NO_SEPARATOR = "yyyyMMddHHmmss";
/**
* getter/setter方法
*/
public static final String METHOD_GET = "get";
public static final String METHOD_SET = "set";
/**
* excel导出的版本后缀 03 xls / 07 xlsx
*/
public static final String XLS = ".xls";
public static final String XLSX = ".xlsx";
/**
* 通过网络请求 http 导出 excel 时 response 响应信息的一些设置规则
*/
public static final String RESPONSE_CONTENT_TYPE = "application/vnd.ms-excel";
public static final String RESPONSE_CHARACTER_ENCODING_UTF8 = "utf-8";
public static final String RESPONSE_HEADER_NAME = "Content-Disposition";
public static final String RESPONSE_HEADER_VALUE = "attachment; filename=";
public static final String USER_AGENT = "User-Agent";