天天看點

關于 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想,不一定有什麼價值~~

繼續閱讀