最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實(shí)現(xiàn)批量導(dǎo)入Excel表格數(shù)據(jù)到數(shù)據(jù)庫

 更新時(shí)間:2020年08月25日 09:22:31   作者:Ytcker  
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)批量導(dǎo)入Excel表格數(shù)據(jù)到數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文是基于Apache poi類實(shí)現(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ù)組,最后實(shí)現(xiàn)插入數(shù)據(jù)庫。所以我們要先讀取Excel表格的數(shù)據(jù),我的項(xiàng)目是springboot,我在service定義了一個(gè)讀取方法,然后在impl里面進(jìn)行實(shí)現(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)到我的實(shí)體類entity里面并將實(shí)體類加入到數(shù)組,方便正式執(zhí)行批量導(dǎo)入的時(shí)候可以用,一些沒有的類是我自己定義的加密的(規(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 ,方法直接寫到下面,大家不會陌生,返回方法是我封裝的類,大家用自己項(xiàng)目的稍加修改就可以

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);
 }
}

好了,一個(gè)簡單的Excel批量導(dǎo)入數(shù)據(jù)就完成了,感謝支持,大家有什么問題都可以評論留言哦

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot如何使用RequestBodyAdvice進(jìn)行統(tǒng)一參數(shù)處理

    SpringBoot如何使用RequestBodyAdvice進(jìn)行統(tǒng)一參數(shù)處理

    這篇文章主要介紹了SpringBoot使用RequestBodyAdvice進(jìn)行統(tǒng)一參數(shù)處理方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring boot開發(fā)web應(yīng)用JPA過程解析

    Spring boot開發(fā)web應(yīng)用JPA過程解析

    這篇文章主要介紹了Spring boot開發(fā)web應(yīng)用JPA過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 快速解決Hash碰撞沖突的方法小結(jié)

    快速解決Hash碰撞沖突的方法小結(jié)

    這篇文章主要介紹了快速解決Hash碰撞沖突的方法小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • maven報(bào)錯:Failed to execute goal on project問題及解決

    maven報(bào)錯:Failed to execute goal on p

    這篇文章主要介紹了maven報(bào)錯:Failed to execute goal on project問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java+Ajax實(shí)現(xiàn)的用戶名重復(fù)檢驗(yàn)功能實(shí)例詳解

    Java+Ajax實(shí)現(xiàn)的用戶名重復(fù)檢驗(yàn)功能實(shí)例詳解

    這篇文章主要介紹了Java+Ajax實(shí)現(xiàn)的用戶名重復(fù)檢驗(yàn)功能,結(jié)合實(shí)例形式詳細(xì)分析了java針對用戶名提交的ajax數(shù)據(jù)庫查詢與重復(fù)檢查功能相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2018-12-12
  • mybatisplus where QueryWrapper加括號嵌套查詢方式

    mybatisplus where QueryWrapper加括號嵌套查詢方式

    這篇文章主要介紹了mybatisplus where QueryWrapper加括號嵌套查詢方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • 基于Java回顧之集合的總結(jié)概述

    基于Java回顧之集合的總結(jié)概述

    在這篇文章里,我們關(guān)注Java中的集合(Collection)。集合是編程語言中基礎(chǔ)的一部分,Java自JDK早期,就引入了Java Collection Framework。設(shè)計(jì)JCF的那個(gè)人,后來還寫了一本書,叫《Effective Java》
    2013-05-05
  • Java方法簽名的獲取實(shí)例代碼

    Java方法簽名的獲取實(shí)例代碼

    這篇文章主要介紹了Java方法簽名的獲取實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • JSP 獲取spring容器中bean的兩種方法總結(jié)

    JSP 獲取spring容器中bean的兩種方法總結(jié)

    這篇文章主要介紹了JSP 獲取spring容器中bean的方法總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 關(guān)于弗洛伊德算法求最短路徑詳解

    關(guān)于弗洛伊德算法求最短路徑詳解

    這篇文章主要介紹了關(guān)于弗洛伊德算法求最短路徑詳解,弗洛伊德算法VS迪杰斯特拉算法:迪杰斯特拉算法通過選定的被訪問頂點(diǎn),求出從出發(fā)訪問頂點(diǎn)到其他項(xiàng)點(diǎn)的最短路徑:弗洛伊德算法中每-個(gè)頂點(diǎn)都是出發(fā)訪問點(diǎn),需要的朋友可以參考下
    2023-07-07

最新評論

肥城市| 长垣县| 宜兴市| 酒泉市| 淮北市| 昂仁县| 前郭尔| 泗阳县| 泰和县| 柳江县| 牟定县| 仁怀市| 永兴县| 临夏市| 呼和浩特市| 鄂尔多斯市| 蓬溪县| 九龙坡区| 菏泽市| 醴陵市| 台山市| 康乐县| 五莲县| 临邑县| 沧源| 微博| 澜沧| 泰兴市| 石阡县| 木兰县| 都安| 临城县| 神农架林区| 大余县| 西藏| 肥乡县| 建德市| 玛纳斯县| 海南省| 深圳市| 福鼎市|