java實現批量匯入Excel表格資料到資料庫
阿新 • • 發佈:2020-08-25
本文是基於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批量匯入資料就完成了,感謝支援,大家有什麼問題都可以評論留言哦
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。