使用easy_poi完成excel表的传输

easypoi介绍

EasyPoi是一个基于Apache POIJava Excel导入导出框架,它可以帮助开发人员快速、方便地实现Excel文件的导入和导出功能。EasyPoi提供了丰富的API和注解,使得操作Excel变得简单而高效。

@Excel注解参数

属性 类型 默认值 功能
name String null 列名,支持name_id
needMerge boolean fasle 是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row)
orderNum String “0” 列的排序,支持name_id
replace String[] {} 值得替换 导出是{a_id,b_id} 导入反过来
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,读取失败,支持name_id
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 变成90%
isWrap boolean true 是否换行 即支持\n
mergeRely int[] {} 合并单元格依赖关系,比如第二列合并是基于第一列 则{0}就可以了
mergeVertical boolean fasle 纵向合并内容相同的单元格
fixedIndex int -1 对应excel的列,忽略名字
isColumnHidden boolean false 导出隐藏列

依赖导入

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

导出(包含图片)

实体类

创建实体类,其中我们的一个user对应着多个course,我们使用ExcelCollection注解表示。如果是一对一的关系,我们这个实体还需要对应一个对象的话,可以使用ExcelEntity注解表示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Data
@NoArgsConstructor
@AllArgsConstructor
@ExcelTarget("user")
public class User implements Serializable {
//忽略这个字段
@ExcelIgnore
private static final long serialVersionUID = 8396566671249699691L;
@Excel(name = "学生编号")
Integer id;
@Excel(name = "姓名")
String name;

//使用本地图片url来导入图片,type=2代表这个字段是图片
@Excel(name = "学生头像",width = 20,height = 20,type = 2)
String photo;

@ExcelCollection(name = "选课")
List<Course> courses;
}
1
2
3
4
5
6
7
8
9
10
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Course {
@Excel(name = "课程编号")
Integer courseId;

@Excel(name = "课程名")
String courseName;
}

Controller(上传本地的图片)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@RestController
@RequestMapping("/easypoi")
public class POIController {

@RequestMapping("/export")
public int importExcel(HttpServletRequest request) throws IOException {
ExportParams params = new ExportParams("学生表","sheet1");
User user = new User(1,"zgy","D:\\desktop\\Snipaste_2024-01-22_14-13-04.png", Arrays.asList(new Course(1,"课程1"),new Course(2,"课程12")));
List<User> users = new ArrayList<>();
users.add(user);
Workbook sheets = ExcelExportUtil.exportExcel(params, User.class, users);
FileOutputStream outputStream = new FileOutputStream("D:\\desktop\\users.xls");
sheets.write(outputStream);
outputStream.close();
sheets.close();
return 1;
}
}

效果图

Controller(上传远程的图片)

从远程url读取byte数组。

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
37
38
39
@RestController
@RequestMapping("/easypoi")
public class POIController {

@RequestMapping("/export")
public int importExcel(HttpServletRequest request) throws Exception {
ExportParams params = new ExportParams("学生表","sheet1");
User user = new User(1,"zgy",readUrlAsBytes("https://cdn.acwing.com/media/user/profile/photo/80738_lg_e91297d1fd.jpg"), Arrays.asList(new Course(1,"课程1"),new Course(2,"课程12")));
List<User> users = new ArrayList<>();
users.add(user);

Workbook sheets = ExcelExportUtil.exportExcel(params, User.class, users);
FileOutputStream outputStream = new FileOutputStream("D:\\desktop\\users.xls");
sheets.write(outputStream);
outputStream.close();
sheets.close();

return 1;
}


public static byte[] readUrlAsBytes(String urls) throws Exception {
URL url = new URL(urls);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
URLConnection urlConnection = url.openConnection();
urlConnection.setReadTimeout(10*1000);
InputStream inputStream = urlConnection.getInputStream();
byte[] bytes = new byte[1024];
int len = 0;
while((len = inputStream.read(bytes)) != -1){
byteArrayOutputStream.write(bytes,0,len);
}
byte[] result = byteArrayOutputStream.toByteArray();
byteArrayOutputStream.close();
inputStream.close();
return result;
}
}

pojo

这里我们不仅需要把图片的类型改成byte[]还需要把注解里面的imageType设置成2。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Data
@NoArgsConstructor
@AllArgsConstructor
@ExcelTarget("user")
public class User implements Serializable {
@ExcelIgnore
private static final long serialVersionUID = 8396566671249699691L;
@Excel(name = "学生编号")
Integer id;
@Excel(name = "姓名")
String name;

@Excel(name = "学生头像",width = 20,height = 20,type = 2,imageType = 2)
byte[] photo;

@ExcelCollection(name = "选课")
List<Course> courses

}

效果

导入

这里面的导入只选择简单的导入,我们修改pojo内部不包含任何对象。注意导入需要设置图片的保存路径,不然的话回保存在默认的位置。

pojo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Data
@NoArgsConstructor
@AllArgsConstructor
@ExcelTarget("user")
public class User implements Serializable {
@ExcelIgnore
private static final long serialVersionUID = 8396566671249699691L;
@Excel(name = "学生编号")
Integer id;
@Excel(name = "姓名")
String name;

@Excel(name = "学生头像",width = 20,height = 20,type = 2,imageType = 1,savePath = "D:\\desktop")
String photo;
}

controller

1
2
3
4
5
6
7
8
9
10
@RequestMapping("/import")
public int importExcel(HttpServletRequest request) throws Exception {
ImportParams importParams = new ImportParams();
importParams.setHeadRows(1);
importParams.setTitleRows(1);
FileInputStream inputStream = new FileInputStream("D:\\desktop\\users.xls");
List<Object> objects = ExcelImportUtil.importExcel(new File("D:\\desktop\\users.xls"), User.class, importParams);
objects.stream().forEach(System.out::println);
return 1;
}