springboot实现简单的excel导入

前文其实已经实现了较为复杂的excel导入了,这篇博客就给大家介绍简单的excel表格导入方法

以下是我的excel表格:

以下是我的实体类:

package com.datapojo.bean;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;import java.io.Serializable;
import java.util.Date;/*** <p>* * </p>** @author yinan* @since 2024-03-08*/
@Getter
@Setter
@Builder
@TableName("data_standard_manage")
@ApiModel(value = "DataStandardManage对象", description = "")
public class DataStandardManage implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty("数据库标准id")@TableId(value = "data_id", type = IdType.AUTO)private Integer dataId;@ApiModelProperty("数据标准编号")@TableField("data_standard_code")private String dataStandardCode;@ApiModelProperty("中文名")@TableField("cn_name")private String cnName;@ApiModelProperty("英文名")@TableField("en_name")private String enName;@ApiModelProperty("数据标准说明")@TableField("data_standard_explain")private String dataStandardExplain;@ApiModelProperty("来源机构")@TableField("source_orgnization")private String sourceOrgnization;@ApiModelProperty("数据类型")@TableField("data_standard_type")private String dataStandardType;@ApiModelProperty("数据长度")@TableField("data_standard_length")private Double dataStandardLength;@ApiModelProperty("数据精度")@TableField("data_standard_accuracy")private Double dataStandardAccuracy;@ApiModelProperty("默认值")@TableField("data_standard_default")private String dataStandardDefault;@ApiModelProperty("取值范围的最大值")@TableField("data_standard_value_max")private String dataStandardValueMax;@ApiModelProperty("取值范围的最小值")@TableField("data_standard_value_min")private String dataStandardValueMin;@ApiModelProperty("枚举范围:字典组编码")@TableField("data_standard_enumeration_range")private String dataStandardEnumerationRange;@ApiModelProperty("标准状态(0:未发布  1:已发布 2:已停用)")@TableField("data_standard_status")private Integer dataStandardStatus;@ApiModelProperty("是否为空(0:可为空 1:不为空)")@TableField("data_standard_is_blank")private Integer dataStandardIsBlank;@ApiModelProperty("创建时间")@TableField("create_time")@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", timezone = "GMT+8")private Date createTime;@ApiModelProperty("修改数据")@TableField("update_time")@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", timezone = "GMT+8")private Date updateTime;}
FileUploadConfig工具类:
public String objectNameFromUploadPath(String filepath) {// 假设filepath是一个完整的URL形式// 首先判断是否为空或者不是一个合法的HTTP/HTTPS URLif (filepath == null || !(filepath.startsWith("http://") || filepath.startsWith("https://"))) {throw new IllegalArgumentException("Invalid file path: " + filepath);}try {// 将文件路径转换成URL对象URL url = new URL(filepath);// 获取URL的路径部分String path = url.getPath();// 我们需要去掉路径前的“/”,因为OSS object name是不带前导“/”的if (path.startsWith("/")) {path = path.substring(1);}// 返回“files/”之后的部分作为object nameint filesIndex = path.indexOf("files/");if (filesIndex != -1) {// 返回 "files/" 后面的部分return path.substring(filesIndex);} else {// 如果路径中不含 "files/",直接使用路径作为object name,根据具体情况调整return path;}} catch (MalformedURLException e) {throw new IllegalArgumentException("Malformed file path URL: " + filepath, e);}}

这里的filepath路径我是将前端传给我的文件先上传到oss上面然后获取的链接,你也可以上传到自己本地然后获取文件,或者后台私信我给你具体的上传oss的代码。

接下来是具体的service里面的实现方法:

  public R addDataStandardsByExcel(MultipartFile file) throws IOException {
//        String filepath = fileUploadConfig.upload(file);String filepath = "https://yinan-bucket.oss-cn-beijing.aliyuncs.com/files/33ae3fdb-7b9d-46f4-8227-62c0189c08d6.xlsx";String filename = fileUploadConfig.objectNameFromUploadPath(filepath);System.out.println("filepath:" + filepath + "  filename:" + filename);String fileName = file.getOriginalFilename();
//        if (Objects.equals(filepath, "文件上传失败")) {
//            return R.Failed("文件上传失败,无法进行数据导入");
//        }
//        初始化变量boolean notNull = false;List<DataStandardManage> dsmList = new ArrayList<>();
//        InputStream is = fileUploadConfig.download(filename);InputStream is = file.getInputStream();
//        检查文件格式是否正确if (!fileName.matches("^.+\\.(?i)(xls)$") && !fileName.matches("^.+\\.(?i)(xlsx)$")) {
//            自定义异常处理throw new FileNotStandardException(MessageConstant.File_NOT_STANDARD);}Workbook workbook = null;try {// 判断文件是2003格式的Excel还是2007格式的Excelboolean isExcel2003 = true;if (fileName.matches("^.+\\.(?i)(xlsx)$")) {isExcel2003 = false;}
//        创建workbook对象workbook = null;if (isExcel2003) {workbook = new HSSFWorkbook(is);} else {workbook = new XSSFWorkbook(is);}
//        获取第一个工作表Sheet sheet = workbook.getSheetAt(0);
//        判断是否为空if (sheet != null) {notNull = false;} else {throw new FileIsEmptyException(MessageConstant.FILE_IS_EMPTY);}
//        遍历工作表的每一行for (int i = 1; i <= Objects.requireNonNull(sheet).getLastRowNum(); i++) {Row row = sheet.getRow(i);// 检查行是否为空if (row == null) {continue; // 如果为空,跳过该行}DataStandardManage dsm = null;String dsmCnName = row.getCell(0).getStringCellValue();String dsmEnName = row.getCell(1).getStringCellValue();String dsmExplain = row.getCell(2) == null ? null : row.getCell(2).getStringCellValue();Integer dsmIsBlank = Objects.equals(row.getCell(3).getStringCellValue(), "可为空") ? 0 : 1;String dsmSourceOrg = row.getCell(4).getStringCellValue();String dsmDefault = row.getCell(5) == null ? null : row.getCell(5).getStringCellValue();String dsmDataType = row.getCell(6).getStringCellValue();Double dsmLength = row.getCell(7) == null ? null : row.getCell(7).getNumericCellValue();// 格式化科学计数法,取一位整数,如取小数,值如0.0,取小数点后几位就写几个0DecimalFormat df = new DecimalFormat("0");Double dsmAccuracy = ObjectUtils.isEmpty(row.getCell(8).getNumericCellValue()) ? null : row.getCell(7).getNumericCellValue();
//                Integer dsmAccuracy = dsmAccuracyTemp == null ? null : Integer.parseInt(df.format(dsmAccuracyTemp));Double dsmMinTemp = ObjectUtils.isEmpty(row.getCell(9).getNumericCellValue()) ? null : row.getCell(8).getNumericCellValue();String dsmMin = dsmMinTemp == null ? null : df.format(dsmMinTemp);//                String dsmMin=ObjectUtils.isEmpty(row.getCell(9))?null:String.valueOf(row.getCell(9).getNumericCellValue());//使用此方法也可以,但是转换后格式有点不对Double dsmMaxTemp = ObjectUtils.isEmpty(row.getCell(10).getNumericCellValue()) ? null : row.getCell(10).getNumericCellValue();String dsmMax = dsmMaxTemp == null ? null : df.format(dsmMaxTemp);
//                String dsmMax=ObjectUtils.isEmpty(row.getCell(10))?null:String.valueOf(row.getCell(10).getNumericCellValue());String dsmMaBiao = row.getCell(11) == null ? null : row.getCell(11).getStringCellValue();dsm = DataStandardManage.builder().dataStandardCode(RandomUtil.generateRandomNumber("BZ",2)).cnName(dsmCnName).enName(dsmEnName).dataStandardExplain(dsmExplain).sourceOrgnization(dsmSourceOrg).dataStandardType(dsmDataType).dataStandardIsBlank(dsmIsBlank).dataStandardDefault(dsmDefault).dataStandardLength(dsmLength).dataStandardAccuracy(dsmAccuracy).dataStandardValueMin(dsmMin).dataStandardValueMax(dsmMax).dataStandardEnumerationRange(dsmMaBiao).createTime(dateConfig.getDate()).updateTime(dateConfig.getDate()).dataStandardStatus(0).build();dsmList.add(dsm);}for (DataStandardManage dsm : dsmList) {dataStandardManageDao.insert(dsm);System.out.println("插入:" + dsm);}is.close();return R.Success("导入成功");} catch (Exception e) {// 处理文件读取异常e.printStackTrace(); // 这里可以记录日志或者返回相应错误信息return R.Failed("文件读取异常,无法进行数据导入");} finally {// 确保关闭流if (workbook != null) {workbook.close();}is.close();}}

 代码中均做有注释,不懂得可以在评论区进行留言~

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

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

相关文章

直接插入排序 希尔排序 选择排序 堆排序

目录 一. 排序的概念及应用 1.1 排序的概念 1.2 常见的排序算法 二. 常见排序算法的实现(从小到大排序) 2.1 插入排序 2.1.1基本思想&#xff1a; 2.1.2 直接插入排序 2.1.3 希尔排序( 缩小增量排序) 2.2 选择排序 2.2.1基本思想&#xff1a; 2.2.2 直接选择排序: 2…

动态规划——线性dp

数字三角形 // 从上到下 #include <iostream> #include <algorithm> using namespace std; const int N 510, INF 1e9; int n; int a[N][N]; int f[N][N];int main() {scanf("%d", &n);for (int i 1; i < n; i )for (int j 1; j < i; j …

计算机组成原理 CPU组成与机器指令执行实验

一、实验目的 (1)将微程序控制器同执行部件( 整个数据通路)联机&#xff0c;组成一台模型计算机; (2)用微程序控制器控制模型机数据通路; (3)通过CPU运行九条机器指令(排除中断指令)组成的简单程序&#xff0c;掌握机器指令与微指令的关系&#xff0c;牢固建立计算机的整机概…

深度学习pytorch——2D函数优化实例(持续更新)

课程&#xff1a;课时46 优化问题实战_哔哩哔哩_bilibili 这就是我们今天要求的2D函数&#xff1a; 下图是使用python绘制出来的图像&#xff1a; 但是可以看出有4个最小值&#xff0c;但是还是不够直观&#xff0c;还是看课程里面给的比较好&#xff0c;蓝色是最低点位置&am…

Python 全栈系列236 rabbit_agent搭建

说明 通过rabbit_agent, 以接口方式实现对队列的标准操作&#xff0c;将pika包在微服务内&#xff0c;而不必在太多地方重复的去写。至少在服务端发布消息时&#xff0c;不必再去考虑这些问题。 在分布式任务的情况下&#xff0c;客户端本身会启动一个持续监听队列的客户端服…

Django(一)- 环境搭建和快速入门

一、搭建环境 1、创建Python虚拟环境 (base) C:\Users\35351>conda create -n django_study python3.9 2、安装Django (django_study) C:\Users\35351>pip install Django >> 查看安装版本 (django_study) C:\Users\35351>python -m django --version 3、安…

数据分析与挖掘

数据起源&#xff1a; 规模庞大&#xff0c;结构复杂&#xff0c;难以通过现有商业工具和技术在可容忍的时间内获取、管理和处理的数据集。具有5V特性&#xff1a;数量&#xff08;Volume&#xff09;&#xff1a;数据量大、多样性&#xff08;Variety&#xff09;&#xff1a…

CSS(二)

一、CSS 的复合选择器 1.1 什么是复合选择器 在 CSS 中&#xff0c;可以根据选择器的类型把选择器分为基础选择器和复合选择器&#xff0c;复合选择器是建立在基础选择器之上&#xff0c;对基本选择器进行组合形成的。 复合选择器可以更准确、更高效的选择目标元素&#xff…

OC对象 - 关联对象(如何给分类添加成员变量)

文章目录 OC对象 - 关联对象&#xff08;如何给分类添加成员变量&#xff09;1. 基本使用1.1 提供的API1.1.1 添加关联对象1.1.2 获得关联对象1.1.3 移除所有关联对象1.1.3 修饰符 1.2 使用方法1.2 Key的常见用法1.2.1 使用的get方法的selecor作为key1.2.2 使用指针的地址作为k…

LeetCode每日一题——移除链表元素

移除链表元素OJ链接&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 思路&#xff1a; 这与之前的移除元素的题目很相似&#xff0c;那么我们同样可以用类似的做法&#xff08;双指针&#xff09;进行解题。但是这是一个链表删除&a…

树状数组原理和代码

树状数组 求下标的对应 求i管着的下标的范围 方法&#xff1a;拆掉最右侧的1然后1 到你自己 query sum 1-i的和 拆掉最右侧的1 再把下一个数值吸收到sum 重复这个过程直到全变0为止 add 方法&#xff1a;加上最右侧的1 到上限为止 lowbit方法 单点增加范围查询模板 #inc…

no main manifest attribute, in xxx.jar

找不到主类&#xff0c;如果是maven 项目&#xff0c;在pom.xml 指定主类 <mainClass>com.example.demo.Demo2Application</mainClass>还是不行的话&#xff0c;把 <skip>true</skip>去掉

nodejs+vue高校师资管理系统python-flask-django-php

快速发展的社会中&#xff0c;人们的生活水平都在提高&#xff0c;生活节奏也在逐渐加快。为了节省时间和提高工作效率&#xff0c;越来越多的人选择利用互联网进行线上打理各种事务&#xff0c;然后线上管理系统也就相继涌现。与此同时&#xff0c;人们开始接受方便的生活方式…

从FasterTransformer源码解读开始了解大模型(1.0)了解FasterTransformer

从FasterTransformer源码解读开始了解大模型&#xff08;1.0&#xff09;了解FasterTransformer 写在前面的话 最近的一年时间真是令人感慨&#xff0c;换了个工作方向&#xff0c;学了些深度算子开发相关知识&#xff0c;工作也转到对LLM的学习和开发了。入行不算深&#xf…

谷粒商城——缓存的概念

1. 使用缓存的好处&#xff1a;减少数据库的访问频率&#xff0c;提高用户获取数据的速度。 2. 什么样的数据适合存储到缓存中&#xff1f; ①及时性、数据一致性要求不高的数据&#xff0c;例如物流信息、商品类目信息 ②访问量大更新频率不高的数据(读多、写少) 3. 读模式…

加密技术概述

传输数据时的四个问题 窃听 数字加密 假冒 消息认证或数字签名 篡改 消息认证码或数字签名 事后否认 数字签名 加密技术 将数据变成第三者的计算机无法理解的形式&#xff0c;然后再将其恢复成原本数据的一系列操作就是加密技术。 哈希函数 哈希函数可以把给定的数据转…

设计模式之状态模式(一)

设计模式专栏&#xff1a; http://t.csdnimg.cn/4Mt4u 目录 1.概述 2.结构 3.实现 4.总结 1.概述 状态模式( State Pattern)也称为状态机模式( State Machine pattern), 是允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类, 属于行为型模式。 在状…

Vue3+echarts绘制世界地图

先放效果图 之前所查找的资料都没有讲清楚如何引入地图文件并绘制地图&#xff0c;下面做一个记录。 首先下载对应的地图json文件&#xff0c;这里可以参考我的这篇文章&#xff0c;提供了下载地址&#xff1a;记录echarts各种地图json文件下载地址-CSDN博客 第二步&#xff…

笔记本和台式机主板内部结构分析

笔记本和态势机主板内存接口以及配件安装位置 笔记本主板 1 以thinkpad L-490为例,使用拆机小工具拆机&#xff0c;打开后面板&#xff0c;内部结构示意图如下 台式机主板 以技嘉-B660M-AORUS-PRO-AX型号主板为例 笔记本电脑和台式机电脑的相同之处 CPU&#xff1a;笔记本…

【boost_search搜索引擎】1.获取数据源

boost搜索引擎 1、项目介绍2、获取数据源 1、项目介绍 boost_search项目和百度那种不一样&#xff0c;百度是全站搜索&#xff0c;而boost_search是一个站内搜索。而项目的宏观上实现思路就如同图上的思路。 2、获取数据源 我们要实现一个站内搜索&#xff0c;我们就要有这…