java实现批量导入Excel表格数据到数据库

作者:Ytcker 时间:2024-01-19 13:16:58 

本文是基于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);
}
}

来源:https://blog.csdn.net/weixin_43250266/article/details/107684036

标签:java,批量导入,Excel
0
投稿

猜你喜欢

  • 详谈LABJS按需动态加载js文件

    2024-04-23 09:20:56
  • JS实现字符串转驼峰格式的方法

    2024-04-10 13:58:45
  • JS实现针对给定时间的倒计时功能示例

    2024-04-16 09:46:57
  • Python中获取对象信息的方法

    2021-04-04 09:08:22
  • Python数据挖掘中常用的五种AutoEDA 工具总结

    2022-05-20 02:49:51
  • Golang CSP并发机制及使用模型

    2023-09-15 16:13:27
  • Python类的用法实例浅析

    2023-07-31 11:17:18
  • 使用wxPython获取系统剪贴板中的数据的教程

    2023-11-05 18:43:41
  • Go语言实现字符串切片赋值的方法小结

    2024-02-01 14:30:19
  • django 读取图片到页面实例

    2023-02-22 13:30:50
  • 在Windows下安装配置CPU版的PyTorch的方法

    2023-07-18 15:04:17
  • python分割和拼接字符串

    2023-05-12 05:57:03
  • 使用DataFrame删除行和列的实例讲解

    2021-03-05 21:06:04
  • 用Python编写一个漏洞验证脚本

    2022-03-23 02:30:43
  • vuejs实现ready函数加载完之后执行某个函数的方法

    2024-05-29 22:48:43
  • Go语言基础学习教程

    2024-02-06 07:12:11
  • python因子分析的实例

    2021-12-29 18:20:44
  • matplotlib之属性组合包(cycler)的使用

    2021-04-16 19:31:04
  • Python二叉搜索树与双向链表转换算法示例

    2023-07-17 22:49:42
  • 两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法

    2023-06-25 12:44:15
  • asp之家 网络编程 m.aspxhome.com