java實現(xiàn)批量導(dǎo)入Excel表格數(shù)據(jù)到數(shù)據(jù)庫
本文是基于Apache poi類實現(xiàn)的批量導(dǎo)入讀取Excel文件,所以要先引入Apache poi的依賴
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.1</version> </dependency>
在引入依賴之后,我們就可以開始進行操作了,首先,導(dǎo)入Excel數(shù)據(jù),我們要先能夠讀取Excel每一行每一列的內(nèi)容,只有讀取到內(nèi)容了,才可以將內(nèi)容存入數(shù)組,最后實現(xiàn)插入數(shù)據(jù)庫。所以我們要先讀取Excel表格的數(shù)據(jù),我的項目是springboot,我在service定義了一個讀取方法,然后在impl里面進行實現(xiàn),具體代碼為
public class ImportOrderDTO { private String filePath; public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } } /** * 讀取導(dǎo)入數(shù)據(jù) excel 內(nèi)容 * * @param importOrderDTO 導(dǎo)入?yún)?shù) * @param rootPath 根路徑 * @return result */ public static final String SEPA = File.separator;//這是下面用到的常量,自己放好位置 private List<User> readExcel(ImportOrderDTO importOrderDTO, String rootPath) { List<User> excelContent = new ArrayList<>(); try { InputStream inputStream = new FileInputStream(rootPath + SEPA + importOrderDTO.getFilePath()); XSSFWorkbook wb = new XSSFWorkbook(inputStream); //遍歷所有表,只支持xlsx,xls的是H的類 XSSFSheet xssfSheet = wb.getSheetAt(0); int lastRowNum = xssfSheet.getLastRowNum(); for (int i = 0; i <= lastRowNum; i++) { // 通過下標獲取行 XSSFRow row = xssfSheet.getRow(i); // 從行中獲取數(shù)據(jù) if (row.getRowNum() == 0) { continue; } //第一列為空就跳出 if (row.getCell(0) == null) { continue; } /** * getNumericCellValue() 獲取數(shù)字 * getStringCellValue 獲取String,設(shè)置表格類型為String,可以避免很多問題 */ row.getCell(0).setCellType(CellType.STRING); row.getCell(1).setCellType(CellType.STRING); row.getCell(3).setCellType(CellType.STRING); row.getCell(5).setCellType(CellType.STRING); //UserInformPO是我自己定義的數(shù)據(jù)類,你們導(dǎo)入需要哪些數(shù)據(jù)就封裝哪些,這就不用多講了吧 UserInformPO userInformPO = new UserInformPO(); userInformPO.setAccount(row.getCell(0).getStringCellValue()); userInformPO.setIdCard(row.getCell(1).getStringCellValue()); userInformPO.setAvatar(row.getCell(2).getStringCellValue()); userInformPO.setNickname(row.getCell(3).getStringCellValue()); userInformPO.setSex(row.getCell(4).getStringCellValue()); String salt = EncryptUtils.createSalt(); userInformPO.setSalt(salt); //職業(yè)類別 userInformPO.setIntegral(0); userInformPO.setVipLevel(0); userInformPO.setIsEnabled(0); userInformPO.setDelFlag(0); //然后將po轉(zhuǎn)到我的實體類entity里面并將實體類加入到數(shù)組,方便正式執(zhí)行批量導(dǎo)入的時候可以用,一些沒有的類是我自己定義的加密的(規(guī)范) User user = new User(); if (userInformPO.getSex().equals(SexEnum.MAN.getText())) { user.setSex(SexEnum.MAN.getValue()); } else { user.setSex(SexEnum.WOMAN.getValue()); } user.setAccount(userInformPO.getAccount()); user.setIdCard(userInformPO.getIdCard()); user.setAvatar(userInformPO.getAvatar()); user.setNickname(userInformPO.getNickname()); user.setPassword(userInformPO.getPassword()); user.setSalt(userInformPO.getSalt()); user.setIntegral(userInformPO.getIntegral()); user.setVipLevel(userInformPO.getVipLevel()); user.setDepartmentId(31); user.setIsEnabled(userInformPO.getIsEnabled()); user.setDelFlag(userInformPO.getDelFlag()); user.setUpdateTime(new Timestamp(System.currentTimeMillis())); user.setCreateTime(new Timestamp(System.currentTimeMillis())); //加入到數(shù)組中并且該方法返回該數(shù)組 excelContent.add(user); } } catch (FileNotFoundException e) { throw new ServerException("文件不存在"); } catch (IOException e) { System.out.println(e); throw new ServerException("讀取文件失敗"); } return excelContent; }
在上面寫完讀取Excel表單數(shù)據(jù)后,就可以開始寫插入數(shù)據(jù)庫的方法了,我用的是mybatis plus ,方法直接寫到下面,大家不會陌生,返回方法是我封裝的類,大家用自己項目的稍加修改就可以
public Result importUserWithExcel(ImportOrderDTO importOrderDTO, String rootPath) { try { //調(diào)用上面的方法,讀取前端傳過來的參數(shù)和文件路徑 List<User> excelContent = readExcel(importOrderDTO, rootPath); if (excelContent.isEmpty()) { return ResultUtil.error("數(shù)據(jù)為空"); } //下面都是一些邏輯處理,大家一定看得懂就不多說了 List<User> userList = userMapper.selectList(new EntityWrapper<User>()); List<User> sameList = new ArrayList<>(); List<User> differentList = new ArrayList<>(); for (User excelStudent : excelContent) { //數(shù)據(jù)不同 boolean flag = true; for (User user : userList) { if (user.getAccount().equals(excelStudent.getAccount())) { //相同的數(shù)據(jù) flag = false; sameList.add(excelStudent); } } if (flag) { //如果導(dǎo)入的數(shù)據(jù)與上面判斷的條件相等了,就執(zhí)行插入操作 differentList.add(excelStudent); userMapper.insert(excelStudent); } } if (differentList.size() == 0) { //判斷如果導(dǎo)入的數(shù)據(jù)跟當前的數(shù)據(jù)一致的話 return ResultUtil.error("導(dǎo)入數(shù)據(jù)與當前數(shù)據(jù)一致!"); } return ResultUtil.successWithMessage("數(shù)據(jù)導(dǎo)入成功"); } catch (Exception e) { System.out.println(e); return ResultUtil.error("數(shù)據(jù)導(dǎo)入失敗,請檢查導(dǎo)入文件格式與模板文件是否相同!"); } }
service層方法寫完了,接著就是controller了,直接上代碼,工具類在下面
@PostMapping(value = "/importExcel") public Result importExcel(HttpServletRequest request, @RequestBody ImportOrderDTO importOrderDTO) { String rootPath = ExcelUtils.getRootPath(request); System.out.println(importOrderDTO.getFilePath()); return userService.importUserWithExcel(importOrderDTO, rootPath); }
這是獲取根路徑的工具類
public class ExcelUtils { /** * 獲取上傳根路徑 * * @param request 請求信息 * @return string */ public static String getRootPath(HttpServletRequest request) { return request.getSession().getServletContext().getRealPath(UtilConstant.UPLOAD_PATH); } public static Workbook getWorkbook(String excelType) { try { return WorkbookFactory.create(!ExcelTypeEnum.XLS.getVal().equals(excelType)); } catch (IOException e) { throw new ServerException("創(chuàng)建excel文件失敗", e); } } /** * 創(chuàng)建表 * * @param wb 目標文件 * @param sheetName 表名 * @param sheetTitle 表頭 * @return sheet */ public static Sheet createSheet(Workbook wb, String sheetName, String[] sheetTitle) { Sheet sheet = wb.createSheet(sheetName); Row row = sheet.createRow(0); for (int i = 0; i < sheetTitle.length; i++) { row.createCell(i).setCellValue(sheetTitle[i]); } return sheet; } /** * 創(chuàng)建單元格. * * @param row 行 * @param column 列 * @param value 值 */ public static void createCell(Row row, int column, String value) { Cell cell = row.createCell(column); cell.setCellValue(value); } }
好了,一個簡單的Excel批量導(dǎo)入數(shù)據(jù)就完成了,感謝支持,大家有什么問題都可以評論留言哦
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Springmvc項目web.xml中servlet-mapping路徑映射配置注意說明
這篇文章主要介紹了Springmvc項目web.xml中servlet-mapping路徑映射配置注意說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12Springboot調(diào)整接口響應(yīng)返回時長詳解(解決響應(yīng)超時問題)
當后端對于數(shù)據(jù)量較大的處理或是某些耗時的操作時,需要先對請求接口的請求進行響應(yīng),下面這篇文章主要給大家介紹了關(guān)于Springboot調(diào)整接口響應(yīng)返回時長(解決響應(yīng)超時問題)的相關(guān)資料,需要的朋友可以參考下2023-01-01解決websocket 報 Could not decode a text frame as UTF-8錯誤
這篇文章主要介紹了解決websocket 報 Could not decode a text frame as UTF-8錯誤,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10Hibernate實現(xiàn)many-to-many的映射關(guān)系
今天小編就為大家分享一篇關(guān)于Hibernate實現(xiàn)many-to-many的映射關(guān)系,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03