Spring Boot通过Ajax上传Excel并将数据批量读取到数据库中

适合场景:需要通过excel表格批量向数据库中导入信息

操作流程

【1】前端上传一个excel表格

【2】 后端接收这个excel表格,将表格中的数据存入List集合中

【3】后端通过这个List集合将数据批量填入数据库中

源码地址:https://gitee.com/residual-temperature/import-excel-demo

实现过程

1、pom文件中要加入的jar包

 <!-- 导入excel相关 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency> <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>

因为加入这两个jar包application.yml文件中没有添加配置,所以这里就不展示

2、实体类User

@Repository
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable { private long id;
private String account;
private String password;
private String username;
private String address; }

3、UserMapper文件

@Mapper
@Repository
public interface UserMapper { // 批量添加用户数据
public int addBatchUser(List<User> userList); // 根据用户账号查询用户数据
public User findUserByAccount(String account); // 根据用户账号修改用户信息
public int updateUserByAccount(User user); }

4、UserMapper.xml文件的配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace= "com.yuwen.mapper.UserMapper" >
<!-- 批量导入的实现 -->
<insert id="addBatchUser">
insert into user(account,password,username,address)
values
<foreach collection="userList" item="item" separator=",">
(
#{item.account},
#{item.password},
#{item.username},
#{item.address}
)
</foreach>
</insert> <select id="findUserByAccount" resultType="com.yuwen.pojo.User">
select * from user where account = #{account}
</select> <update id="updateUserByAccount">
update user set account = #{account},password = #{password},username = #{username},address = #{address}
where account = #{account}
</update>
</mapper>

因为UserService只有方法没有实现,所以直接看UserService的实现类UserServiceImpl文件

5、UserServiceImpl文件

@Service
public class UserServiceImpl implements UserService { @Resource
UserMapper userMapper; @Resource
ImportExcelUtils excelUtils; /**
* 批量添加用户信息
* @param userList 用户信息
* @return 用户信息是否添加成功
*/
@Override
public boolean addBatchUser(List<User> userList) {
return userMapper.addBatchUser(userList) > 0;
} /**
* 根据用户账号查看用户是否存在
* @param account 用户账号
* @return 查询到的用户信息
*/
@Override
public User findUserByAccount(String account) {
return userMapper.findUserByAccount(account);
} /**
* 根据用户账号修改用户信息
* @param user 用户信息
* @return 是否修改成功
*/
@Override
public boolean updateUserByAccount(User user) {
return userMapper.updateUserByAccount(user) > 0;
} /**
* 批量导入用户信息
* @param fileName 导入的表名
* @param is 导入表的输入流
* @return 是否导入成功
*/
@Override
public boolean importUserInfo(String fileName, InputStream is){
try {
List<User> userList = excelUtils.upload(fileName, is);
for (int i = 0; i < userList.size(); i++) {
User user = findUserByAccount(userList.get(i).getAccount()); // 查找数据库中看这个用户信息是否存在
if (user != null){
updateUserByAccount(userList.get(i)); // 更新数据库中的用户信息
userList.remove(i); // 移除更新后的用户
i = i - 1; // 因为移除了,所以userList大小减了一而循环加了一,所以要减回去
}
}
return addBatchUser(userList); // 批量添加
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}

6、UserController文件

@RestController
public class UserController { @Resource
UserService userService; // 批量添加数据
@PostMapping("/upload")
public Map<String,String> upload(MultipartFile excelFile) throws Exception{
Map<String,String> map = new HashMap<>();
if (excelFile.isEmpty()){
map.put("mag","文件夹为空,重新上传");
return map;
}else {
String fileName = excelFile.getOriginalFilename();
InputStream is = excelFile.getInputStream();
if (userService.importUserInfo(fileName,is)){
map.put("msg","数据添加成功");
return map;
}else {
map.put("msg","数据添加失败,请重新添加");
return map;
}
}
}
}

7、导入excel的工具类ImportExcelUtils的编写

批量导入的主要代码,主要呈现在这个工具类和上面UserMapper.xml中的批量导入

@Component
public class ImportExcelUtils { // 将表格中的数据添加到List集合中
public List<User> upload(String fileName, InputStream is) throws Exception{
Workbook workbook = getWorkbook(fileName,is);
List<User> userList = new ArrayList<>();
int number = workbook.getNumberOfSheets(); // 获取sheet值
for (int i = 0; i < number; i++) {
Sheet sheet = workbook.getSheetAt(i); // 获取表格页码
if (sheet != null){
int rowNum = sheet.getLastRowNum(); // 获取该页表共有多少行
for (int j = 1; j <= rowNum; j++) { // 一般来说第一行是标题,所以第二行开始读取
Row row = sheet.getRow(j); // 获取表格行
User user = new User();
row.getCell(0).setCellType(Cell.CELL_TYPE_STRING); // 将该单元格获取出来的值设为String类型
user.setAccount(row.getCell(0).getStringCellValue()); // 获取表格单元格并给User设置值
row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
user.setPassword(row.getCell(1).getStringCellValue());
row.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
user.setUsername(row.getCell(2).getStringCellValue());
row.getCell(3).setCellType(Cell.CELL_TYPE_STRING);
user.setAddress(row.getCell(3).getStringCellValue());
System.out.println(user);
userList.add(user);
}
}
}
return userList; } // 判断传入的文件是哪种类型的excel文件
public Workbook getWorkbook(String fileName,InputStream is) throws Exception{
Workbook workbook = null;
String name = fileName.substring(fileName.lastIndexOf("."));
System.out.println(name);
if (".xls".equals(name)){
workbook = new HSSFWorkbook(is);
}else if (".xlsx".equals(name)){
workbook = new XSSFWorkbook(is);
}else {
throw new Exception(" 请上传.xls/.xlsx格式文件!");
}
return workbook;
} }

8、html页面的编写

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件</title>
<script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
<script>
function upload(){
var formData = new FormData(); //创建一个formData对象实例
var excelFile = $("#uploadFile").get(0).files[0];
formData.append("excelFile",excelFile)
$.ajax({
url: 'http://localhost:8081/upload',
data: formData,
type: 'post',
contentType:false, // 必须false才会自动加上正确的Content-Type
processData: false, // 必须false才会避开jQuery对 formdata 的默认处理,XMLHttpRequest会对 formdata 进行正确的处理
success: function (resp){
console.log(resp);
// 后续的操作
}
})
}
</script>
</head>
<body>
<p>上传的文件</p>
<input multiple="multiple" type="file" id="uploadFile">
<br>
<br>
<button onclick="upload()">上传</button>
</body>
</html>

因为这个项目主要是为了excel的读取和导入到数据库,所以就没有进行后续的操作了

项目测试

导入前的数据库和excel表格要导入的数据

数据库初始数据



要插入的表格数据

网页导入表格

结果

返回的信息



添加后的数据库信息

小结

特别注意一点 UserController文件中获取文件名的方法,千万不要写成了 String fileName = excelFile.getName(),而是要用excelFile.getOriginalFilename()方法,这样才能获得文件名

SpringBoot通过Ajax批量将excel中数据导入数据库的更多相关文章

  1. 将Excel中数据导入数据库(三)

    上篇文章将Excel中数据导入数据库时,将从Excel读入的数据均转换成了数据库相应字段的类型,其实这是没有必要的,因为对于数据库各种类型的插入,均可以字符串格式插入.比如表WQ_SWMSAR_A字段 ...

  2. 将Excel中数据导入数据库(二)

    在上篇文章中介绍到将Excel中数据导入到数据库中,但上篇文章例子只出现了nvachar类型,且数据量很小.今天碰到将Excel中数据导入数据库中的Excel有6419行,其中每行均有48个字段,有i ...

  3. 将Excel中数据导入数据库(一)

    在工作中经常要将Excel中数据导入数据库,这里介绍一种方法. 假如Excel中的数据如下: 数据库建表如下: 其中Id为自增字段: Excel中数据导入数据库帮助类如下: using System; ...

  4. Excel表数据导入数据库表中

    ***Excel表数据导入到数据库表中 通过数据库表的模板做成‘Excel’表的数据导入到数据库相应的表中(注意:主表 和 从表的关系,要先导‘主表’在导入从表) 过程:通过数据库的导入工具—先导入为 ...

  5. mysqlconnector将EXCEL表数据导入数据库

    测试excel和脚本放在同一个目录 测试excel和脚本放在同一个目录 #!/usr/bin/env python #coding=utf-8 import xlrd import mysql.con ...

  6. SpringMVC 实现POI读取Excle文件中数据导入数据库(上传)、导出数据库中数据到Excle文件中(下载)

    读取Excale表返回一个集合: package com.shiliu.game.utils; import java.io.File; import java.io.FileInputStream; ...

  7. excel表格数据导入数据库Oracle

    方法一: 1.创建数据表 CREATE TABLE T_USER (   ID             VARCHAR2(32) primary key,   NAME           VARCH ...

  8. larave5.6 将Excel文件数据导入数据库代码实例

    <?php namespace App\Admin\Controllers; use App\AdminUser; use Illuminate\Http\Request; use Excel; ...

  9. java后端服务器读取excel将数据导入数据库

    使用的是easypoi,官网文档:http://easypoi.mydoc.io/ /** * 导入Excel文件 */ @PostMapping("/importTeacher" ...

随机推荐

  1. nacos 实战(史上最全)

    文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...

  2. 重新整理 .net core 实践篇—————工作单元模式[二十六]

    前言 简单整理一下工作单元模式. 正文 工作单元模式有3个特性,也算是其功能: 使用同一上下文 跟踪实体的状态 保障事务一致性 工作单元模式 主要关注事务,所以重点在事务上. 在共享层的基础建设类库中 ...

  3. 测试开发之网络篇-IP地址

    IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异.这里介绍一下目前广泛使用的IPv4版本. IP地址使用一种统一的格式,为互联 ...

  4. 办公利器!用Python批量识别发票并录入到Excel表格

    辰哥今天来分享一篇办公干货文章:用Python批量识别发票并录入到Excel表格.对于财务专业等学生或者公司财务人员来说,将报账发票等汇总到excel简直就是一个折磨. 尤其是到年底的时候,公司的财务 ...

  5. etcd 添加用户,授权特定目录

    适用场景 多组共用etcd集群,创建一个新用户.新目录,让这个新用户只有新目录的使用权限. 命令和顺序 创建目录,注意此处是v2 curl -u root:pwd http://host:2379/v ...

  6. 使用阿里云服务器部署jupyter notebook远程访问

    安装annaconda 与jupyter notebook annaconda在已经自带了jupyter notebook.jupyter lab.ipython 等一系列工具,不需要再单独安装这些工 ...

  7. 【Azure 事件中心】在Service Bus Explorer工具种查看到EventHub数据在分区中的各种属性问题

    问题描述 通过Service Bus Explorer工具,查看到Event Hub的属性值,从而产生的问题及讨论: Size in Bytes:   这个是表示当前分区可以存储的最大字节数吗? La ...

  8. 怎样用好PS中的钢笔工具(附练习钢笔工具网站)

    想要在PS中得心应手的的描绘出自己想要的线条(也就是路径),就需要对[钢笔工具]有一个充分的理解. [钢笔工具]绘出来的线条全部都是贝赛尔曲线,所以你在学习[钢笔工具]之前,要补习一下贝赛尔曲线的常识 ...

  9. 10 一键部署LNMP网站平台

    #!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin NGINX_V=1.19.1 P ...

  10. 面试官:spring中定义bean的方法有哪些?我一口气说出了12种,把面试官整懵了。

    前言 在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜.我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工 ...