
EasyPoi是一款开源的软件,用于开发EXCEL表格的导入和导出功能,简单易上手,代码量也很少,非常适合初学者去使用。我们使用Java开发Excel导入导出功能,以前常用的是Poi,但是需要编写的代码量太多,使用EasyPoi仅需要在代码中添加注解,便可以完成大部分普通的Excel编辑工作。
工具/材料IntelliJ IDEA
01我们是使用Maven管理项目,首先我们需要添加开发EasyPoi所依赖的jar包,如下所示。
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>3.1.0</version>
</dependency>
02EasyPoi 可以自适应Excel的xls和xlsx两种格式,我们今天主要讲解使用注解进行导入和导出的功能,我们只要修改注解就可以修改Excel的字段和格式。我们需要编写实体和Excel表格的对应关系,在实体上添加注解。@Excel 注解作用到filed(列)上面,是对列的描述。@Excel注解的name属性即为列名,format用于设置时间的格式。我们创建一个PersonEntity,实现序列化接口,并添加如下的注解,另外该类需要getter和setter方法。
03我们写一个测试类去测试导出功能,创建一个测试类,并在main方法中编写测试代码,我们使用easypoi工具类ExcelExportUtil 的exportExcel方法,其中new ExportParams()是标题和sheet的基本设置,当然这些设置有些不是必须的,可以根据需要自行修改。具体的导出代码如下图所示。
04接下来我们右键执行该方法,此时会生成一个excel文件,如下图所示,我们可以看到设置的标题和数据已存在该excel表格中。
05接下来我们编写导入的方法,将上面生成的excel表格导入,使用ExcelImportUtil工具类的importExcel方法,ImportParams用于设置导入参数。
06接下来我们测试导入功能,在执行方法后提示创建对象异常,我们需要检查异常的原因,此时发现我们上面创建的实体类没有无参构造方法,因为我们已经创建了一个有参的构造,就不会帮我们自动创建无参构造了,因此我们需要手动创建,如下图所示。
07另外,我们在编写PersonEntity实体类时,步骤2的id字段上面没有@Excel注解,所以该字段不起任何作用,若不需要的话可以删除。
特别提示EasyPoi注解作用的实体类一定要有无参构造,若实体类中存在有参构造,一定要手动创建一个无参构造。
本文章向大家介绍最简单使用easypoi导入导出Excel的 *** 作手册(回炉),主要内容包括easypoi 简介、特性、常用注解、@ExcelCollection 注解、@ExcelEntity注解、@ExcelIgnore 注解、@ExcelTarget 注解、1.引入依赖、注解方式导出Excel、导出对应的Bean、导出结果、关于日期格式化的说明、ImportParams参数介绍、导入情形一:有标题有表头、导入情形二:有表头没有标题、导入实体Bean配置、Excel导入校验、定制化修改、总结、参考代码、参考、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。概况
今天做Excel导出时,发现了一款非常好用的POI框架EasyPoi,其 使用起来简洁明了。现在我们就来介绍下EasyPoi,首先感谢EasyPoi 的开发者 Lemur开源
easypoi 简介
easypoi 是为了让开发者快速的实现excel,word,pdf的导入导出,基于Apache poi基础上的一个工具包。
特性
基于注解的导入导出,修改注解就可以修改Excel
支持常用的样式自定义
基于map可以灵活定义的表头字段
支持一对多的导出,导入
支持模板的导出,一些常见的标签,自定义标签
支持HTML/Excel转换
支持word的导出,支持图片,Excel
常用注解
@Excel注解
@Excel 注解是作用到Filed 上面,是对Excel一列的一个描述,这个注解是必须要的注解,其部分属性如下:
在这里插入图片描述 其使用如下,其中orderNum是指定该字段在Excel中的位置,name与Excel中对应的表头单元格的名称
@Excel(name = "主讲老师", orderNum = "1")
private String name
@ExcelCollection 注解
@ExcelCollection 注解表示一个集合,主要针对一对多的导出 比如一个老师对应多个科目,科目就可以用集合表示,作用在一个类型是List的属性上面,属性如下:
在这里插入图片描述 其使用如下所示。
@ExcelCollection(name = "学生", orderNum = "4")
private List<StudentEntity>students
@ExcelEntity注解
@ExcelEntity注解表示一个继续深入导出的实体,是作用一个类型为实体的属性上面,其属性如下:
在这里插入图片描述 其使用如下所示。
@ExcelEntity(id = "major")
private TeacherEntity chineseTeacher
@ExcelIgnore 注解
@ExcelIgnore 注解修饰的字段,表示在导出的时候,被忽略。
@ExcelTarget 注解
@ExcelTarget注解作用于最外层的对象,描述这个对象的id,以便支持一个对象,可以针对不同导出做出不同处理,其作用在实体类的上,属性如下:
在这里插入图片描述 其使用如下:
@ExcelTarget("scoreIssueReqPOJO")
public class ScoreIssueReqPOJO implements java.io.Serializable{}
# EasyPOI的使用
1.引入依赖
SSM 项目,引入依赖 如果spring的版本是4.x的话引入的easypoi的版本是`3.0.1`,如果spring是5.x的话引入easypoi的版本是`4.0.0`
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>4.0.0</version>
</dependency>
Spring Boot 项目(2.x以上的版本,我demo的版本是2.1.3.RELEASE),引入依赖
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.0.0</version>
</dependency>
需要注意的是由于easypoi的依赖内部依赖原生的poi,所以,引入了easypoi的依赖之后,需要把原生的poi的依赖删掉
注解方式导出Excel
导出测试的demo
@Test
public void testExportExcel() throws Exception {
List<CourseEntity>courseEntityList = new ArrayList<>()
CourseEntity courseEntity = new CourseEntity()
courseEntity.setId("1")
courseEntity.setName("测试课程")
TeacherEntity teacherEntity = new TeacherEntity()
teacherEntity.setName("张老师")
teacherEntity.setSex(1)
courseEntity.setMathTeacher(teacherEntity)
List<StudentEntity>studentEntities = new ArrayList<>()
for (int i = 1i <= 2i++) {
StudentEntity studentEntity = new StudentEntity()
studentEntity.setName("学生" + i)
studentEntity.setSex(i)
studentEntity.setBirthday(new Date())
studentEntities.add(studentEntity)
}
courseEntity.setStudents(studentEntities)
courseEntityList.add(courseEntity)
Date start = new Date()
Workbook workbook = ExcelExportUtil.exportExcel( new ExportParams("导出测试", null, "测试"),
CourseEntity.class, courseEntityList)
System.out.println(new Date().getTime() - start.getTime())
File savefile = new File("D:/excel/")
if (!savefile.exists()) {
savefile.mkdirs()
}
FileOutputStream fos = new FileOutputStream("D:/excel/教师课程学生导出测试.xls")
workbook.write(fos)
fos.close()
}
导出对应的Bean
CourseEntity 类。
@ExcelTarget("courseEntity")
public class CourseEntity implements java.io.Serializable {
/** 主键 */
private Stringid
/** 课程名称 */
@Excel(name = "课程名称", orderNum = "1", width = 25,needMerge = true)
private Stringname
/** 老师*/
@ExcelEntity(id = "absent")
private TeacherEntity mathTeacher
@ExcelCollection(name = "学生", orderNum = "4")
private List<StudentEntity>students
TeacherEntity 类
@Data
public class TeacherEntity {
/**
* 学生姓名
*/
@Excel(name = "教师姓名", height = 20, width = 30, isImportField = "true_st")
private String name
/**
* 学生性别
*/
@Excel(name = "教师性别", replace = {"男_1", "女_2"}, suffix = "生", isImportField = "true_st")
private int sex
}
StudentEntity 类。
public class StudentEntity implements java.io.Serializable {
/**
* id
*/
private Stringid
/**
* 学生姓名
*/
@Excel(name = "学生姓名", height = 20, width = 30, isImportField = "true_st")
private Stringname
/**
* 学生性别
*/
@Excel(name = "学生性别", replace = { "男_1", "女_2" }, suffix = "生", isImportField = "true_st")
private int sex
@Excel(name = "出生日期", exportFormat = "yyyyMMddHHmmss", format = "yyyy-MM-dd", isImportField = "true_st", width = 20)
private Date birthday
@Excel(name = "进校日期", exportFormat = "yyyyMMddHHmmss", format = "yyyy-MM-dd")
private Date registrationDate
导出结果
在这里插入图片描述
关于日期格式化的说明
如果是导出的实体类(就是说这个实体类是对应导出的Excel的),那么用@Excel注解的exportFormat属性来格式化日期。如下所示:
@Excel(name = "出生日期", exportFormat = "yyyy-MM-dd HH:mm:ss", width = 20)
如果是导入的实体类(就是说这个实体类是对应导入的Excel的),那么用@Excel注解的importFormat属性来格式化日期。如下所示:
@Excel(name = "添加时间",importFormat = "yyyy-MM-dd HH:mm:ss",orderNum = "14")
private Date createTime
@Excel注解的databaseFormat 属性是用于数据库的格式不是日期类型,如datetime类型时使用。 注解方式导入Excel 基于注解的导入导出,配置配置上是一样的,只是方式反过来而已。首先让我们来看看 ImportParams类,这个类主要是设置导入参数,例如表格行数,表头行数等等。
ImportParams参数介绍
在这里插入图片描述 需要说明的是 1、titleRows表示的是表格标题行数,如果没有就是0,如果有一个标题就是1,如果是两个标题就2 2. headRows表示的是表头行数,默认是1,如果有两个表头则需要设置2。
导入情形一:有标题有表头
我们有如下格式的Excel需要导入:
在这里插入图片描述 这个Excel有一个标题行,有一个表头行,所以我们有了如下设置:
ImportParams params = new ImportParams()
//设置标题的行数,有标题时一定要有
params.setTitleRows(1)
//设置表头的行数
params.setHeadRows(1)
导入的demo
@Test
public void haveTitleTest() {
ImportParams params = new ImportParams()
//设置标题的行数,有标题时一定要有
params.setTitleRows(1)
//设置表头的行数
params.setHeadRows(1)
String file = Thread.currentThread().getContextClassLoader().getResource("haveTitle.xlsx").getFile()
List<ScoreIssueReqPOJO>list = ExcelImportUtil.importExcel(
new File(file),
ScoreIssueReqPOJO.class, params)
System.out.println("解析到的数据长度是:" + list.size())
for (ScoreIssueReqPOJO scoreIssueReqPOJO : list) {
System.out.println("***********有标题有表头导入的数据是=" + scoreIssueReqPOJO.toString())
}
}
导入测试的结果是:
在这里插入图片描述
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)