天天看点

关于 EasyPoi 你不知道的事

Easypoi 可能你已经听过并使用过了,不过今天想讨论的东西,你真有可能还不知道?希望你能了解到新的知识!

关于 easypoi 如何使用,其实看人家的官方文档就够了,EasyPoi

这里先不罗列通用的使用教程了,因为今天主要想讲一件事:

关于 EasyPoi 官方文档中提到的 ‘注解 ID’ 的使用方式, 以及我推演出的一种多场景导出的使用模式

文章目录

      • **疑问的产生**
      • 分析过程
      • 使用方式示例
        • 场景:
        • 上代码

疑问的产生

起因是,在学习 easypoi 的使用

注解

导出的过程中,在官方文档里看到了对注解中 ID 简单介绍,对此产生了疑惑,并且没找到正确的使用方式。

官方介绍如下图,从这里关于 ID 的使用描述,隐约感觉到:

这个 ID 是为了复用一些东西,支持多场景导出的用的?有点类似 @validated 的 group 的意思。

关于 EasyPoi 你不知道的事

但是,看一下例子产生了一些疑问,既然 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)

推演出的注解使用方式主要有两点注意事项:

  1. 我们的业务对象, UserManageBO,不含 easypoi 相关的注解

    要导出的数据源, dataSet 里就是这个对象,这个对象只包含业务数据

  2. 不同的场景类,比如 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. 场景1
关于 EasyPoi 你不知道的事
  1. 场景2
关于 EasyPoi 你不知道的事

不知我说清楚了没,对于 easypoi 注解的使用,你怎么看呢?

其实我虽然推演出了这种注解的使用方式,可能也是作者推荐的方式。但是个人觉得 easypoi 可以做的更好的,比如:导出场景类可以不依赖(现在需要继承)原来的业务类,完全和业务类解耦。当然这只是个人yi想,不一定有什么价值~~

继续阅读