【SpringBoot】自定义工具类实现Excel数据新建表存入MySQL数据库

news2024/9/23 5:23:41

在这里插入图片描述

🏡浩泽学编程:个人主页

 🔥 推荐专栏:《深入浅出SpringBoot》《java对AI的调用开发》
              《RabbitMQ》《Spring》《SpringMVC》《项目实战》

🛸学无止境,不骄不躁,知行合一

文章目录

  • 前言
  • 一、EasyExcel转CSV
  • 二、分割建表入库
  • 总结


前言

本文主要介绍使用EasyExcel读取Excel内数据并转换为csv格式数据(String字符串),然后实现字符串分割,分割出属性名和属性值建表插入MySQL数据库中。


一、EasyExcel转CSV

使用EasyExcel读取Excel文件,转换为csv数据,也就是转化为一个字符串。

工具类:

/**
 * @Version: 1.0.0
 * @Author: Dragon_王
 * @ClassName: ExcelUtils
 * @Description: Excel相关工具类
 * @Date: 2024/3/9 11:24
 */

import cn.hutool.core.collection.CollUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * Excel 相关工具类
 */
@Slf4j
public class ExcelUtils {

    /**
     * excel 转 csv
     *
     * @param multipartFile
     * @return
     */
    public static String excelToCsv(MultipartFile multipartFile) {
        // 读取数据
        List<Map<Integer, String>> list = null;
        try {
            list = EasyExcel.read(multipartFile.getInputStream()).excelType(ExcelTypeEnum.XLSX).sheet().headRowNumber(0).doReadSync();
        } catch (IOException e) {
            log.error("表格处理错误", e);
        }
        if (CollUtil.isEmpty(list)) {
            return "";
        }
        // 转换为 csv
        StringBuilder stringBuilder = new StringBuilder();
        // 读取表头
        LinkedHashMap<Integer, String> headerMap = (LinkedHashMap) list.get(0);
        List<String> headerList = headerMap.values().stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList());
        stringBuilder.append(StringUtils.join(headerList, ",")).append("\n");
        // 读取数据
        for (int i = 1; i < list.size(); i++) {
            LinkedHashMap<Integer, String> dataMap = (LinkedHashMap) list.get(i);
            List<String> dataList = dataMap.values().stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList());
            stringBuilder.append(StringUtils.join(dataList, ",")).append("\n");
        }
        return stringBuilder.toString();
    }
}

实际运用中,只需要如下调用:

//传入的是Excel文件,不是路径哦
ExcelUtils.excelToCsv(Excel文件);

Excel文件格式如下:
在这里插入图片描述

读取的数据如下格式(这里我用加号拼接更清晰,实际上就是一个包含换行符的字符串,并不包含+号):

				"日期,阅读量\n" +
                "3,253\n" +
                "4,408\n" +
                "5,363\n" +
                "6,955\n" +
                "7,496\n" +
                "8,1310\n" +
                "9,748";

二、分割建表入库

  • 将获取的csv数据,其实这里就是一个String字符串,记住现在是字符串不是数组。
  • 首先我们分析一下,如何从字符串从分割出属性名(日期、阅读量)以及插入表中的每行属性值(3 253;4 408…):
    • 找出第一个换行符(\n)的位置index,然后从第一位切割到index,这时候就得到属性名的字符串。再以英文逗号为分割符进行分割,得到属性名数组。
    • 从index切割到字符串最后的位置就是全部属性值,那么如何分割得到每行的属性值呢?同样以换行符为分割符进行分割得到每行属性值的数组。(这里注意一下,数组中的每个元素是一个包含一行值的字符串,如:“3,253”)
    • 分割得到的属性值数组内的每个元素再以英文逗号为分割符进行分割得到每行属性值,如"3"和"253"
    • 最后根据属性名和属性值动态构建sql语句进行创建表,插入值的操作。

分割csv数据并调用自定义建表和插入函数:

		//定义表名
        String tableName = "test";
        //获取第一个换行符的索引
        int index = csvData.indexOf("\n");
		//分割出属性名字符串,如"日期,阅读量"
        String colum = csvData.substring(0,index);
        //得到属性名数组,如{"日期","阅读量"}
        String[] colums = colum.split(",");
        //得到全部属性值字符串,如"3,253\n4,408\n5,363\n6,955\n7,496\n8,1310\n9,748"
        String data = csvData.substring(index).trim();
        //得到全部属性值数组,如:{"3,253","4,408","5,363""6,955".......}
        String[] split_data = data.split("\n");
    	//调用建表
        tableCreationUtils.createTable(tableName,colums);
        //调用插入
        tableCreationUtils.Dynamicinsert(tableName,colums,split_data);

动态构造建表sql和插入sql工具类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.sql.SQLException;


/**
 * 构建生成表sql
 *
 * @version 1.0.0
 * @Author: dragon_王
 * @Date: 2024/3/11 20:45:16
 */
@Component
public class TableCreationUtils {

    private final JdbcTemplate jdbcTemplate;
    @Autowired
    public TableCreationUtils(DataSource dataSource){
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    /**
     * 动态构建创建表的sql语句并执行
     *
     * @param tableName 表名字符串
     * @param columnNames 属性名数组
     * @return: void
     * @Date: 2024-03-13 23:23:36
     */
    public  void createTable(String tableName, String[] columnNames) {
        String sql = "CREATE TABLE " + tableName + " (";
        for (int i = 0; i < columnNames.length; i++) {
            sql += columnNames[i] + " VARCHAR(255)";
            if (i < columnNames.length - 1) {
                sql += ", ";
            }
        }
        sql += ");";
        jdbcTemplate.execute(sql);
    }

    /**
     * 动态构建插入sql语句并执行
     *
     * @param tableName 表名字符串
     * @param columnName 属性名数组,如{"日期","阅读"}
     * @param rowData 属性值数组,如{"3,253","4,408","5,363""6,955".......}
     * @return: void
     * @Date: 2024-03-13 23:24:09
     */
    public void Dynamicinsert(String tableName, String[] columnName,String[] rowData) throws SQLException {
        //属性值为空就抛出异常
        if (rowData == null || rowData.length == 0) {
            throw new IllegalArgumentException("Row data must not be null or empty");
        }

        for (int i = 0;i < rowData.length;i++){
            //传进来的是所有属性值数组,如:{"3,253","4,408","5,363""6,955".......}
            //所以以将每个元素取出以英文逗号分割,得到插入的每行元素如["3","253"]
            String[] row = rowData[i].split(",");
            // 构建占位符
            StringBuilder columnNames = new StringBuilder();
            StringBuilder placeholders = new StringBuilder();
            for (int j = 0; j < row.length; j++) {
                if (j > 0) {
                    columnNames.append(", ");
                    placeholders.append(", ");
                }
                columnNames.append(columnName[j]);
                placeholders.append("?"); // 使用?作为PreparedStatement的占位符
            }

            // 构建完整的SQL语句
            String sql = "INSERT INTO " + tableName + " (" + columnNames + ") VALUES (" + placeholders + ")";

            // 使用JdbcTemplate执行插入操作,如第一次循环:insert into tablename (日期,阅读) values (?,?)
            //row:["3","253"]
            jdbcTemplate.update(sql,row);
        }
    }

}

上面代码有以上面EXcel数据为例子的详细讲解,我就不再赘诉,很简单的思路。


总结

以上就是使用EasyExcel读取Excel内数据并转换为csv格式数据(String字符串),然后实现字符串分割,分割出属性名和属性值建表插入MySQL数据库中的详细讲解。

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

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

相关文章

hololens2发布unity设置

生成vs工程再向hololens发布时&#xff0c; Architecture选X64或ARM64都可以成功发布

python-0002-linux安装pycharm

下载软件包 下载地址&#xff1a;https://download.csdn.net/download/qq_41833259/88944791 安装 # 解压 tar -zxvf 你的软件包 # 进入软件解压后的路径&#xff0c;如解压到了/home/soft/pycharm cd /home/soft/pycharm cd bin # 执行启动命令 sh pycharm.sh # 等待软件启…

京东云主机+京美建站SaaS版

京美建站SaaS版 京美建站搭建企业网站、小程序、3000精美模板 链接:https://daili.jd.com/s?linkNo57UBX34BZMWGNFYTOCPVUE7SN36CCIPKLTFLPCUCPYBKSYYBIPS2BJ57GP7RACLDHU66X526ZOULMIXL2VN7DT7IHU 京东云主机&#xff0c;安全稳定&#xff0c;性能强劲&#xff0c;新客下单…

VMware安装Ubuntu 18.04.2

下载Ubuntu映像 下载地址&#xff1a;http://old-releases.ubuntu.com/releases/18.04/ 下载名称&#xff1a; ubuntu-18.04.2-desktop-amd64.iso 清华镜像站&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/ 阿里云镜像站&#xff1a;https://mirrors.ali…

ASP.NET区域检验云LIS平台源码 标本全生命周期管理

目录 一、云LIS系统功能亮点 二、收费项目管理 三、检验项目管理 系统功能 云LIS系统源码是一款全面的实验室信息管理系统源码&#xff0c;其主要功能包括样本管理、检测项目管理、质控管理、报告管理、数据分析、两癌筛查等多个方面。具有独立的配套SaaS模式运维管理系统&…

科研学习|论文解读——词汇量及其对主题表示的影响 (IPM, 2017)

原文标题 Vocabulary size and its effect on topic representation 摘要 这项研究调查了如何通过选择性地从被建模的文本语料库的词汇中删除术语来减少主题模型训练的计算开销。我们使用三个数据集&#xff0c;比较了删除单独出现的术语、前0.5%、1%和 5% 最频繁出现的术语以及…

Gitee配置SSH登录

一、背景 新入手的电脑&#xff0c;需要对Gitee上存放的项目进行更改上传&#xff0c;发现上传不了需要登录&#xff0c;便采用SSH密钥进行登录&#xff0c;防止远程管理工程中的信息泄露 二、前提 电脑已下载Git Bash工具&#xff0c;在项目下点击鼠标右键&#xff0c;进入…

多线程(线程池)

线程池 池的概念意味着可以复用, 减少创建, 销毁线程的消耗 即事先把需要使用的线程创建好, 放到 “池” 中, 需要的时候从 “池” 里取, 用完再放回 池里取 这样全程只创建和销毁线程一次(之说是一次哦, 没说一次创建和销毁多少个)即可 标准库线程池的使用 public class Main…

【解读】区块链和分布式记账技术标准体系建设指南

大家好&#xff0c;这里是苏泽。一个从业Java后端的区块链技术爱好者。 今天带大家来解读这份三部门印发的行业建设指南《区块链和分布式记账技术标准体系建设指南》 原文件可查看P020240112840724196854.pdf (www.gov.cn) 以下是个人解读&#xff0c;如有纰漏请指正&#xff…

学习Android的第二十八天

目录 Android Service (服务) 线程 Service (服务) Service 相关方法 Android 非绑定 Service startService() 启动 Service 验证 startService() 启动 Service 的调用顺序 Android 绑定 Service bindService() 启动 Service 验证 BindService 启动 Service 的顺序 …

《LeetCode热题100》笔记题解思路技巧优化_Part_3

《LeetCode热题100》笔记&题解&思路&技巧&优化_Part_3 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题链表&#x1f7e2;1. 相交链表&#x1f7e2;2. 反转链表&…

html5cssjs代码 020 推荐网址

html5&css&js代码 020 推荐网址 一、代码二、解释 这段HTML代码定义了一个网页&#xff0c;它包含了一个标题、一些样式和一个表格。表格中列出了一些推荐的网址&#xff0c;包括序号、名称、网址、描述和备注。每个表格行都包含一个链接到相应网址的超链接。页面的样式…

一种基于宏和serde_json实现的rust web中统一返回类

本人rust萌新&#xff0c;写web碰到了这个&#xff0c;基于ChatGPT和文心一言学了宏&#xff0c;强行把这玩意实现出来了&#xff0c;做个学习记录&#xff0c;如果有更好的方法&#xff0c;勿喷。 先看效果&#xff0c;注意不支持嵌套&#xff0c;且kv映射要用>(因为它这个…

《JAVA与模式》之抽象工厂模式

系列文章目录 文章目录 系列文章目录前言一、使用简单工厂模式的解决方案二、引进抽象工厂模式三、抽象工厂模式结构四、抽象工厂模式的优缺点前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看…

MC78L05ACDR2G线性稳压器芯片中文资料规格书PDF数据手册引脚图参数图片价格

产品概述&#xff1a; MC78L00A系列线性稳压器价格便宜&#xff0c;易于使用&#xff0c;适用于各种需要最高100mA的调节电源的应用。与大功率MC7800和MC78M00系列一样&#xff0c;这款稳压器也提供内部电流限制和高温关断&#xff0c;因此非常坚固耐用。在很多应用中&#xf…

提高工作效率,这 10 款 AI 工具不能错过

作为一个职场打工人&#xff0c;我深知时间和效率的重要性。正是因为如此&#xff0c;我开始使用各种人工智能工具来帮助我提高工作效率。在这篇文章中&#xff0c;我将会分享 10 款必备的 AI 工具&#xff0c;这些工具可以让你的工作更加高效&#xff0c;从而为你节省更多的时…

windows 11访问Debian10上的共享目录

步骤 要在Windows 11上访问Debian 10.0.0的共享目录&#xff0c;可以通过以下步骤来实现&#xff1a; 1. 设置Samba服务&#xff1a;在Debian系统上&#xff0c;需要安装并配置Samba服务&#xff0c;以便能够实现文件夹共享。Samba是一个允许Linux/Unix服务器与Windows操作系…

Windows系统搭建Cloudreve结合内网穿透打造可公网访问的私有云盘

目录 ⛳️推荐 1、前言 2、本地网站搭建 2.1 环境使用 2.2 支持组件选择 2.3 网页安装 2.4 测试和使用 2.5 问题解决 3、本地网页发布 3.1 cpolar云端设置 3.2 cpolar本地设置 4、公网访问测试 5、结语 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff…

C#,数值计算,数据测试用的对称正定矩阵(Symmetric Positive Definite Matrix)的随机生成算法与源代码

C.Hermite 1、对称矩阵 对称矩阵(Symmetric Matrices)是指以主对角线为对称轴,各元素对应相等的矩阵。在线性代数中,对称矩阵是一个方形矩阵,其转置矩阵和自身相等。1855年,埃米特(C.Hermite,1822-1901年)证明了别的数学家发现的一些矩阵类的特征根的特殊性质,如称为埃…

AI智能电话机器人的核心技术是什么?

电话机器人是近几年兴起的人工智能产品&#xff0c;它主要通过电话群呼潜在客户&#xff0c;沟通进行信息筛选&#xff0c;帮助企业选择意向客户。企业使用电话机器人可以减少人工成本&#xff0c;提高工作效率。我们一起来看看智能电话机器人的核心技术是什么&#xff1f; 电话…