使用EasyPoi

本文最后更新于:2 分钟前

本文参考下方方链接整理而成

简介

Easypoi的目标不是替代poi,而是让一个不懂导入导出的快速使用poi完成Excel和word的各种操作,而不是看很多api才可以完成这样工作。

使用

  • 1.easypoi 父包–作用大家都懂得
  • 2.easypoi-annotation 基础注解包,作用与实体对象上,拆分后方便maven多工程的依赖管理
  • 3.easypoi-base 导入导出的工具包,可以完成Excel导出,导入,Word的导出,Excel的导出功能
  • 4.easypoi-web 耦合了spring-mvc 基于AbstractView,极大的简化spring-mvc下的导出功能
  • 5.sax 导入使用xercesImpl这个包(这个包可能造成奇怪的问题哈),word导出使用poi-scratchpad,都作为可选包了

如果不使用spring mvc的便捷福利,直接引入easypoi-base 就可以了,easypoi-annotation

如果使用maven,请使用如下坐标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>4.1.0</version>
</dependency>

spring boot 依赖

1
2
3
4
5
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.0.0</version>
</dependency>

注解

常用注解介绍:

  • @Excel 作用到filed上面,是对Excel一列的一个描述
  • @ExcelCollection 表示一个集合,主要针对一对多的导出,比如一个老师对应多个科目,科目就可以用集合表示
  • @ExcelEntity 表示一个继续深入导出的实体,但他没有太多的实际意义,只是告诉系统这个对象里面同样有导出的字段
  • @ExcelIgnore 和名字一样表示这个字段被忽略跳过这个导导出
  • @ExcelTarget 这个是作用于最外层的对象,描述这个对象的id,以便支持一个对象可以针对不同导出做出不同处理

点击这里 详细介绍

测试导出

IDEA新建一个普通的maven项目,导入所需依赖

新建一个User实体类,测试类,用来模拟数据

注意:实体类必须实现序列化接口

User.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Data
@ExcelTarget("users")
public class User implements Serializable {

// @Excel(name = "编号")
@ExcelIgnore
private String id;

@Excel(name = "姓名")
private String name;

@Excel(name = "状态", replace = {"激活_1", "锁定_0"})
private String status;

@Excel(name = "生日", width = 35.0, format = "yyyy-MM-dd HH:mm:ss")
private Date bir;

@Excel(name = "年龄")
private String age;
}

TestCode.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class TestCode {
// 模拟数据
public List<User> getList() {
List<User> users = new ArrayList<>();
for (int i = 0; i < 5; i++) {
User user = new User();
user.setId(String.valueOf(i));
user.setName("哈哈" + i);
if (i % 2 == 0) {
user.setStatus("1");
} else {
user.setStatus("0");
}
user.setBir(new Date());
user.setAge(String.valueOf(10 + i));
users.add(user);
}
return users;
}

// 导出 Excel
@Test
public void export() throws IOException {
// 获取数据
List<User> list = getList();
// 导出 Excel
// 参数1:ExportParams 导出配置对象 参数2:导出的类型 参数3:导出数据集合
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户信息", "用户sheet"), User.class, list);
// 将Excel写入到指定位置
FileOutputStream outputStream = new FileOutputStream("C:\\Users\\26400\\Desktop\\test.xls");
workbook.write(outputStream);
outputStream.close();
workbook.close();
}
}

这样简单的导出就可以了,启动测试即可。

导出List 集合

实体类新增 爱好字段

1
2
@Excel(name = "爱好",width = 30.0)
public List<String> hobbys;

赋值

1
2
3
4
5
6
7
if (i % 2 == 0) {
user.setStatus("1");
user.setHobbys(Arrays.asList("看电视","写代码"));
} else {
user.setStatus("0");
user.setHobbys(Arrays.asList("听音乐","旅游"));
}

导出之后发现是这种格式的 [看电视, 写代码]

自定义格式

改造实体类如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//    @Excel(name = "爱好",width = 30.0)
public List<String> hobbys;

@Excel(name = "爱好", width = 30.0)
public String hobbystr;

public String getHobbystr() {
StringBuffer buffer = new StringBuffer();
for (String hobby : hobbys) {
if (hobby.length() != 0) {
buffer.append(hobby).append("、");
}
buffer.append(hobby);
}
return buffer.toString();
}

通过自定义 get方法进行格式的转换。

导出对象中含有对象

修改User实体类

1
2
@ExcelEntity // 标识一对一关系
private Card card;

新建Card.java

1
2
3
4
5
6
7
8
9
10
@Data
@ExcelTarget("card")
public class Card implements Serializable {

@Excel(name = "身份证号", width = 20.0)
private String no;

@Excel(name = "家庭地址",width = 20.0)
private String address;
}

修改测试类

1
2
3
4
5
6
// 赋值的时候给 card 赋值 在 getList()中加入即可
// 身份信息
Card card = new Card();
card.setNo("2314124124124124");
card.setAddress("山东省济南市长清区");
user.setCard(card);

导出多个对象

修改USer.java

1
2
@ExcelCollection(name = "订单列表")
private List<Order> orders;

新建Order.java

1
2
3
4
5
6
7
8
9
10
@ExcelTarget("orders")
@Data
public class Order implements Serializable {

@Excel(name = "订单编号",width = 20.0)
private String number;

@Excel(name = "订单名称")
private String name;
}

赋值

1
2
3
4
5
6
7
8
9
// 订单信息;
List<Order> orders = new ArrayList<>();
for (int j = 0; j < 3; j++) {
Order order = new Order();
order.setNumber(String.valueOf(System.currentTimeMillis()));
order.setName("订单" + j);
orders.add(order);
}
user.setOrders(orders);

导出图片

修改User.java

1
2
3
// height 将来会废弃
@Excel(name = "头像", width = 20, height = 20, type = 2) // type = 2 为图片类型
private String photo;

赋值

1
user.setPhoto("C:\\Users\\26400\\Desktop\\logo.png");

测试即可。

导入Excel

导入基本数据

基本的导入功能,先创建一个Excel文件模板

创建一个对应的实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Data
@ExcelTarget("emp")
public class Emp implements Serializable {

@Excel(name = "编号")
private String id;

@Excel(name = "姓名")
private String name;

@Excel(name = "年龄")
private Integer age;

@Excel(name = "生日", format = "yyyy-MM-dd HH:mm:ss")
private Date bir;

@Excel(name = "状态", replace = {"激活_1", "锁定_0"})
private String status;
}

新增导入方法

1
2
3
4
5
6
7
8
9
@Test
public void exImport() throws Exception {
ImportParams params = new ImportParams();
params.setTitleRows(1); //标题列占几行
params.setHeadRows(1); // header 占几行
// 参数1:导入Excel文件流 参数2:导入类型 参数3:导入的配置对象
List<Emp> emps = ExcelImportUtil.importExcel(new FileInputStream("C:\\Users\\26400\\Desktop\\导入.xls"), Emp.class, params);
emps.forEach(System.out::println);
}

运行后结果:

1
2
3
4
5
Emp(id=0, name=哈哈0, age=10, bir=Mon Nov 22 18:31:20 CST 2021, status=1)
Emp(id=1, name=哈哈1, age=11, bir=Mon Nov 22 18:31:20 CST 2021, status=0)
Emp(id=2, name=哈哈2, age=12, bir=Mon Nov 22 18:31:20 CST 2021, status=1)
Emp(id=3, name=哈哈3, age=13, bir=Mon Nov 22 18:31:20 CST 2021, status=0)
Emp(id=4, name=哈哈4, age=14, bir=Mon Nov 22 18:31:20 CST 2021, status=1)

其他小技巧

  • 读取指定的sheet,比如读取上传的第二个sheet

    1
    params.setStartSheetIndex(1);
  • 读取几个sheet,比如读取前两个sheet

    1
    params.setSheetNum(2);
  • 读取第2个到第5个sheet

    1
    2
    params.setStartSheetIndex(1);
    params.setSheetNum(4);
  • 读取全部的sheet

    1
    2
    // 设置的大一点
    params.setSheetNum();
  • 判断一个Excel是否合法

    1
    params.setImportFields(new String[]{"编号", "状态"});

本文作者: 仅安
本文链接: https://jinan6.vip/posts/3152055069/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!