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

本文是基于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批量导入数据就完成了,感谢支持,大家有什么问题都可以评论留言哦

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

(0)

相关推荐

  • Java中excel表数据的批量导入方法

    本文实例为大家分享了Java中excel表数据的批量导入,供大家参考,具体内容如下 首先看下工具类: import java.awt.Color; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.lang.ref

  • java使用POI批量导入excel数据的方法

    一.定义 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 二.所需jar包: 三.简单的一个读取excel的demo 1.读取文件方法 /** * 读取出filePath中的所有数据信息 * @param filePath excel文件的绝对路径 * */ public static void getDataFromExcel(String filePath) { //String fileP

  • Java实现批量导入excel表格数据到数据库中的方法

    本文实例讲述了Java实现批量导入excel表格数据到数据库中的方法.分享给大家供大家参考,具体如下: 1.创建导入抽象类 package com.gcloud.common.excel; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintStream; import java.sql.SQLException;

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

    本文是基于Apache poi类实现的批量导入读取Excel文件,所以要先引入Apache poi的依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.1</version> </dependency> <dependency> <groupId>org.a

  • Python导入Excel表格数据并以字典dict格式保存的操作方法

    本文介绍基于Python语言,将一个Excel表格文件中的数据导入到Python中,并将其通过字典格式来存储的方法~   本文介绍基于Python语言,将一个Excel表格文件中的数据导入到Python中,并将其通过字典格式来存储的方法.   我们以如下所示的一个表格(.xlsx格式)作为简单的示例.其中,表格共有两列,第一列为学号,第二列为姓名,且每一行的学号都不重复:同时表格的第一行为表头.   假设我们需要将第一列的学号数据作为字典的键,而第二列姓名数据作为字典的值.   首先,导入必要的

  • php通过PHPExcel导入Excel表格到MySQL数据库的简单实例

    如下所示: <?php define('BASE_URL', realpath(dirname(__FILE__))); require_once BASE_URL . '/PHPExcel/PHPExcel.php';//引入PHPExcel类文件 //excel文件的地址 $excel_fiel_path = './phpexcel.xls'; $PHPExcel = new PHPExcel();// 实例化PHPExcel工具类 //分析文件获取后缀判断是2007版本还是2003 $ex

  • java实现批量导入.csv文件到mysql数据库

    这篇博文是在参加CCF时导入.csv文件时自己总结的,虽然NavicatForMysql可以导入.csv文件,可是当我导入的时候不知道是文件太大还是什么原因,总是会出现失败.然后就用java写了一个批量导入数据的类去导入该.csv文件,这里也没有考虑代码的结构,只是为了快速的完成这个工作,做一个总结. package com.cqu.price_prediction.farm; import java.io.File; import java.io.FileNotFoundException;

  • python pdfplumber库批量提取pdf表格数据转换为excel

    目录 需求 一.实现效果图 二.pdfplumber 库 三.代码实现 1.导入相关包 2.读取 pdf , 并获取 pdf 的页数 3.提取单个 pdf 文件,保存成 excel 4.提取文件夹下多个 pdf 文件,保存成 excel 小结 需求 想要提取 pdf 的数据,保存到 excel 中.虽然是可以直接利用 WPS 将 pdf 文件输出成 excel,但这个功能是收费的,而且如果将大量pdf转excel的时候,手动去输出是非常耗时的.我们可以利用 python 的三方工具库 pdfpl

  • MySQL批量导入Excel数据(超详细)

    目录 1.将excel表格转换为csv格式 2.将CSV直接导入到数据库中 补充 前言: 今天遇到一个需求,批量更新数据库中全国各地的物流价格,产品经理很贴心的为我做好了数据表格,说是上一个技术也是这么做的,好,压力给到我这边.话不多说,直接上步骤. 1.将excel表格转换为csv格式 1.准备好我们需要导入的excel表,里面有很多需要我们导入的数据. 2.将表头修改为英文,尽量和数据库表字段对应 3.将excel转换为CSV数据格式 (1)点击另存为 (2)文件类型选择为:CSV(逗号分隔

  • 解决Java导入excel大量数据出现内存溢出的问题

    问题:系统要求导入40万条excel数据,采用poi方式,服务器出现内存溢出情况. 解决方法:由于HSSFWorkbook workbook = new HSSFWorkbook(path)一次性将excel load到内存中导致内存不够. 故采用读取csv格式.由于csv的数据以x1,x2,x3形成,类似读取txt文档. private BufferedReader bReader; /** * 执行文件入口 */ public void execute() { try { if(!path.

  • java 使用poi 导入Excel数据到数据库的步骤

    由于我个人电脑装的Excel是2016版本的,所以这地方我使用了XSSF 方式导入 . 1 先手要制定一个Excel 模板 把模板放入javaWeb工程的某一个目录下如图: 2 模板建好了后,先实现模板下载功能 下面是页面jsp代码在这里只贴出部分代码 <!-- excel 导入小模块窗口 --> <div id="importBox" class="" style="display: none;"> <form i

  • 如何将excel表格数据导入postgresql数据库

    实际的工作中,我们经常会碰到统计数据的工作,有些维度的统计数据因为工作需要我们需要导出为excel作为报表附件供不同的部门审查.为了方便以后的对比工作,领导会让在数据库中创建一张表,用于专门记录这些数据.此时我们DBA需要将这些excel表格导入到数据库中,copy和\copy命令为我们提供了解决办法,本文主要通过copy命令的使用,介绍如何将excel表格导入至数据库中.关于copy及\copy命令的区别,请广大博友通过另一篇文章<如何将postgresql数据库表内数据导出为excel格式>

随机推荐