SpringBoot圖文教程14—SpringBoot集成EasyExcel「上」

  • 2020 年 3 月 11 日
  • 筆記

有天上飛的概念,就要有落地的實現

  • 概念十遍不如程式碼一遍,朋友,希望你把文中所有的程式碼案例都敲一遍

  • 先贊後看,養成習慣

SpringBoot 圖文教程系列文章目錄

  1. SpringBoot圖文教程1「概念+案例 思維導圖」「基礎篇上」
  2. SpringBoot圖文教程2—日誌的使用「logback」「log4j」
  3. SpringBoot圖文教程3—「『初戀』情結」集成Jsp
  4. SpringBoot圖文教程4—SpringBoot 實現文件上傳下載
  5. SpringBoot圖文教程5—SpringBoot 中使用Aop
  6. SpringBoot圖文教程6—SpringBoot中過濾器的使用
  7. SpringBoot圖文教程7—SpringBoot攔截器的使用姿勢這都有
  8. SpringBoot圖文教程8 — SpringBoot集成MBG「程式碼生成器」
  9. SpringBoot圖文教程9—SpringBoot 導入導出 Excel 「Apache Poi」
  10. SpringBoot圖文教程10—模板導出|百萬數據Excel導出|圖片導出「easypoi」
  11. SpringBoot圖文教程11—從此不寫mapper文件「SpringBoot集成MybatisPlus」
  12. SpringBoot圖文教程12—SpringData Jpa的基本使用
  13. 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);      }  }  

注意:

  1. 監聽器這個類不能夠被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實戰開發經驗。