Excel的导入与导出,整合POI和easyExcel进行二次封装和方法优化,实现更简单调用、更多方法选择和更多种数据返回,能够自动保存数据到数据库,兼容所有版本的Excel文件,支持xlsx和xls。

POI 和 EasyExcel 都各有优点和不足,用poi也挺好挺好,没有必要一定要用easyexcel。如果数据量大,如导出数据大于36656条可以考虑使用easyexcel,因为poi导出最大条数有限制。个人建议如果没有遇到OOM就用poi也挺好的。总的来说,EasyExcel 比 POI 在处理大数据量和内存消耗中要有很多优势,但毕竟也是进行的二次封装和优化,也有一些不足。

一、jar包依赖

<!--Excel操作相关开始-->
<!-- xls格式excel依赖包 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<!--xlsx格式excel依赖包-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<!-- easyexcel依赖包 -->
<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.6</version>
</dependency>
<!-- 文件上传依赖 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.55</version>
</dependency>

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!--<scope>provided</scope>-->
</dependency>

<!--Excel操作相关结束-->

二、EasyExcel 简单玩法

其实 POI 和 EasyExcel 两种使用起来已经比较简单了,多看一下相关的开发文档就可以实现相应的功能。但是,它们还不够最简单,最简单应该是什么呢?起码我只用写一行代码就可以完成 Excel 的导入或导出,自动返回需要的数据信息或者数据自动进入数据库,自动生成文件或下载。

简单使用一下 EasyExcel 的读取 Excel 功能,创建一个对象:

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import com.ycj.fastframe.excel.base.DataModel;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.util.List;

/**
* @author: Frank
* @email 1320259466@qq.com
* @date: 2020/4/4
* @time: 10:27
* @fuction: about the role of class.
*/


@HeadRowHeight(value = 40)
@ContentRowHeight(10)
@ColumnWidth(25)
public class UserExcel extends DataModel {
/**
* 用户ID
*/
@ExcelProperty(value = "用户ID", index = 0)
@ColumnWidth(value = 15)
private String userId;
/**
* 用户名
*/
@ExcelProperty(value = "用户名", index = 1)
@ColumnWidth(value = 15)
private String username;
/**
* 姓名
*/
@ExcelProperty(value = "姓名", index = 2)
@ColumnWidth(value = 15)
private String name;

/**
* 用户名
*/
@ExcelProperty(value = "年龄", index = 3)
@ColumnWidth(value = 15)
private int age;

/**
* 性别
*/
@ExcelProperty(value = "性别", index = 4)
@ColumnWidth(value = 15)
private String sex;

/**
* 电话
*/
@ExcelProperty(value = "电话", index = 5)
@ColumnWidth(value = 15)
private String phone;
/**
* 显示名称
*/
@ExcelProperty(value = "昵称", index = 6)
@ColumnWidth(value = 15)
private String nickname;
/**
* 密码
*/
@ExcelProperty(value = "密码", index = 7)
@ColumnWidth(value = 20)
private String password;
/**
* 邮箱
*/
@ExcelProperty(value = "邮箱", index = 8)
@ColumnWidth(value = 20)
private String email;
/**
* 头像
*/
@ExcelProperty(value = "头像", index = 9)
@ColumnWidth(value = 20)
private String avatar;
/**
* 0 正常
* 1 禁用
*/
@ExcelProperty(value = "状态\r0正常,1 禁用", index = 10)
@ColumnWidth(value = 20)
private String status;
/**
* 注册时间 yyyy-MM-dd HH:mm:ss格式
*/
@ExcelProperty(value = "注册时间", index = 11)
@ColumnWidth(value = 20)
private String createdTime;

public UserExcel(String userId, String username, String name, int age, String sex, String phone, String nickname, String password, String email, String avatar, String status, String createdTime) {
this.userId = userId;
this.username = username;
this.name = name;
this.age = age;
this.sex = sex;
this.phone = phone;
this.nickname = nickname;
this.password = password;
this.email = email;
this.avatar = avatar;
this.status = status;
this.createdTime = createdTime;
}

public UserExcel() {

}

public String getUserId() {
return userId;
}

public void setUserId(String userId) {
this.userId = userId;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public String getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}

public String getNickname() {
return nickname;
}

public void setNickname(String nickname) {
this.nickname = nickname;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getAvatar() {
return avatar;
}

public void setAvatar(String avatar) {
this.avatar = avatar;
}

public String getStatus() {
return status;
}

public void setStatus(String status) {
this.status = status;
}

public String getCreatedTime() {
return createdTime;
}

public void setCreatedTime(String createdTime) {
this.createdTime = createdTime;
}


@Override
public List<Object> readExcel(InputStream inputStream) {
return EasyExcel.read(new BufferedInputStream(inputStream)).head(UserExcel.class).sheet().doReadSync();
}
}

使用

=new UserExcel();
List<Object> list = userExcel.readExcel(new FileInputStream(new File("D://ceshi/test.xlsx")));
for (Object data:list){
userExcel= (UserExcel) data;
System.out.println(userExcel.getName()+" "+userExcel.getAge()+" "+userExcel.getSex()+" "+userExcel.getPhone());
}

总结:
还是感觉有点小麻烦啊,又要定义 对象类啥的,又要实现读取方法。

三、封装的jar包

1)、​​下载封装好的jar包​​​,并放入项目,具体可以参照下面的连接中的 “1.集成到项目” 这一章节:​

2)调用相应的方法导入 Excel ,返回数据信息 或 自动插入到指定的数据库中。

3)调用相应的方法导出 Excel ,把数据自动写入到指定的文件 或 自动通过 response 的 outputStrean 返回给用户下载。

4)相关的工具类,通过反射方法实现不同数据类型之间的转换。

5)在 base 包中定义好了 BaseModel 和 DataModel ,在实际使用中,封装的 jar 能够自动通过 反射 进行实例化和赋值,完成数据类型间的转换。

6)数据自动保存,在传入 数据库 连接信息和表名,可以自动把 Excel 中的数据保存到数据库中;也可以把数据库中的表信息导出到 Excel 文件中。

读取Excel:

Excel的导入与导出,整合POI和easyExcel进_导入


Excel的导入与导出,整合POI和easyExcel进_导出_02


写入Excel:

Excel的导入与导出,整合POI和easyExcel进_easyexcel_03


Excel的导入与导出,整合POI和easyExcel进_Excel_04

工具类:

Excel的导入与导出,整合POI和easyExcel进_POI_05


Excel的导入与导出,整合POI和easyExcel进_导出_06

​所需 jar 包下载地址​

​相关jar包集成​