SpringBoot EasyPoi動(dòng)態(tài)導(dǎo)入導(dǎo)出的兩種方式實(shí)現(xiàn)方法詳解
前言
一開始為了圖方便,使用的是土方法,即創(chuàng)建多個(gè)不同的實(shí)體類,每個(gè)實(shí)體類對應(yīng)不同的列。這樣雖說能實(shí)現(xiàn),但實(shí)在不想多復(fù)制實(shí)體類,把代碼堆的和shi山一樣。于是查看官方文檔,里面確實(shí)提供了更加優(yōu)雅的實(shí)現(xiàn)方式。廢話不多說,開整。
一、基于@Excel的 isColumnHidden 屬性
我們項(xiàng)目使用的是注解方式導(dǎo)出,只需要在屬性上增加@Excel注解,就可以導(dǎo)出該屬性列。默認(rèn)大家都會使用了,不會使用的出門右轉(zhuǎn)去官網(wǎng)教程看看demo。
要?jiǎng)討B(tài)導(dǎo)出列,我們需要用到 isColumnHidden 這個(gè)屬性。

可以看到,isColumnHidden中提供的默認(rèn)值是false,也就是默認(rèn)全部導(dǎo)出,不隱藏。把值設(shè)為true,導(dǎo)出就沒有該列了。所以這個(gè)問題就變成,導(dǎo)出要想動(dòng)態(tài)顯示哪些列,只需要?jiǎng)討B(tài)設(shè)置 isColumnHidden 的值 就可以實(shí)現(xiàn)。
1.1 實(shí)現(xiàn)原理
JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對于任意一個(gè)實(shí)體類,都能夠知道這個(gè)類的所有屬性和方法;對于任意一個(gè)對象,都能夠調(diào)用它的任意方法和屬性;這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對象方法的功能稱為java語言的反射機(jī)制。
利用 JAVA反射機(jī)制。根據(jù)反射機(jī)制,我們可以拿到一個(gè)類的所有屬性和方法,同理,注解也是一個(gè)類,也是可以拿到它的屬性和方法,拿到之后就好辦了,直接修改它的默認(rèn)值,然后根據(jù)不同的條件調(diào)整,就可以達(dá)到一個(gè)類實(shí)現(xiàn)動(dòng)態(tài)導(dǎo)出的目的。
1.2 實(shí)現(xiàn)步驟
先創(chuàng)建一個(gè)工具類,傳入對象,獲取注解值,并修改。
代碼如下(示例):
/**
* @description 動(dòng)態(tài)顯示Excel導(dǎo)出列
* @date 2022/8/31
*/
public class EasyPoiUtil<T> {
/**
* 需要被反射的對象,使用泛型規(guī)范傳入對象
*/
public T t;
public void hiddColumn(String columnName, Boolean target) throws Exception {
if (t == null) {
throw new ClassNotFoundException("TARGET OBJECT NOT FOUNT");
}
if (StringUtils.isEmpty(columnName)) {
throw new NullPointerException("COLUMN NAME NOT NULL");
}
if (target == null) {
target = true;
}
// 獲取目標(biāo)對象的屬性值
Field field = t.getClass().getDeclaredField(columnName);
// 獲取注解反射對象
Excel excelAnnon = field.getAnnotation(Excel.class);
// 獲取代理
InvocationHandler invocationHandler = Proxy.getInvocationHandler(excelAnnon);
Field excelField = invocationHandler.getClass().getDeclaredField("memberValues");
// 因?yàn)檫@個(gè)字段是 private final 修飾,所以要打開權(quán)限
excelField.setAccessible(true);
Map memberValues = (Map) excelField.get(invocationHandler);
memberValues.put("isColumnHidden", target);
}
}然后在需要導(dǎo)出的數(shù)據(jù)中更改對應(yīng)條件能看到的列,這里以實(shí)際項(xiàng)目里的代碼為例
public List<ExportVo> batchLiveUserExport(LiveUser liveUser) {
List<ExportVo> voList = baseMapper.batchLiveUserExport(liveUser);
LiveInfo liveInfo = liveInfoService.getById(liveUser.getLiveId());
if (liveInfo != null) {
LiveSpecial liveSpecial = liveSpecialService.getById(liveInfo.getSpecialId());
if ("2".equals(liveSpecial.getLivePlatform())) {
setHiddColumn(voList,true);
} else {
setHiddColumn(voList,false);
}
}
return voList;
}
private void setHiddColumn(List<ExportVo> list, Boolean value) {
if (CollectionUtil.isNotEmpty(list)) {
for (ExportVo vo : list) {
EasyPoiUtil<ExportVo> easyPoiUtil = new EasyPoiUtil<>();
easyPoiUtil.t = vo;
// 是否導(dǎo)出 參與狀態(tài) 一列 true 導(dǎo)出 false 不導(dǎo)出
try {
easyPoiUtil.hiddColumn("isJoin", value);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}1.3 實(shí)現(xiàn)效果
可以看到導(dǎo)出的表格,“參與狀態(tài)”一列,是根據(jù)條件動(dòng)態(tài)顯示了。(其實(shí)也全部導(dǎo)出了,只是隱藏了列,通過Execl里的設(shè)置還是可以顯示隱藏列的,對這點(diǎn)有要求的此方式或者不適用)

二. 基于List< ExcelExportEntity > 的導(dǎo)出
上面說到,利用@Execl的 isColumnHidden 屬性動(dòng)態(tài)設(shè)置值,只是在導(dǎo)出時(shí)隱藏了該列而已,實(shí)際上也還是全部導(dǎo)出了。
要徹底的不導(dǎo)出,官方也給出了解決方案:基于List< ExcelExportEntity> 的導(dǎo)出
ExcelExportEntity是注解經(jīng)過處理翻譯成的實(shí)體類,兩者幾乎是一對的,所以如果我們要?jiǎng)討B(tài)自定義導(dǎo)出列,只要?jiǎng)討B(tài)拼裝ExcelExportEntity就可以了
例如上面的栗子,我們只導(dǎo)出 “姓名”,“學(xué)號”,“手機(jī)號”,"通知狀態(tài)"四列, 代碼如下(示例):
/**
* 根據(jù)條件動(dòng)態(tài)生成列信息
**/
private List<ExcelExportEntity> dynaCol(String type) {
List<ExcelExportEntity> colList = new ArrayList<ExcelExportEntity>();
colList.add(new ExcelExportEntity("姓名", "realName"));
colList.add(new ExcelExportEntity("學(xué)號", "studNo"));
if ("2".equals(type)) {
colList.add(new ExcelExportEntity("手機(jī)號", "phoneNumber"));
ExcelExportEntity excelentity = new ExcelExportEntity("通知狀態(tài)", "isSms");
// 值替換
String[] isSmsReplace = {"未發(fā)送_N", "已發(fā)送_Y","_null"};
excelentity.setReplace(isSmsReplace);
colList.add(excelentity);
}
return colList;
}
/**
* 導(dǎo)出 偽代碼
**/
@GetMapping(value = "batchExport")
public void batchExport(LiveUser liveUser, HttpServletResponse response){
// 查詢出導(dǎo)出的結(jié)果集
List<LiveUserExportVo> liveUsers = liveUserService.batchLiveUserExport(liveUser);
// 根據(jù)條件動(dòng)態(tài)生成列信息
List<ExcelExportEntity> beanList = dynaCol("2");
// 導(dǎo)出
ExcelUtil.exportExcelX(liveUsers, beanList,"名單.xls", response,new ExportParams("名單", "名單"));
}
實(shí)現(xiàn)效果
滿足了只導(dǎo)出四列的要求。

總結(jié)
好了,以上就是本文的全部內(nèi)容了。全文介紹了兩種方式實(shí)現(xiàn)EasyPoi動(dòng)態(tài)導(dǎo)出列,可以根據(jù)項(xiàng)目的實(shí)際情況看看能否用的上。
到此這篇關(guān)于SpringBoot EasyPoi動(dòng)態(tài)導(dǎo)入導(dǎo)出的兩種方式實(shí)現(xiàn)方法詳解的文章就介紹到這了,更多相關(guān)SpringBoot EasyPoi導(dǎo)入導(dǎo)出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中消息隊(duì)列任務(wù)的平滑關(guān)閉詳解
對于消息隊(duì)列的監(jiān)聽,我們一般使用Java寫一個(gè)獨(dú)立的程序,在Linux服務(wù)器上運(yùn)行。程序啟動(dòng)后,通過消息隊(duì)列客戶端接收消息,放入一個(gè)線程池進(jìn)行異步處理,并發(fā)的快速處理。這篇文章主要給大家介紹了關(guān)于Java中消息隊(duì)列任務(wù)的平滑關(guān)閉的相關(guān)資料,需要的朋友可以參考下。2017-11-11
關(guān)于各種排列組合java算法實(shí)現(xiàn)方法
這篇文章介紹了幾種用JAVA實(shí)現(xiàn)的排列組合算法,有需要的朋友可以參考一下2013-06-06
springboot 配置DRUID數(shù)據(jù)源的方法實(shí)例分析
這篇文章主要介紹了springboot 配置DRUID數(shù)據(jù)源的方法,結(jié)合實(shí)例形式分析了springboot 配置阿里DRUID數(shù)據(jù)源的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2019-12-12
手把手帶你分析SpringBoot自動(dòng)裝配完成了Ribbon哪些核心操作
這篇文章主要介紹了詳解Spring Boot自動(dòng)裝配Ribbon哪些核心操作的哪些操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08
java中switch case語句需要加入break的原因解析
這篇文章主要介紹了java中switch case語句需要加入break的原因解析的相關(guān)資料,需要的朋友可以參考下2017-07-07
使用Java編寫一個(gè)簡單的Web的監(jiān)控系統(tǒng)
這篇文章主要介紹了使用Java編寫一個(gè)簡單的Web的監(jiān)控系統(tǒng)的例子,并且將重要信息轉(zhuǎn)為XML通過網(wǎng)頁前端顯示,非常之實(shí)用,需要的朋友可以參考下2015-11-11

