SpringBoot圖文教程14—SpringBoot集成EasyExcel「上」
- 2020 年 3 月 11 日
- 筆記
有天上飛的概念,就要有落地的實現
概念十遍不如程式碼一遍,朋友,希望你把文中所有的程式碼案例都敲一遍
先贊後看,養成習慣
SpringBoot 圖文教程系列文章目錄
- SpringBoot圖文教程1「概念+案例 思維導圖」「基礎篇上」
- SpringBoot圖文教程2—日誌的使用「logback」「log4j」
- SpringBoot圖文教程3—「『初戀』情結」集成Jsp
- SpringBoot圖文教程4—SpringBoot 實現文件上傳下載
- SpringBoot圖文教程5—SpringBoot 中使用Aop
- SpringBoot圖文教程6—SpringBoot中過濾器的使用
- SpringBoot圖文教程7—SpringBoot攔截器的使用姿勢這都有
- SpringBoot圖文教程8 — SpringBoot集成MBG「程式碼生成器」
- SpringBoot圖文教程9—SpringBoot 導入導出 Excel 「Apache Poi」
- SpringBoot圖文教程10—模板導出|百萬數據Excel導出|圖片導出「easypoi」
- SpringBoot圖文教程11—從此不寫mapper文件「SpringBoot集成MybatisPlus」
- SpringBoot圖文教程12—SpringData Jpa的基本使用
- SpringBoot圖文教程13—SpringBoot+IDEA實現程式碼熱部署
EasyExcel
EasyExcel 是阿里巴巴開源的一個Java操作Excel的技術,和EasyPoi一樣是封裝Poi的工具類。但是不同的地方在於,在EasyExcel中解決了Poi技術讀取大批量數據耗費記憶體的問題。當然了,也封裝了很多常用的Excel操作
- 最基本的導入導出
- 圖片的導入導出
- 大批量數據的導入導出
- 模板的導出
官方地址:https://alibaba-easyexcel.github.io/quickstart/write.html
最基本的導入導出
最基本的導入導出,要導出的數據的實體類如下:
public class Teacher { /** * 老師的主鍵 */ private Integer teacherId; /** * 名字 */ private String teacherName; /** * 頭像圖片地址 */ private String teacherImage; /** * 老師的狀態 0代表正常 1代表刪除 */ private Integer teacherStatus; }
省略get set
1.導入依賴
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.0.5</version> </dependency>
2.給要導出數據實體類加註解
EasyExcel也是註解式開發,常用註解如下
- ExcelProperty 指定當前欄位對應excel中的那一列
- ExcelIgnore 默認所有欄位都會和excel去匹配,加了這個註解會忽略該欄位
- DateTimeFormat 日期轉換,用String去接收excel日期格式的數據會調用這個註解。裡面的value參照java.text.SimpleDateFormat
- NumberFormat 數字轉換,用String去接收excel數字格式的數據會調用這個註解。裡面的value參照java.text.DecimalFormat
3.直接導入導出
導出程式碼
/** * 基本的導出 */ @Test public void test1(){ // 準備數據 List<Teacher> teachers = new ArrayList<>(); teachers.add(new Teacher(1,"hhh","hhh.jpg",1)); teachers.add(new Teacher(1,"hhh","hhh.jpg",1)); teachers.add(new Teacher(1,"hhh","hhh.jpg",1)); teachers.add(new Teacher(1,"hhh","hhh.jpg",1)); String fileName = "/Users/lubingyang/Desktop/hhhh.xlsx"; // 這裡 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字為模板 然後文件流會自動關閉 // 如果這裡想使用03 則 傳入excelType參數即可 EasyExcel.write(fileName, Teacher.class).sheet("模板").doWrite(teachers); }
導入程式碼
關於EasyExcel的數據讀取會稍微麻煩一點,直接通過工具類讀取到的數據不能直接處理,需要藉助一個中間的類 監聽器 類,大致的流程如下圖
監聽器的程式碼如下,有詳細的注釋
package com.lu.booteasyexcel; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.lu.booteasyexcel.dao.TeacherDao; import com.lu.booteasyexcel.entity.Teacher; import java.util.ArrayList; import java.util.List; // 有個很重要的點 DemoDataListener 不能被spring管理,要每次讀取excel都要new,然后里面用到spring可以構造方法傳進去 public class DemoDataListener extends AnalysisEventListener<Teacher> { /** * 每隔5條存儲資料庫,實際使用中可以3000條,然後清理list ,方便記憶體回收 */ private static final int BATCH_COUNT = 5; /** * 這個集合用於接收 讀取Excel文件得到的數據 */ List<Teacher> list = new ArrayList<Teacher>(); /** * 假設這個是一個DAO,當然有業務邏輯這個也可以是一個service。當然如果不用存儲這個對象沒用。 */ private TeacherDao teacherDao; public DemoDataListener() { } /** * * 不要使用自動裝配 * 在測試類中將dao當參數傳進來 */ public DemoDataListener(TeacherDao teacherDao) { this.teacherDao = teacherDao; } /** * 這個每一條數據解析都會來調用 * */ @Override public void invoke(Teacher teacher, AnalysisContext context) { list.add(teacher); // 達到BATCH_COUNT了,需要去存儲一次資料庫,防止數據幾萬條數據在記憶體,容易OOM if (list.size() >= BATCH_COUNT) { saveData(); // 存儲完成清理 list list.clear(); } } /** * 所有數據解析完成了 都會來調用 * */ @Override public void doAfterAllAnalysed(AnalysisContext context) { // 這裡也要保存數據,確保最後遺留的數據也存儲到資料庫 saveData(); } /** * 加上存儲資料庫 */ private void saveData() { // 在這個地方可以調用dao 我們就直接列印數據了 System.out.println(list); } }
注意:
- 監聽器這個類不能夠被Spring管理,每次使用單獨的new出來
導入的程式碼如下:
/** * 添加資料庫用到的dao */ @Autowired private TeacherDao teacherDao; /** * 最簡單的讀 */ @Test public void simpleRead() { String fileName = "/Users/lubingyang/Desktop/hhhh.xlsx"; // 這裡 需要指定讀用哪個class去讀,然後讀取第一個sheet 文件流會自動關閉 /** * 參數1 要讀取的文件 * 參數2 要讀取的數據對應的實體類類對象 * 參數3 監聽器對象 可以在創建的時候把dao當做參數傳進去 */ EasyExcel.read(fileName, Teacher.class, new DemoDataListener(teacherDao)).sheet().doRead(); }
讀取的結果如下:
圖片的導出
在EasyExcel中支援多種圖片的導入導出,什麼意思呢?一般情況下,資料庫表中的圖片欄位存儲的是圖片路徑,讀取圖片文件導出是支援的,除此之外,還支援網路路徑,流,位元組數組等方式。我的案例以讀取本地圖片文件為主。
官方文檔地址:https://alibaba-easyexcel.github.io/quickstart/write.html#%E5%9B%BE%E7%89%87%E5%AF%BC%E5%87%BA
實體類改造
導出的程式碼是【不需要做任何改變】
總結
Tips:最近開始復工了,比較的忙,本文只是EasyExcel的基本使用,下一篇文章,講解模板導出和百萬數據導出
恭喜你完成了本章的學習,為你鼓掌!如果本文對你有幫助,請幫忙點贊,評論,轉發,這對作者很重要,謝謝。
讓我們再次回顧本文的學習目標
- 掌握SpringBoot中EasyExcel的基本使用
要掌握SpringBoot更多的用法,請持續關注本系列教程。
求關注,求點贊,求轉發
歡迎關注本人公眾號:鹿老師的Java筆記,將在長期更新Java技術圖文教程和影片教程,Java學習經驗,Java面試經驗以及Java實戰開發經驗。