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


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

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

  • 先贊后看,養成習慣

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#圖片導出

實體類改造

導出的代碼是【不需要做任何改變】

總結

Tips:最近開始復工了,比較的忙,本文只是EasyExcel的基本使用,下一篇文章,講解模板導出和百萬數據導出

恭喜你完成了本章的學習,為你鼓掌!如果本文對你有幫助,請幫忙點贊,評論,轉發,這對作者很重要,謝謝。

讓我們再次回顧本文的學習目標

  • 掌握SpringBoot中EasyExcel的基本使用

要掌握SpringBoot更多的用法,請持續關注本系列教程。

求關注,求點贊,求轉發

歡迎關注本人公眾號:鹿老師的Java筆記,將在長期更新Java技術圖文教程和視頻教程,Java學習經驗,Java面試經驗以及Java實戰開發經驗。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM