在我們平時工作中經常會遇到要操作Excel的功能,比如導出個用戶信息或者訂單信息的Excel報表。你肯定聽說過POI這個東西,可以實現。但是POI實現的API確實很麻煩,它需要寫那種逐行解析的代碼(類似Xml解析)。今天給大家推薦一款非常好用的Excel導入導出工具EasyPoi,希望對大家有所幫助!
EasyPoi簡介
用慣了SpringBoot的朋友估計會想到,有沒有什么辦法可以直接定義好需要導出的數據對象,然后添加幾個注解,直接自動實現Excel導入導出功能?
EasyPoi正是這么一款工具,如果你不太熟悉POI,想簡單地實現Excel操作,用它就對了!
EasyPoi的目標不是替代POI,而是讓一個不懂導入導出的人也能快速使用POI完成Excel的各種操作,而不是看很多API才可以完成這樣的工作。
集成
在SpringBoot中集成EasyPoi非常簡單,只需添加如下一個依賴即可,真正的開箱即用!
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.4.0</version>
</dependency>
使用
接下來介紹下EasyPoi的使用,以會員信息和訂單信息的導入導出為例,分別實現下簡單的單表導出和具有關聯信息的復雜導出。
簡單導出
我們以會員信息列表導出為例,使用EasyPoi來實現下導出功能,看看是不是夠簡單!
/***?購物會員*?Created?by?macro?on?2021/10/12.*/
@Data
@EqualsAndHashCode(callSuper?=?false)
public?class?Member?{@Excel(name?=?"ID",?width?=?10)private?Long?id;@Excel(name?=?"用戶名",?width?=?20,?needMerge?=?true)private?String?username;private?String?password;@Excel(name?=?"昵稱",?width?=?20,?needMerge?=?true)private?String?nickname;@Excel(name?=?"出生日期",?width?=?20,?format?=?"yyyy-MM-dd")private?Date?birthday;@Excel(name?=?"手機號",?width?=?20,?needMerge?=?true,?desensitizationRule?=?"3_4")private?String?phone;private?String?icon;@Excel(name?=?"性別",?width?=?10,?replace?=?{"男_0",?"女_1"})private?Integer?gender;
}
/***?EasyPoi導入導出測試Controller*?Created?by?macro?on?2021/10/12.*/
@Controller
@Api(tags?=?"EasyPoiController",?description?=?"EasyPoi導入導出測試")
@RequestMapping("/easyPoi")
public?class?EasyPoiController?{@ApiOperation(value?=?"導出會員列表Excel")@RequestMapping(value?=?"/exportMemberList",?method?=?RequestMethod.GET)public?void?exportMemberList(ModelMap?map,HttpServletRequest?request,HttpServletResponse?response)?{List<Member>?memberList?=?LocalJsonUtil.getListFromJson("json/members.json",?Member.class);ExportParams?params?=?new?ExportParams("會員列表",?"會員列表",?ExcelType.XSSF);map.put(NormalExcelConstants.DATA_LIST,?memberList);map.put(NormalExcelConstants.CLASS,?Member.class);map.put(NormalExcelConstants.PARAMS,?params);map.put(NormalExcelConstants.FILE_NAME,?"memberList");PoiBaseView.render(map,?request,?response,?NormalExcelConstants.EASYPOI_EXCEL_VIEW);}
}
簡單導入
導入功能實現起來也非常簡單,下面以會員信息列表的導入為例。
/***?EasyPoi導入導出測試Controller*?Created?by?macro?on?2021/10/12.*/
@Controller
@Api(tags?=?"EasyPoiController",?description?=?"EasyPoi導入導出測試")
@RequestMapping("/easyPoi")
public?class?EasyPoiController?{@ApiOperation("從Excel導入會員列表")@RequestMapping(value?=?"/importMemberList",?method?=?RequestMethod.POST)@ResponseBodypublic?CommonResult?importMemberList(@RequestPart("file")?MultipartFile?file)?{ImportParams?params?=?new?ImportParams();params.setTitleRows(1);params.setHeadRows(1);try?{List<Member>?list?=?ExcelImportUtil.importExcel(file.getInputStream(),Member.class,?params);return?CommonResult.success(list);}?catch?(Exception?e)?{e.printStackTrace();return?CommonResult.failed("導入失敗!");}}
}
復雜導出
當然EasyPoi也可以實現更加復雜的Excel操作,比如導出一個嵌套了會員信息和商品信息的訂單列表,下面我們來實現下!
/***?商品*?Created?by?macro?on?2021/10/12.*/
@Data
@EqualsAndHashCode(callSuper?=?false)
public?class?Product?{@Excel(name?=?"ID",?width?=?10)private?Long?id;@Excel(name?=?"商品SN",?width?=?20)private?String?productSn;@Excel(name?=?"商品名稱",?width?=?20)private?String?name;@Excel(name?=?"商品副標題",?width?=?30)private?String?subTitle;@Excel(name?=?"品牌名稱",?width?=?20)private?String?brandName;@Excel(name?=?"商品價格",?width?=?10)private?BigDecimal?price;@Excel(name?=?"購買數量",?width?=?10,?suffix?=?"件")private?Integer?count;
}
/***?訂單*?Created?by?macro?on?2021/10/12.*/
@Data
@EqualsAndHashCode(callSuper?=?false)
public?class?Order?{@Excel(name?=?"ID",?width?=?10,needMerge?=?true)private?Long?id;@Excel(name?=?"訂單號",?width?=?20,needMerge?=?true)private?String?orderSn;@Excel(name?=?"創建時間",?width?=?20,?format?=?"yyyy-MM-dd?HH:mm:ss",needMerge?=?true)private?Date?createTime;@Excel(name?=?"收貨地址",?width?=?20,needMerge?=?true?)private?String?receiverAddress;@ExcelEntity(name?=?"會員信息")private?Member?member;@ExcelCollection(name?=?"商品列表")private?List<Product>?productList;
}
/***?EasyPoi導入導出測試Controller*?Created?by?macro?on?2021/10/12.*/
@Controller
@Api(tags?=?"EasyPoiController",?description?=?"EasyPoi導入導出測試")
@RequestMapping("/easyPoi")
public?class?EasyPoiController?{@ApiOperation(value?=?"導出訂單列表Excel")@RequestMapping(value?=?"/exportOrderList",?method?=?RequestMethod.GET)public?void?exportOrderList(ModelMap?map,HttpServletRequest?request,HttpServletResponse?response)?{List<Order>?orderList?=?getOrderList();ExportParams?params?=?new?ExportParams("訂單列表",?"訂單列表",?ExcelType.XSSF);//導出時排除一些字段params.setExclusions(new?String[]{"ID",?"出生日期",?"性別"});map.put(NormalExcelConstants.DATA_LIST,?orderList);map.put(NormalExcelConstants.CLASS,?Order.class);map.put(NormalExcelConstants.PARAMS,?params);map.put(NormalExcelConstants.FILE_NAME,?"orderList");PoiBaseView.render(map,?request,?response,?NormalExcelConstants.EASYPOI_EXCEL_VIEW);}
}
自定義處理
如果你想對導出字段進行一些自定義處理,EasyPoi也是支持的,比如在會員信息中,如果用戶沒有設置昵稱,我們添加下暫未設置信息。
/***?自定義字段處理*?Created?by?macro?on?2021/10/13.*/
public?class?MemberExcelDataHandler?extends?ExcelDataHandlerDefaultImpl<Member>?{@Overridepublic?Object?exportHandler(Member?obj,?String?name,?Object?value)?{if("昵稱".equals(name)){String?emptyValue?=?"暫未設置";if(value==null){return?super.exportHandler(obj,name,emptyValue);}if(value?instanceof?String&&StrUtil.isBlank((String)?value)){return?super.exportHandler(obj,name,emptyValue);}}return?super.exportHandler(obj,?name,?value);}@Overridepublic?Object?importHandler(Member?obj,?String?name,?Object?value)?{return?super.importHandler(obj,?name,?value);}
}
/***?EasyPoi導入導出測試Controller*?Created?by?macro?on?2021/10/12.*/
@Controller
@Api(tags?=?"EasyPoiController",?description?=?"EasyPoi導入導出測試")
@RequestMapping("/easyPoi")
public?class?EasyPoiController?{@ApiOperation(value?=?"導出會員列表Excel")@RequestMapping(value?=?"/exportMemberList",?method?=?RequestMethod.GET)public?void?exportMemberList(ModelMap?map,HttpServletRequest?request,HttpServletResponse?response)?{List<Member>?memberList?=?LocalJsonUtil.getListFromJson("json/members.json",?Member.class);ExportParams?params?=?new?ExportParams("會員列表",?"會員列表",?ExcelType.XSSF);//對導出結果進行自定義處理MemberExcelDataHandler?handler?=?new?MemberExcelDataHandler();handler.setNeedHandlerFields(new?String[]{"昵稱"});params.setDataHandler(handler);map.put(NormalExcelConstants.DATA_LIST,?memberList);map.put(NormalExcelConstants.CLASS,?Member.class);map.put(NormalExcelConstants.PARAMS,?params);map.put(NormalExcelConstants.FILE_NAME,?"memberList");PoiBaseView.render(map,?request,?response,?NormalExcelConstants.EASYPOI_EXCEL_VIEW);}
}
總結
體驗了一波EasyPoi,它使用注解來操作Excel的方式確實非常好用。如果你想生成更為復雜的Excel的話,可以考慮下它的模板功能。
參考資料
項目官網:https://gitee.com/lemur/easypoi
往期推薦
再見 Postman!Apifox 才是 YYDS!
再見收費的Navicat!操作所有數據庫靠它就夠了!
MyBatis原生批量插入的坑與解決方案!
總結
以上是生活随笔為你收集整理的SpringBoot实现Excel导入导出,好用到爆,POI可以扔掉了!的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。