您好,登錄后才能下訂單哦!
本文是基于Apache poi類實現的批量導入讀取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>
在引入依賴之后,我們就可以開始進行操作了,首先,導入Excel數據,我們要先能夠讀取Excel每一行每一列的內容,只有讀取到內容了,才可以將內容存入數組,最后實現插入數據庫。所以我們要先讀取Excel表格的數據,我的項目是springboot,我在service定義了一個讀取方法,然后在impl里面進行實現,具體代碼為
public class ImportOrderDTO { private String filePath; public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } } /** * 讀取導入數據 excel 內容 * * @param importOrderDTO 導入參數 * @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); // 從行中獲取數據 if (row.getRowNum() == 0) { continue; } //第一列為空就跳出 if (row.getCell(0) == null) { continue; } /** * getNumericCellValue() 獲取數字 * getStringCellValue 獲取String,設置表格類型為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是我自己定義的數據類,你們導入需要哪些數據就封裝哪些,這就不用多講了吧 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); //職業類別 userInformPO.setIntegral(0); userInformPO.setVipLevel(0); userInformPO.setIsEnabled(0); userInformPO.setDelFlag(0); //然后將po轉到我的實體類entity里面并將實體類加入到數組,方便正式執行批量導入的時候可以用,一些沒有的類是我自己定義的加密的(規范) 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())); //加入到數組中并且該方法返回該數組 excelContent.add(user); } } catch (FileNotFoundException e) { throw new ServerException("文件不存在"); } catch (IOException e) { System.out.println(e); throw new ServerException("讀取文件失敗"); } return excelContent; }
在上面寫完讀取Excel表單數據后,就可以開始寫插入數據庫的方法了,我用的是mybatis plus ,方法直接寫到下面,大家不會陌生,返回方法是我封裝的類,大家用自己項目的稍加修改就可以
public Result importUserWithExcel(ImportOrderDTO importOrderDTO, String rootPath) { try { //調用上面的方法,讀取前端傳過來的參數和文件路徑 List<User> excelContent = readExcel(importOrderDTO, rootPath); if (excelContent.isEmpty()) { return ResultUtil.error("數據為空"); } //下面都是一些邏輯處理,大家一定看得懂就不多說了 List<User> userList = userMapper.selectList(new EntityWrapper<User>()); List<User> sameList = new ArrayList<>(); List<User> differentList = new ArrayList<>(); for (User excelStudent : excelContent) { //數據不同 boolean flag = true; for (User user : userList) { if (user.getAccount().equals(excelStudent.getAccount())) { //相同的數據 flag = false; sameList.add(excelStudent); } } if (flag) { //如果導入的數據與上面判斷的條件相等了,就執行插入操作 differentList.add(excelStudent); userMapper.insert(excelStudent); } } if (differentList.size() == 0) { //判斷如果導入的數據跟當前的數據一致的話 return ResultUtil.error("導入數據與當前數據一致!"); } return ResultUtil.successWithMessage("數據導入成功"); } catch (Exception e) { System.out.println(e); return ResultUtil.error("數據導入失敗,請檢查導入文件格式與模板文件是否相同!"); } }
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("創建excel文件失敗", e); } } /** * 創建表 * * @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; } /** * 創建單元格. * * @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批量導入數據就完成了,感謝支持,大家有什么問題都可以評論留言哦
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。