Easypoi 可能你已经听过并使用过了,不过今天想讨论的东西,你真有可能还不知道?希望你能了解到新的知识!
关于 easypoi 如何使用,其实看人家的官方文档就够了,EasyPoi
这里先不罗列通用的使用教程了,因为今天主要想讲一件事:
关于 EasyPoi 官方文档中提到的 ‘注解 ID’ 的使用方式, 以及我推演出的一种多场景导出的使用模式
文章目录
-
-
- **疑问的产生**
- 分析过程
- 使用方式示例
-
- 场景:
- 上代码
-
疑问的产生
起因是,在学习 easypoi 的使用
注解
导出的过程中,在官方文档里看到了对注解中 ID 简单介绍,对此产生了疑惑,并且没找到正确的使用方式。
官方介绍如下图,从这里关于 ID 的使用描述,隐约感觉到:
这个 ID 是为了复用一些东西,支持多场景导出的用的?有点类似 @validated 的 group 的意思。
但是,看一下例子产生了一些疑问,既然 name_id 的形式,是支持多 target Id 的,那 target Id 是在哪里定义的呢?
你给出的 demo 里 target Id 定义在实体上面
@ExcelTarget("teacherEntity")
,已经明确了实体的 id(
teacherEntity
),那么讲道理针对 @Excel 里 target id,比如这里的
代课老师_absent
,是如何能被使用的?从这个例子上看是不可能的。
分析过程
针对 ID 更多的描述,和使用方式,官网上就再也找不到实例了,网络上也搜了下,一个没有!看来大佬都没有疑问。。。
本想得过且过,大不了不用这个特性吧,我呢确实也是这么执行的,先把手里需求按正常的使用方式做完,有空了再来研究更多使用方式。
产生了疑惑之后,根据经验,其实脑袋里对 ID 如何使用,有些预设的使用方法,自己抽空便验证了下自己的想法。
先看下注解导出 excel 的常规使用方法:
// 源码位置
cn.afterturn.easypoi.excel.ExcelExportUtil#exportExcel(cn.afterturn.easypoi.excel.entity.ExportParams, java.lang.Class<?>, java.util.Collection<?>)
/**
* @param entity 表格标题属性
* @param pojoClass Excel对象Class
* @param dataSet Excel对象数据List
*/
public static Workbook exportExcel(ExportParams entity, Class<?> pojoClass,
Collection<?> dataSet) {
Workbook workbook = getWorkbook(entity.getType(), dataSet.size());
new ExcelExportService().createSheet(workbook, entity, pojoClass, dataSet);
return workbook;
}
这里关注两点,一个是我们要导出的数据集dataSet,另一个是 pojoClass,
那么,既然是分两个参数的,那么讲道理你需要支持我传递多种 pojoClass 类型,才能支持你分组的概念是不?
所以,我这里有个猜想,pojoClass 的作用之一便是:根据它携带的@Excel 等注解,作为导出字段的源信息(就是标识下要导出哪些字段,格式什么样等等)存在的,所以在工具使用上,一个 dataSet,应该可以对应多种 pojoClass 类型的。
可惜网络上没有找到这样的案例,不然不会有此文了。。。
使用方式示例
这里写了个小 DEMO,推演出一种多场景数据导出的使用方式,也算验证了上面的猜想。
下面看下我推演出的多场景导出的一种使用方式。
场景:
XXX系统里关于用户信息的导出,有两种形式,一种是普通的导出,包含用户的基本信息。另一种领导要求看到一些隐私信息,比如”工资“信息?
这种场景其实就是多场景导出。
上代码
代码地址:[easpoi 注解使用方式推演](growing/easy-poi at master · yuansaysay/growing · GitHub)
推演出的注解使用方式主要有两点注意事项:
-
我们的业务对象, UserManageBO,不含 easypoi 相关的注解
要导出的数据源, dataSet 里就是这个对象,这个对象只包含业务数据
-
不同的场景类,比如 UserExportCase1、UserImportCase2,继承自 UserManageBO,是 easypoi 注解的承载体
场景类的作用是定义导出源信息,所以这里只需要定义要到处的 @Excel 等信息,正常怎么定义就怎么定义。
具体看下代码,感受下不同组件的使命。
业务数据源
使命:纯业务承载。
UserManageBO ,包含用户的 id,姓名,地址,工资信息,不含 easypoi 相关的注解
package com.yuansaysay.learning.easypoi.model;
/**
* 用户管理业务对象
* @author yss<br>
* @createDate 2021/07/17 16:46
*/
public class UserManageBO {
private Integer id;
private String name;
private String address;
private String salary;
// 省略了字段的 setter getter 方法
}
场景类
使命:easypoi 注解的载体
UserExportCase1 只导出用户基本信息 id, name, address
/**
* 用户导出场景1, 导出 id, name, address
* @author yss<br>
* @createDate 2021/07/17 16:47
*/
@ExcelTarget("userExportCase1")
public class UserExportCase1 extends UserManageBO{
@Excel(name = "ID", width = 20)
private Integer id;
@Excel(name = "姓名", width = 20)
private String name;
@Excel(name = "地址", width = 20)
private String address;
}
UserImportCase2 会导出用户敏感信息 salary
/**
* 导出 id, name, address, salary
* @author yss<br>
* @createDate 2021/07/17 16:47
*/
public class UserImportCase2 extends UserManageBO{
@Excel(name = "ID", width = 20)
private Integer id;
@Excel(name = "姓名", width = 20)
private String name;
@Excel(name = "地址", width = 20)
private String address;
@Excel(name = "工资", width = 20)
private String salary;
}
导出过程
public static void main(String[] args) throws IOException {
// 1. 业务数据准备,准备要导出的数据
List<UserManageBO> users = getUserBizData();
// 2.场景1:普通导出
FileOutputStream fileOutputStream1 = new FileOutputStream(new File("D://普通导出.xlsx"));
Workbook workbook1 = EasyPoiUtil.createDefaultWorkbook(users, UserExportCase1.class, "用户信息");
workbook1.write(fileOutputStream1);
List<UserManageBO> users2 = getUserBizData();
// 3.场景2:隐私导出
FileOutputStream fileOutputStream2 = new FileOutputStream(new File("D://隐私导出.xlsx"));
Workbook workbook2 = EasyPoiUtil.createDefaultWorkbook(users2, UserImportCase2.class, "用户信息");
workbook2.write(fileOutputStream2);
}
导出结果
导出结果和导出场景注解类对应图
- 场景1
- 场景2
不知我说清楚了没,对于 easypoi 注解的使用,你怎么看呢?
其实我虽然推演出了这种注解的使用方式,可能也是作者推荐的方式。但是个人觉得 easypoi 可以做的更好的,比如:导出场景类可以不依赖(现在需要继承)原来的业务类,完全和业务类解耦。当然这只是个人yi想,不一定有什么价值~~