java通过Excel批量上传数据

一、首先在前端写一个上传功能。

<template><!-- 文件上传 --><el-upload class="upload-demo" :on-change="onChange" :auto-upload="false"><el-button type="primary">上传Excel</el-button></el-upload><a target="_blank" type="success" href="/api/upload/write">导出Excle</a></template><script lang="ts" setup>
import { ref } from "vue";
import { uploadApi } from "@/api/index";
import { ElMessage } from "element-plus";
//定义文件上传的函数
const onChange = (file: any, _uploadFiles: any) => {let reader = new FileReader();reader.readAsDataURL(file.raw);reader.onload = (f) => {callUploadApi(file.name, f.target?.result);};
};
//文件上传的函数
const callUploadApi = (name: any, base64: any) => {uploadApi.uploadExcel.call({ name, base64 }).then((res: any) => {ElMessage.success("上传成功");});
};
</script>
请求配置:uploadApi.tsuploadExcel: {name: "上传文件",url: "/api/upload/excel",call: async function name(params: any) {return await http.post(this.url, params);},},

二、后端代码实现

准备工作:1、一个与你上传数据相对于的实体类;

              2、定义一个上传信息对象;

实体类:为了方便演示我就定义两个字段,以供参考:

@Data
public class Person {private Integer id;private String name;private Integer age;
}

上传信息对象:


@Data
public class UploadInfo {private String name;private String base64;
}

Controller层代码:

/** Copyright (c) 2020, 2024,  All rights reserved.**/
package com.by.upload;import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.StopWatch;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.by.dao.PersonMapper;
import com.by.model.FileInfo;
import com.by.model.Upload;
import com.by.service.UploadService;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;@RestController
@RequestMapping("/api/upload")
public class UploadExcel {@Autowiredprivate SqlSessionFactory sqlSessionFactory;@Autowiredprivate PersonMapper personMapper;@Autowiredprivate UploadService uploadService;/*** 导入excle* @param uploadInfo* @return* @throws Exception*/@PostMapping("/excel")public String upload(@RequestBody Upload uploadInfo) throws Exception {String name = uploadInfo.getName();String base64 = uploadInfo.getBase64();String[] strArray = StrUtil.splitToArray(base64, "base64,");byte[] bytes = Base64.decode(strArray[1]);//用于创建一个基于字节数组的输入流。它允许你从一个字节数组中读取数据。ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);// 使用Hutool读取Excel文件ExcelReader reader = ExcelUtil.getReader(byteArrayInputStream);//将读取到的 reader 转化为 List<Man>集合List<Person> persons = reader.readAll(Person.class);//StopWatch类是 Hutool 工具库中的类,用于测量代码执行时间StopWatch stopWatch = new StopWatch();//读取数据的结束时间同时也是写入数据库的开始时间stopWatch.start();//sqlSessionFactory是通过ioc容器注入的  设置其SqlSession的执行器格式ExecutorType.SIMPLE(默认)SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);//循环将List<Man>中的数据插入数据库 方法一//for (Person person : persons) {//    PoItemMapper.xml.insert(person);//}//方法二:mapper.insertBatch(persons);sqlSession.commit();stopWatch.stop();sqlSession.close();System.out.println("插入数据库最终的结果为:" + stopWatch.getTotalTimeSeconds());return "ok";}/*** 导出Excel* @param response* @throws IOException*/@GetMapping("/write")public void exportExcel(HttpServletResponse response) throws IOException {// 创建Excel写入器   参数 true 表示追加数据,即在已有的 Excel 文件上追加新数据。如果设为 false,则会覆盖已有的数据。List<Person> person = personMapper.selectAll();// 创建ExcelWriter对象ExcelWriter writer = ExcelUtil.getWriter(true);int i = 0;while (true) {List<Person> list = person.stream().skip(i * 100000).limit(100000).parallel().collect(Collectors.toList());if (list.isEmpty()) {break;}writer.setSheet("person" + i);// 写入表头writer.addHeaderAlias("id", "Id");writer.addHeaderAlias("name", "姓名");writer.addHeaderAlias("age", "年龄");// 写入当前批次的数据writer.write(list, true);i++;}//response为HttpServletResponse对象   设置响应的内容类型为Excel文件response.setContentType("application/xlsx;charset=utf-8");//test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码//设置响应头,告诉浏览器以附件形式下载文件,文件名为test.xlsx。这样设置可以让浏览器弹出文件下载对话框。response.setHeader("Content-Disposition", "attachment;filename="+"test.xlsx");//获取响应输出流,它是用于将响应的数据发送给客户端的流。ServletOutputStream out = response.getOutputStream();//将Excel数据写入输出流。第二个参数为true表示追加写入,即将数据追加到已有的Excel文件中。writer.flush(out, true);writer.close();//关闭输出流out.close();}
}

dao层代码:

package com.by.dao;

import com.by.upload.Person;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

public interface PersonMapper {

void insert(Person person);void insertBatch(List<Person> persons);List<Person> selectAll();

}

Mapper.xml:```java
<?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.by.dao.PersonMapper"><!--新增数据--><insert id="insert">insert into person(name,age)values (#{name},#{age})</insert><!-- 批量新增数据 --><insert id="insertBatch" >insert into person(name,age)values<foreach collection="persons" item="entity" separator=",">(#{entity.name},#{entity.age})</foreach></insert><select id="selectAll" resultType="com.by.upload.Person">select * from person</select>
</mapper>

注意:poi的版本号

org.apache.poi poi-ooxml 5.0.0 三、文件导出。 前端代码: 导出Excle 特别注意:如果你有拦截器和Spring Sercurity,这两个都需要放开请求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/757264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django单表数据库操作

单表操作 测试脚本 当你只想测试django某一个py文件的内容,可以不用书写前后端的交互,直接写一个测试脚本即可 单表删除 数据库操作方法: 1.all():查询所有的数据 2.filter():带有过滤条件的查询 3.get():直接拿数据对象,不存在则报错 4.first():拿queryset里面的第一个元素…

Http 缓存之 Cache-Control 介绍

Cache-Control 是一个 HTTP 头&#xff0c;用于控制浏览器和其他中间缓存如何缓存和重新使用已缓存的响应。它可以在请求头或响应头中设置。 Cache-Control 的值是一组由逗号分隔的指令&#xff0c;常见的指令有&#xff1a; 1.public&#xff1a;响应可以被任何对象&#xf…

天童知识课堂|“春分”

春色正中分&#xff0c;人间恰良辰。春分&#xff0c;也称升分&#xff0c;是二十四节气之一。春分的到来&#xff0c;意味着春天已经过去一半了&#xff0c;气候也逐渐温暖&#xff0c;阳光更加明媚。而关于春分的知识&#xff0c;你知道多少呢&#xff1f;来和天童美语一起了…

鸿蒙开发实战:【系统服务管理部件】

简介 samgr组件是OpenHarmony的核心组件&#xff0c;提供OpenHarmony系统服务启动、注册、查询等功能。 系统架构 图 1 系统服务管理系统架构图 目录 /foundation/systemabilitymgr ├── samgr │ ├── bundle.json # 部件描述及编译文件 │ ├── frameworks …

vue+elementui中table实现单选行功能

el-table插件可以选择行&#xff0c;但是只能多选&#xff0c;而项目中有单选的需求。 效果如下图所示&#xff0c;点击行或者点击复选框都可以选中行&#xff08;高亮&#xff0c;复选框选中&#xff09;&#xff0c;并且每次只选中当前行&#xff0c;之前选中的行清空。点击标…

Elasticsearch:让你的 Elasticsearch 索引与 Python 和 Google Cloud Platform 功能保持同步

作者&#xff1a;来自 Elastic Garson Elasticsearch 内的索引 (index) 是你可以将数据存储在文档中的位置。 在使用索引时&#xff0c;如果你使用的是动态数据集&#xff0c;数据可能会很快变旧。 为了避免此问题&#xff0c;你可以创建一个 Python 脚本来更新索引&#xff0…

SpringBoot自定义starter开发:记录系统访客独立IP访问次数

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

端口如何映射到外网?

在现代信息化社会中&#xff0c;远程访问已经成为人们工作和生活中不可或缺的一部分。复杂的网络环境和网络限制可能会给远程连接带来不便。在这种情况下&#xff0c;端口映射到外网的技术应运而生。本文将介绍端口映射到外网的概念、应用场景以及一种优秀的解决方案——【天联…

码蹄集2023部分题目

1&#x1f40b;&#x1f40b;&#x1f40b;MC0204世界警察&#xff08;黄金&#xff1b;双指针&#xff09; 时间限制&#xff1a;4秒 占用内存&#xff1a;1024M &#x1f41f;题目描述 世界警察小码哥来谈判了&#xff0c;恐怖分子在银行挟持了 n 个人质&#xff0c;每个…

Docker-安装

Docker ⛅Docker-安装&#x1f320;各平台支持情况&#x1f320;Server 版本安装☃️Ubuntu☃️Centos &#x1f320;Docker 镜像源修改&#x1f320;Docker 目录修改 ⛅Docker-安装 &#x1f320;各平台支持情况 &#x1f320;Server 版本安装 ☃️Ubuntu &#x1f342;安装…

LiveGBS流媒体平台GB/T28181功能-HTTPS 服务支持配置开启什么时候需要开启HTTPS测试SSL证书配置HTTPS测试证书

LiveGBS功能支持HTTPS 服务支持配置开启什么时候需要开启HTTPS测试SSL证书配置HTTPS测试证书 1、配置开启HTTPS1.1、准备https证书1.1.1、选择Nginx类型证书下载 1.2、配置 LiveCMS 开启 HTTPS1.2.1 web页面配置1.2.2 配置文件配置 2、HTTPS测试证书3、验证HTTPS服务4、为什么要…

Visual Studio 2013 - 清理

Visual Studio 2013 - 清理 1. 清理1.1. 工程清理1.2. 解决方案清理 References 1. 清理 Debug Release 1.1. 工程清理 (right mouse click on the project) -> 清理 1.2. 解决方案清理 (right mouse click on the solution) -> 清理解决方案 References [1] Yongq…

Vue技能树总结01

Vue vs React 相似之处: 它们都有使用 Virtual DOM&#xff1b;提供了响应式&#xff08;Reactive&#xff09;和组件化&#xff08;Composable&#xff09;的视图组件。将注意力集中保持在核心库&#xff0c;而将其他功能如路由和全局状态管理交给相关的库。React 比 Vue 有更…

记录C++中,子类同名属性并不能完全覆盖父类属性的问题

问题代码&#xff1a; 首先看一段代码&#xff1a;很简单&#xff0c;就是BBB继承自AAA&#xff0c;然后BBB重写定义了同名属性&#xff0c;然后调用父类AAA的打印函数&#xff1a; #include <iostream> using namespace std;class AAA { public:AAA() {}~AAA() {}void …

什么是Spring Boot

什么是Spring Boot Spring Boot是一个由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Spring Boot致力于…

网络货运平台有哪些

网络货运平台有运满满、货拉拉、快狗打车、滴滴货运、货运宝、G7、货骑士、云鸟配送、积微物联、中储智运等。 运满满 运满满创立于2013年&#xff0c;是国内首家基于云计算、大数据、移动互联网和人工智能技术开发的货运调度平台&#xff0c;是公路物流领域高新技术综合应用…

C++ 命名空间的定义,及使用

命名空间 C中什么是命名空间&#xff1f; &#xff08;个人理解&#xff0c;仅供参考&#xff09; 就像C本身中面向对象中的类&#xff0c;是一个相对封闭的结构&#xff0c;将具有某一特定属性的数据、函数、类对象等归为一类放置在该空间内&#xff0c;这个应该是命名空间…

线性代数基础概念和在AI中的应用

基本概念 线性代数是数学的一个分支&#xff0c;专注于向量、向量空间&#xff08;也称为线性空间&#xff09;、线性变换和矩阵的研究。这些概念在数据科学、人工智能、工程学和物理学等多个领域都有广泛应用。以下是这些基本概念的详细解释和它们在数据处理和AI中的应用。 …

开发微信小程序被鹅厂背刺

最近在开发微信小程序&#xff0c;没来得及更文。等开发完成后&#xff0c;给大家写保姆帖系列。刚刚看到一张动图&#xff0c;忍不住分享给大家。属实反映了鹅厂风格了。

PX4|基于FAST-LIO mid360的无人机室内自主定位及定点悬停

目录 前言环境配置运行fast-lio修改px4位置信息融合方式编写位置坐标转换及传输节点 前言 在配置mid360运行环境后&#xff0c;可使用mid360进行室内的精准定位。 环境配置 在livox_ros_driver2的上级目录src下保存fast-lio的工程 git clone https://github.com/hku-mars/F…