依赖
<!-- https://mvnrepository.com/artifact/cn.afterturn/easypoi-spring-boot-starter -->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
注解用法说明

- @Excel 用在字段上面
- @ExcelCollection 表示根对象中的list
- @ExcelEntity 表示根对象中的实体
- @ExcelIgnore 忽略导出
- @ExcelTarget 绑定Id
@ExcelTarget 绑定Id
解决了相同的实体去映射Excel 但是表头名字不太相同
实现根据班级不同映射不同名字
这里的@ExcelTarget 表示使用X这个对象是可以针对不同字段做不同处理
同样的ExcelEntity 和ExcelCollection 都支持这种方式
@Excel 用在字段上面
| 属性 | 类型 | 默认值 | 功能 |
|---|---|---|---|
| name | String | null | 列名,支持ExcelTarget |
| needMerge | boolean | fasle | 纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row) |
| orderNum | String | “0” | 列的排序,支持ExcelTarget |
| replace | String[] | {} | 字符替换 导出是{“替换值_源”,“替换值_源”} |
| savePath | String | “upload” | 导入文件保存路径,如果是图片可以填写,默认是upload/className/ IconEntity这个类对应的就是upload/Icon/ |
| type | int | 1 | 导出类型 1 是文本 2 是图片,3 是函数,10 是数字 默认是文本 |
| width | double | 10 | 列宽 |
| height | double | 10 | 列高,后期打算统一使用@ExcelTarget的height,这个会被废弃,注意 |
| isStatistics | boolean | fasle | 自动统计数据,在追加一行统计,把所有数据都和输出[这个处理会吞没异常,请注意这一点] |
| isHyperlink | boolean | FALSE | 超链接,如果是需要实现接口返回对象 |
| isImportField | boolean | TRUE | 校验字段,看看这个字段是不是导入的Excel中有,如果没有说明是错误的Excel,读取失败,支持ExcelTarget |
| exportFormat | String | “” | 导出的时间格式,以这个是否为空来判断是否需要格式化日期 |
| importFormat | String | “” | 导入的时间格式,以这个是否为空来判断是否需要格式化日期 |
| format | String | “” | 时间格式,相当于同时设置了exportFormat 和 importFormat |
| databaseFormat | String | “yyyyMMddHHmmss” | 导出时间设置,如果字段是Date类型则不需要设置 数据库如果是string 类型,这个需要设置这个数据库格式,用以转换时间格式输出 |
| numFormat | String | “” | 数字格式化,参数是Pattern,使用的对象是DecimalFormat |
| imageType | int | 1 | 导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的 |
| suffix | String | “” | 文字后缀,如值实90 suffix="%" 变成90% |
| isWrap | boolean | TRUE | 是否换行 即支持\n |
| mergeRely | int[] | {} | 合并单元格依赖关系,比如第二列合并是基于第一列 则{0}就可以了 |
| mergeVertical | boolean | fasle | 纵向合并内容相同的单元格 |
| fixedIndex | int | -1 | 对应excel的列,忽略名字 |
| isColumnHidden | boolean | FALSE | 导出隐藏列 |
看下如何使用在下面有完全代码可以copy
@Data
@ExcelTarget("user1")
@Accessors(fluent = true)
public class TestBean implements Serializable {
@Excel(name = "A班级编号_user1,B班级编号_user2" ,//表头名称
width = 15.0, //宽度
orderNum = "0", //排序 这个排序在@ExcelEntity中也可以连贯使用 ExcelCollection内的Excel不可以连贯使用
needMerge = true)
private Integer id;
@Excel(name = "姓名",width = 15.0,orderNum = "1",needMerge = true)
private String name;
@Excel(name = "性別",
replace = {
"男_1","女_2"}, //字符替换 源实1代表男 2代表女
suffix = "生",//添加后缀
orderNum = "2",needMerge = true)
private int sex;
@Excel(name = "生日", databaseFormat = "yyyyMMddHHmmss",//如果是字符串的话>>同步数据库格式
format = "yyyy-MM-dd HH:mm:ss",//设置导入导出格式
orderNum = "3",
needMerge = true)
private Date bir;
@ExcelIgnore //不生成数据
@Excel(name = "生日2", databaseFormat = "yyyy-MM-dd HH:mm:ss",format = "yyyy-MM-dd HH:mm:ss",orderNum = "4")
private Date bir2;
@Excel(name = "照片",type = 2,//设置数据类型 2是图片
imageType = 1,//图片使用方式
orderNum = "8",width = 30,height = 30)
private String img;
@Excel(name = "照片2",type = 2,imageType = 2,orderNum = "8",width = 30,height = 30)
private byte[] img1;
@ExcelEntity //表示这是一个实体 其实相当于在根实体中添加其他字段的感觉
private Card card;
@ExcelCollection(name = "物品",orderNum = "7")//这个集合会在这个对象内循环遍历..之前的字段数据只在第一行显示
private List<Order> orders;
@ExcelCollection
| 属性 | 类型 | 默认值 | 功能 |
|---|---|---|---|
| id | String | null | 定义ID |
| name | String | null | 定义集合列名,支持ExcelTarget |
| orderNum | int | 0 | 排序,支持ExcelTarget |
| type | Class<?> | ArrayList.class | 导入时创建对象使用 |
实体代码
3个实体
@Data
@ExcelTarget("user1")
@Accessors(fluent = true)
public class TestBean implements Serializable {
public static String imgPath="imgs/company/baidu.png";
@Excel(name = "A班级编号_user1,B班级编号_user2" ,//表头名称
width = 15.0, //宽度
orderNum = "0", //排序 这个排序在@ExcelEntity中也可以连贯使用 ExcelCollection内的Excel不可以连贯使用
needMerge = true)
private Integer id;
@Excel(name = "姓名",width = 15.0,orderNum = "1",needMerge = true)
private String name;
@Excel(name = "性別",
replace = {
"男_1","女_2"}, //字符替换 源实1代表男 2代表女
suffix = "生",//添加后缀
orderNum = "2",needMerge = true)
private int sex;
@Excel(name = "生日", databaseFormat = "yyyyMMddHHmmss",//如果是字符串的话>>同步数据库格式
format = "yyyy-MM-dd HH:mm:ss",//设置导入导出格式
orderNum = "3",
needMerge = true)
private Date bir;
@ExcelIgnore //不生成数据
@Excel(name = "生日2", databaseFormat = "yyyy-MM-dd HH:mm:ss",format = "yyyy-MM-dd HH:mm:ss",orderNum = "4")
private Date bir2;
@Excel(name = "照片",type = 2,//设置数据类型 2是图片
imageType = 1,//图片使用方式
orderNum = "8",width = 30,height = 30)
private String img;
@Excel(name = "照片2",type = 2,imageType = 2,orderNum = "8",width = 30,height = 30)
private byte[] img1;
@ExcelEntity //表示这是一个实体 其实相当于在根实体中添加其他字段的感觉
private Card card;
@ExcelCollection(name = "物品",orderNum = "7")//这个集合会在这个对象内循环遍历..之前的字段数据只在第一行显示
private List<Order> orders;
//获取10条 完整数据
public static List<TestBean> getListUser(){
List<TestBean> list=new ArrayList<>();
for (int i = 1; i <= 10; i++) {
list.add(new TestBean().id(i).name("姓名"+i).bir(new Date()).sex(i%2==0?1:2).card(new Card())
.orders(getOrder())
.img(imgPath));
}
return list;
}
//只获取根对象数据 没有图片,list,实体
public static List<TestBean> getBigListFor10000(int page){
List<TestBean> list=new ArrayList<>();
for (int i = page; i <= page*10000; i++) {
list.add(new TestBean().id(i).name("姓名"+i).bir(new Date()).sex(i%2==0?1:2));
}
return list;
}
public static List<Order> getOrder(){
List<Order> list=new ArrayList<>();
for (int i = 1; i <=3 ; i++) {
list.add(new Order().id(i).name("物品"+i));
}
return list;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public Date getBir() {
return bir;
}
public void setBir(Date bir) {
this.bir = bir;
}
public Date getBir2() {
return bir2;
}
public void setBir2(Date bir2) {
this.bir2 = bir2;
}
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
public byte[] getImg1() {
return img1;
}
public void setImg1(byte[] img1) {
this.img1 = img1;
}
public Card getCard() {
return card;
}
public void setCard(Card card) {
this.card = card;
}
public List<Order> getOrders() {
return orders;
}
public void setOrders(List<Order> orders) {
this.orders = orders;
}
//校验文件目录
public static String existsDir(){
String dir="D:/eazyPoi/";
File savefile = new File(dir);
if





最低0.47元/天 解锁文章
2264





