有天上飛的概念,就要有落地的實現
概念十遍不如代碼一遍,朋友,希望你把文中所有的代碼案例都敲一遍
先贊后看,養成習慣
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#圖片導出
實體類改造
導出的代碼是【不需要做任何改變】
總結
Tips:最近開始復工了,比較的忙,本文只是EasyExcel的基本使用,下一篇文章,講解模板導出和百萬數據導出
恭喜你完成了本章的學習,為你鼓掌!如果本文對你有幫助,請幫忙點贊,評論,轉發,這對作者很重要,謝謝。
讓我們再次回顧本文的學習目標
- 掌握SpringBoot中EasyExcel的基本使用
要掌握SpringBoot更多的用法,請持續關注本系列教程。
求關注,求點贊,求轉發
歡迎關注本人公眾號:鹿老師的Java筆記,將在長期更新Java技術圖文教程和視頻教程,Java學習經驗,Java面試經驗以及Java實戰開發經驗。