您好,登錄后才能下訂單哦!
本文是基于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>
在引入依賴之后,我們就可以開始進(jìn)行操作了,首先,導(dǎo)入Excel數(shù)據(jù),我們要先能夠讀取Excel每一行每一列的內(nèi)容,只有讀取到內(nèi)容了,才可以將內(nèi)容存入數(shù)組,最后實現(xiàn)插入數(shù)據(jù)庫。所以我們要先讀取Excel表格的數(shù)據(jù),我的項目是springboot,我在service定義了一個讀取方法,然后在impl里面進(jìn)行實現(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++) { // 通過下標(biāo)獲取行 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ù)跟當(dāng)前的數(shù)據(jù)一致的話 return ResultUtil.error("導(dǎo)入數(shù)據(jù)與當(dāng)前數(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 目標(biāo)文件 * @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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。