Java使用easyExcel批量導入數(shù)據(jù)詳解
Java使用easyExcel批量導入數(shù)據(jù)
WMS、ERP等管理系統(tǒng)經(jīng)常涉及庫存、人員信息的管理,通常我們會提供一個模板
此模塊我們可以使用easyExcel導出數(shù)據(jù)生成的一個Excel文件當作模板,提供下載鏈接。
用戶在該文件內(nèi)填入規(guī)定的數(shù)據(jù)格式以后可以批量導入數(shù)據(jù)到數(shù)據(jù)庫中。
controller層:
//excel批量導入用戶數(shù)據(jù)
@PostMapping("/user/import")
public Object addUserList(@RequestParam("file") MultipartFile file) {
try {
BufferedInputStream in = new BufferedInputStream(file.getInputStream());
//調(diào)用寫的一個工具類傳入 文件流,所要轉(zhuǎn)換存儲的類,以及業(yè)務邏輯(我這邊直接就是插入語句)
ExcelUtils.readExcel(in, User.class,userDao);
}catch (Exception e){
e.printStackTrace();
}
return "ok";
}ExcelUtils工具類:
網(wǎng)上的一些工具類包括公司內(nèi)部所使用的對Excel操作的工具包利用了反射、對于每個異常都做了處理有固定的返回格式和狀態(tài)碼,導致那那些工具包太大太亂對于新手同學來說不太友好,因此我這邊就單獨寫了一個簡易的版本,讓功能實現(xiàn)即可。
package com.example.webdemo.utils.excel;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.example.webdemo.Dao.UserDao;
import java.io.*;
import java.util.List;
/**
* @author zhangqianwei
* @date 2022/2/16 19:45
*/
public class ExcelUtils {
/**
* @param is 導入文件輸入流
* @param clazz Excel實體映射類
* @return
*/
public static Boolean readExcel(InputStream is, Class clazz, UserDao userDao){
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream(is);
// 解析每行結(jié)果在listener中處理
AnalysisEventListener listener = new ExcelListener(userDao);
ExcelReader excelReader = EasyExcelFactory.getReader(bis, listener);
excelReader.read(new Sheet(1, 1, clazz));
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
}
/**
*
* @param response http請求報文
* @param clazz Excel實體映射類
* @param data 導出數(shù)據(jù)
* @return
*/
public static Boolean writeExcel(HttpServletResponse response, Class clazz, List<? extends BaseRowModel> data){
BufferedOutputStream bos= null;
try {
ServletOutputStream out = response.getOutputStream();
ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);
String fileName = "用戶數(shù)據(jù)";
//這邊對應的實體類改為你所導出的實體類
Sheet sheet = new Sheet(1, 0, User.class);
//設置自適應寬度
sheet.setAutoWidth(Boolean.TRUE);
// 第一個 sheet 名稱
sheet.setSheetName("第一個sheet");
writer.write(data, sheet);
//通知瀏覽器以附件的形式下載處理,設置返回頭要注意文件名有中文
response.setHeader("Content-disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) + ".xlsx");
writer.finish();
response.setContentType("multipart/form-data");
response.setCharacterEncoding("utf-8");
out.flush();
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
}
}監(jiān)聽類ExcelListener:
Excel批量導入,其實是監(jiān)聽解析出來的每一行數(shù)據(jù)轉(zhuǎn)換為對應的類,逐個插入數(shù)據(jù)庫,當然也可以監(jiān)聽到每一行數(shù)據(jù)時候存儲到一個list中,供后續(xù)業(yè)務處理。
package com.example.webdemo.utils.excel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.webdemo.Dao.UserDao;
import com.example.webdemo.Entity.User;
import java.util.ArrayList;
import java.util.List;
/**
* @author zhangqianwei
* @date 2022/2/16 20:03
*/
/** 解析監(jiān)聽器,
* 每解析一行會回調(diào)invoke()方法。
* 整個excel解析結(jié)束會執(zhí)行doAfterAllAnalysed()方法
*/
public class ExcelListener extends AnalysisEventListener {
private final UserDao userDao;
//解析出來的每一行數(shù)據(jù)可以存入一個list中
private List<Object> datas = new ArrayList<Object>();
public ExcelListener(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void invoke(Object object, AnalysisContext context) {
System.out.println("當前行:"+context.getCurrentRowNum());
System.out.println(object);
datas.add(object);//數(shù)據(jù)存儲到list,供批量處理,或后續(xù)自己業(yè)務邏輯處理。
insert(object);//根據(jù)自己業(yè)務做處理
}
private void insert(Object object) {
User user = (User) object;
userDao.addUser(user);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// datas.clear();//解析結(jié)束銷毀不用的資源
}
public List<Object> getDatas() {
return datas;
}
public void setDatas(List<Object> datas) {
this.datas = datas;
}
}User類:

使用easyExcel導出Excel時候生成的Excel文件作為模板,使用該模板進行批量導入:

據(jù)庫生成數(shù)據(jù):

到此這篇關(guān)于Java使用easyExcel批量導入數(shù)據(jù)詳解的文章就介紹到這了,更多相關(guān)easyExcel批量導入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java for循環(huán)和foreach循環(huán)的性能對比分析
這篇文章主要介紹了Java for循環(huán)和foreach循環(huán)的性能對比分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
解析Idea為什么不推薦使用@Autowired進行Field注入
這篇文章主要介紹了Idea不推薦使用@Autowired進行Field注入的原因,網(wǎng)上文章大部分都是介紹兩者的區(qū)別,沒有提到為什么,當時想了好久想出了可能的原因,今天來總結(jié)一下2022-05-05
springboot 集成redis哨兵主從的實現(xiàn)
本文主要介紹了springboot 集成redis哨兵主從的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07
POI讀取excel簡介_動力節(jié)點Java學院整理
這篇文章主要介紹了POI讀取excel簡介,詳細的介紹了什么是Apache POI和組件,有興趣的可以了解了解一下2017-08-08

