热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

这篇文章主要为大家详细介绍了java实现批量导入Excel表格数据到数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文是基于Apache poi类实现的批量导入读取Excel文件,所以要先引入Apache poi的依赖


   org.apache.poi
   poi
   4.1.1
  
  
   org.apache.poi
   poi-ooxml
   4.1.1

在引入依赖之后,我们就可以开始进行操作了,首先,导入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 readExcel(ImportOrderDTO importOrderDTO, String rootPath) {
  List 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 excelCOntent= readExcel(importOrderDTO, rootPath);
   if (excelContent.isEmpty()) {
    return ResultUtil.error("数据为空");
   }
   //下面都是一些逻辑处理,大家一定看得懂就不多说了
   List userList = userMapper.selectList(new EntityWrapper());
   List sameList = new ArrayList<>();
   List 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 

好了,一个简单的Excel批量导入数据就完成了,感谢支持,大家有什么问题都可以评论留言哦

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
  • 本文是网络安全自学系列的一部分,旨在分享网络安全工具的使用技巧和实际操作案例。继之前讨论了XSS跨站脚本攻击的各个方面后,本文将重点介绍Powershell的基础知识及其在网络安全领域的应用。 ... [详细]
  • 如何在Windows 10的Bash中排除系统PATH
    探讨了在Windows 10的Bash环境中,如何通过调整注册表设置来避免调用Win32程序,确保使用的是Bash环境下的工具版本。 ... [详细]
  • 本文详细介绍了跨站脚本攻击(XSS)的基本概念、工作原理,并通过实际案例演示如何构建XSS漏洞的测试环境,以及探讨了XSS攻击的不同形式和防御策略。 ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • SSE图像算法优化系列三:超高速导向滤波实现过程纪要(欢迎挑战)
    自从何凯明提出导向滤波后,因为其算法的简单性和有效性,该算法得到了广泛的应用,以至于新版的matlab都将其作为标准自带的函数之一了&#x ... [详细]
  • 微信小程序开发指南:创建动态电影选座界面
    本文详细介绍如何在微信小程序中实现一个动态且可视化的电影选座组件,提高用户体验。通过合理的布局和交互设计,使用户能够轻松选择心仪的座位。 ... [详细]
  • 深入解析JVM内存模型与分配机制
    本文详细探讨了JVM内存结构的主要组成部分,包括Java虚拟机栈、Java堆、方法区等,并深入分析了HotSpot虚拟机的分代收集策略及其对不同内存区域的管理方式。 ... [详细]
author-avatar
冭獭1314
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有