Java使用easyExcel批量導(dǎo)入數(shù)據(jù)詳解
Java使用easyExcel批量導(dǎo)入數(shù)據(jù)
WMS、ERP等管理系統(tǒng)經(jīng)常涉及庫存、人員信息的管理,通常我們會提供一個模板
此模塊我們可以使用easyExcel導(dǎo)出數(shù)據(jù)生成的一個Excel文件當作模板,提供下載鏈接。
用戶在該文件內(nèi)填入規(guī)定的數(shù)據(jù)格式以后可以批量導(dǎo)入數(shù)據(jù)到數(shù)據(jù)庫中。
controller層:
//excel批量導(dǎo)入用戶數(shù)據(jù) @PostMapping("/user/import") public Object addUserList(@RequestParam("file") MultipartFile file) { try { BufferedInputStream in = new BufferedInputStream(file.getInputStream()); //調(diào)用寫的一個工具類傳入 文件流,所要轉(zhuǎn)換存儲的類,以及業(yè)務(wù)邏輯(我這邊直接就是插入語句) ExcelUtils.readExcel(in, User.class,userDao); }catch (Exception e){ e.printStackTrace(); } return "ok"; }
ExcelUtils工具類:
網(wǎng)上的一些工具類包括公司內(nèi)部所使用的對Excel操作的工具包利用了反射、對于每個異常都做了處理有固定的返回格式和狀態(tài)碼,導(dǎo)致那那些工具包太大太亂對于新手同學(xué)來說不太友好,因此我這邊就單獨寫了一個簡易的版本,讓功能實現(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 導(dǎo)入文件輸入流 * @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 導(dǎo)出數(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ù)"; //這邊對應(yīng)的實體類改為你所導(dǎo)出的實體類 Sheet sheet = new Sheet(1, 0, User.class); //設(shè)置自適應(yīng)寬度 sheet.setAutoWidth(Boolean.TRUE); // 第一個 sheet 名稱 sheet.setSheetName("第一個sheet"); writer.write(data, sheet); //通知瀏覽器以附件的形式下載處理,設(shè)置返回頭要注意文件名有中文 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批量導(dǎo)入,其實是監(jiān)聽解析出來的每一行數(shù)據(jù)轉(zhuǎn)換為對應(yīng)的類,逐個插入數(shù)據(jù)庫,當然也可以監(jiān)聽到每一行數(shù)據(jù)時候存儲到一個list中,供后續(xù)業(yè)務(wù)處理。
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è)務(wù)邏輯處理。 insert(object);//根據(jù)自己業(yè)務(wù)做處理 } 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導(dǎo)出Excel時候生成的Excel文件作為模板,使用該模板進行批量導(dǎo)入:
據(jù)庫生成數(shù)據(jù):
到此這篇關(guān)于Java使用easyExcel批量導(dǎo)入數(shù)據(jù)詳解的文章就介紹到這了,更多相關(guān)easyExcel批量導(dǎo)入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot中EasyExcel實現(xiàn)Excel文件的導(dǎo)入導(dǎo)出
- SpringBoot集成EasyExcel實現(xiàn)Excel導(dǎo)入的方法
- SpringBoot整合EasyExcel實現(xiàn)文件導(dǎo)入導(dǎo)出
- java使用EasyExcel導(dǎo)入導(dǎo)出excel
- Java+EasyExcel實現(xiàn)文件的導(dǎo)入導(dǎo)出
- EasyExcel實現(xiàn)導(dǎo)入+各種數(shù)據(jù)校驗功能
- Java使用EasyExcel實現(xiàn)Excel的導(dǎo)入導(dǎo)出
- Java?EasyExcel導(dǎo)入帶圖片的完整過程記錄
相關(guān)文章
RestTemplate發(fā)送HTTP?POST請求使用方法詳解
這篇文章主要為大家介紹了RestTemplate發(fā)送HTTP?POST請求的使用方法詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進步2022-03-03Spring?Cloud?Alibaba使用Nacos作為注冊中心和配置中心
這篇文章主要為大家介紹了Spring?Cloud?Alibaba使用Nacos作為注冊中心和配置中心的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06深入了解SpringBoot中@InitBinder注解的使用
這篇文章主要介紹了深入了解SpringBoot中@InitBinder注解的使用,@InitBinder注解可以作用在被@Controller注解的類的方法上,表示為當前控制器注冊一個屬性編輯器,用于對WebDataBinder進行初始化,且只對當前的Controller有效,需要的朋友可以參考下2023-10-10SpringBoot啟動后立即執(zhí)行的幾種方法小結(jié)
在項目開發(fā)中某些場景必須要用到啟動項目后立即執(zhí)行方式的功能,本文主要介紹了SpringBoot啟動后立即執(zhí)行的幾種方法小結(jié),具有一定的參考價值,感興趣的可以了解一下2023-05-05妙用Java8中的Function接口消滅if...else
在開發(fā)過程中經(jīng)常會使用if...else...進行判斷拋出異常、分支處理等操作。這些if...else...充斥在代碼中嚴重影響了代碼代碼的美觀,本文就妙用Java8中的Function接口消滅if...else,感興趣的可以了解一下2022-01-01