java通过Excel批量上传下载数据

一、首先在前端写一个上传组件。

<template><!-- 文件上传 --><el-upload class="upload-demo" drag action="" :on-change="onChange" :auto-upload="false"><el-icon class="el-icon--upload"><upload-filled /></el-icon><div class="el-upload__text">Drop file here or <em>click to upload</em></div></el-upload>
</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>

封装一个Api

请求配置:uploadApi.ts

 uploadExcel: {name: "上传文件",url: "/api/uploade/excel",call: async function name(params: any) {return await http.post(this.url, params);},},

二、后端代码实现

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

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

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

@Data
public class Person {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;/*** <p>Project: wms-root - Upload</p>* <p>Powered by scl On 2024-02-29 19:07:05</p>* <p>描述:<p>** @author 孙臣龙 [1846080280@qq.com]* @version 1.0* @since 17*/
@RestController
@RequestMapping("/api/uploade")
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层代码:

/** Copyright (c) 2020, 2024,  All rights reserved.**/
package com.by.dao;import com.by.upload.Person;
import org.apache.ibatis.annotations.Mapper;import java.util.List;/*** <p>Project: wms-root - PersonMapper</p>* <p>Powered by scl On 2024-03-02 10:51:08</p>* <p>描述:<p>** @author 孙臣龙 [1846080280@qq.com]* @version 1.0* @since 17*/
@Mapper
public interface PersonMapper {void insert(Person person);void insertBatch(List<Person> persons);List<Person> selectAll();}

Mapper.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.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的版本号

<!--poi-->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.0.0</version>
</dependency>

三、文件导出。

前端代码: 

<template><a type="success" href="/api/uploade/write" >导出Excle</a>
</template>

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

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

相关文章

iOS 17.0 YYText UIGraphicsBeginImageContextWithOptions 崩溃处理

在iOS17上&#xff0c;YYText会报以下错误&#xff1a; UIGraphicsBeginImageContext() failed to allocate CGBitampContext: size{0, 0}, scale3.000000, bitmapInfo0x2002. Use UIGraphicsImageRenderer to avoid this assert. 解决方法如下&#xff1a; 在YYTextAsyncLayer…

https部署的几个坑

域名解析的坑 阿里云的 云解析DNS&#xff0c;请求解析来源&#xff0c;要使用 指域名访问者所在的地区和使用的运营商网络。这里一定要有默认设置&#xff0c;不然设置联通 电信等选项&#xff0c;导致很多地方域名解析不了 SSL 的坑 阿里云的免费数字证书&#xff0c;有些…

Jsch实践(二):JSch的HostKeyRepository接口如何使用

Jsch实践(二)&#xff1a;JSch的HostKeyRepository接口如何使用 JSch 的 HostKeyRepository 接口用于存储和验证远程服务器的 SSH 主机密钥。当连接到一个新的远程服务器时&#xff0c;JSch 会请求服务器的主机密钥&#xff0c;并期望用户确认是否接受这个密钥。在生产环境中&…

解决C#连接MySQL数据库报错: SslMode=None;

2024/3/12 13:30:30_Program:中文提示 : 连接数据库过程中发生错误&#xff0c;检查服务器是否正常连接字符串是否正确&#xff0c;错误信息&#xff1a;Couldnt connect to serverDbType"MySql";ConfigId"". English Message : Connection open error . …

01、JS实现:去除数组中重复项的算法之一

数组去除重复项的算法&#xff1a; Ⅰ、删除排序数组中的重复项(注意&#xff1a;是已经排好序的)&#xff1a;1、题目描述&#xff1a;2、解题思路&#xff1a;3、实现代码&#xff1a; Ⅳ、小结&#xff1a; Ⅰ、删除排序数组中的重复项(注意&#xff1a;是已经排好序的)&…

【OceanBase诊断调优】 —— 敏捷诊断工具obdiag一键收集诊断信息实践

最近总结一些诊断OCeanBase的一些经验&#xff0c;出一个【OceanBase诊断调优】专题&#xff0c;也欢迎大家贡献自己的诊断OceanBase的方法。 1. 前言 obdiag定位为OceanBase敏捷诊断工具。整体使用上备以下的特点&#xff1a; 部署简单&#xff1a;提供rpm包和OBD上部署的模…

ConcurrentHashMap 为什么不能插入 null?

1、典型回答 简单来说&#xff0c;ConcurrentHashMap 不允许插入 null 值是JDK 源码规定的&#xff0c;如下源码所示(此源码基于JDK 1.8)&#xff1a; 从上述源码可以看出&#xff0c;在添加方法的第一句就加了判断&#xff1a;如果 key 值为 null 或者是 value 值为 null&…

齐聚“向上的力量”,维谛技术(Vertiv)2024年合作伙伴大会成功举办

3月13日&#xff0c;维谛技术&#xff08;Vertiv&#xff0c;NYSE&#xff1a;VRT&#xff09;2024年合作伙伴大会在广东佛山顺利召开&#xff0c;本次大会以“向上的力量”为主题&#xff0c;维谛技术与数百家优秀合作伙伴&#xff08;含港台&#xff09;欢聚一堂&#xff0c;…

【25届秋招备战C++】算法篇-贪心算法(Greedy)

【25届秋招备战C】算法篇-贪心算法 一、简介二、解题思路三、应用场景四、模板函数五、参考 一、简介 一种在每次决策时&#xff0c;总是采取在当前状态下的最好选择&#xff0c;从而希望导致结果是最好或最优的算法。通常用于解决一些最优化问题&#xff0c;如找零问题、霍夫…

vue/uniapp路由history模式下宝塔空间链接打开新窗口显示404解决方法

vue/uniapp路由history模式下宝塔空间链接打开新窗口显示404&#xff0c;或者域名后带路径参数刷新就报404 解决方法&#xff1a; 宝塔中站点配置修改&#xff1a;【配置文件】中添加下面代码&#xff0c;具体如图&#xff1a; location / {try_files $uri $uri/ /index.html…

【MySQL 系列】MySQL 引擎篇

存储引擎是 MySQL 的组件&#xff0c;用于处理不同表类型的 SQL 操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能&#xff0c;使用不同的存储引擎&#xff0c;还可以获得特定的功能。 文章目录 1、MySQL 引擎介绍1.1、MySQL 引擎介绍1.2、常见引擎及其区别和…

Editor.md-编辑器

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

mac安全干净卸载Anaconda3

使用which python显示当前使用的是/Users/username/anaconda3/bin/python 现在想卸载Anaconda&#xff0c;恢复使用mac系统自带的Python 删除隐藏文件目录 rm -rf ~/.anaconda修改~/.bash_profile文件&#xff0c;将anaconda相关删除 也有可能不是~/.bash_profile而是~/.zs…

深入理解FTP协议:文件传输的桥梁

深入理解FTP协议&#xff1a;文件传输的桥梁 在数字化时代&#xff0c;文件传输协议&#xff08;FTP&#xff09;是互联网上进行文件交换的重要手段。FTP允许用户在不同的计算机之间传输文件&#xff0c;无论是上传还是下载&#xff0c;都提供了一种稳定且高效的方式。本文将深…

三维铁木辛柯梁Matlab有限元编程 | 弹簧支座 | 弹性支撑单元| Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

macOS 安装使用 python 虚拟机

在macOS上安装Conda的步骤相对简单。Conda通常通过Anaconda或Miniconda进行安装&#xff0c;Anaconda是一个包含了Conda、Python和许多科学包及其依赖的发行版&#xff0c;而Miniconda则是一个更轻量级的版本&#xff0c;只包含Conda和Python。以下是在macOS上安装Anaconda的步…

Spring Boot启动时执行初始化操作的几种方式

场景 项目中&#xff0c;经常需要在启动过程中初始化一些数据&#xff0c;如从数据库读取一些配置初始化&#xff0c;或从数据库读取一些热点数据到redis进行初始化缓存。 方式一:实现CommandLineRunner 接口重写run方法逻辑 CommandLineRunner是Spring提供的接口&#xff0…

【C++】stack、queue模拟实现+仿函数

stack、queue模拟实现仿函数 stack定义stack模拟实现 queue定义queue模拟实现 priority_queue定义priority_queue模拟实现 deque定义底层分析 容器适配器定义种类 仿函数控制类里面数据的比较逻辑回调函数仿函数两者区别 铁汁们&#xff0c;今天给大家分享一篇stack、queue模拟…

数据库学习案例20240311 -mysql xtrabackup 备份与恢复

下载使用 Software Downloads - Percona 下载需要的依赖包 yum install perl-DBI -y yum install perl-DBD-MySQL -y yum install perl-Time-HiRes -y yum install perl-IO-Socket-SSL -y yum install perl-TermReadKey.x86_64 -y 下载安装配置完环境变量&#xff0c;然后做…

移动端使用 echarts中 滚动条 dataZoom 改造为内容区域可以左右滚动

移动端使用 echarts中 滚动条 dataZoom 改造为内容区域可以左右滚动 直接上图 &#xff1a; 主要是下面这段代码&#xff1a; "dataZoom": [{"type": "inside","show": false,"xAxisIndex": [0],"zoomOnMouseWheel&…