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

这篇具有很好参考价值的文章主要介绍了【SpringBoot】自定义工具类实现Excel数据新建表存入MySQL数据库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【SpringBoot】自定义工具类实现Excel数据新建表存入MySQL数据库,实战笔记,数据库,spring boot,excel,mysql,EasyExcel,后端,java

🏡浩泽学编程:个人主页

 🔥 推荐专栏:《深入浅出SpringBoot》《java对AI的调用开发》
              《RabbitMQ》《Spring》《SpringMVC》《项目实战》
🛸学无止境,不骄不躁,知行合一

前言

本文主要介绍使用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文件格式如下:
【SpringBoot】自定义工具类实现Excel数据新建表存入MySQL数据库,实战笔记,数据库,spring boot,excel,mysql,EasyExcel,后端,java

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

				"日期,阅读量\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数据库中的详细讲解。文章来源地址https://www.toymoban.com/news/detail-840214.html

到了这里,关于【SpringBoot】自定义工具类实现Excel数据新建表存入MySQL数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java解析Excel文件并把数据存入数据库

    使用SpingMVC和hibernate框架实现 web.xml中的配置文件就按照这种方式写,只需要把\\\"application.xml\\\"换成你的配置文件名即可 在这个配置文件中你还可以规定上传文件的格式以及大小等多种属性限制 注意: 1.enctype=“multipart/form-data” 必须写,封装表单 2.method=“post”,提交方式必须

    2024年01月23日
    浏览(36)
  • Python批处理(一)提取txt中数据存入excel

    现从冠层分析软件中保存了叶面积指数分析的结果,然而软件保存格式为txt,且在不同的文件夹中,每个文件夹的txt文件数量不固定,但是txt文件格式固定。现需要批量处理这些txt文件,获取头三行的数据,并存入excel中。 1、file = open(file_name, ‘r’)。使用open()函数打开名为

    2024年02月09日
    浏览(37)
  • chatgpt赋能python:Python如何将数据存入Excel中?

    Python作为一门高级编程语言,广泛应用于数据处理和分析。在数据分析过程中,Excel作为常用的电子表格软件扮演着重要的角色。如果能将Python处理后的数据保存为Excel文件,将会让数据分析过程更加高效便捷。下面我们就来看一下Python如何将数据存入Excel中。 pandas是Python中常

    2024年02月08日
    浏览(35)
  • 【办公自动化】在Excel中按条件筛选数据并存入新的表

      🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 一、Python处理Excel 二、在Excel中按条件筛选数据并存入新的表 三、往期推荐 四、文末

    2024年02月07日
    浏览(32)
  • vuex存储数组(新建,增,删,更新),并存入localstorage定时删除

    使用背景 初始化一个完整数组,但在业务逻辑中会单独更新或增删其中的一部分或全部。 如果每次都是全部更新,直接使用set替换即可,但大部分数组不变只修改个别数据,直接替换的代价较大,因此维护一个增删改的业务。 原来的数据都是有意义的,新数据可能是初始化

    2023年04月26日
    浏览(32)
  • Python 将CSV文件数据存入Mysql数据库

    我们有一个名为student.csv的文件,里面包含有学生的学号、姓名、性别等信息,想要基于Python将CSV文件中的信息写入MySQL数据库的student_info表中。 下面给出具体实现代码。 首先引入所需要的库。 1、get_data函数打开文件csv文件, 通过open方法打开文件(python文件实现了迭代器协

    2024年02月11日
    浏览(29)
  • 64位WIN11安装MYSQL、ODBC链接工具并进行EXCEL数据连接

    目的 :安装MYSQL + MYSQL WORKBENTCH + MYSQL ODBC,并将外部.sql脚本文件内容通过MYSQL WORKBENTCH导入数据库,然后利用MYSQL ODBC将此内容导入EXCEL。 过程 :分为4个大的步骤,需要三个安装包,我放在网盘里链接:https://pan.baidu.com/s/1-oj9AUonumdQrPse3FrSpw 提取码:lyky 一、 安装MYSQL(数据库) 二

    2024年02月04日
    浏览(41)
  • Springboot配置Log4j日志系统,并将日志存入数据库

    Log4j是apache公司开发的一款日志管理系统,可以高效的管理系统中出现的BUG或者各种信息,并且可以已文本的方式或者数据库存入的方式来记录数据 在pom.xml中导入Log4j依赖 在Resources文件夹下创建一个log4j.properties文件 编写配置文件 这是个测试类 可以看见,控制台和数据库表

    2024年02月08日
    浏览(73)
  • python 批量将图片存入excel单元格内

    https://blog.csdn.net/wuyoudeyuer/article/details/128185284 以下是一个示例程序,可以实现将指定目录下的所有图片存储到Excel单元格内。注意需要安装openpyxl库和Pillow库。 以上代码会将指定目录下所有的.jpg或.png文件存储到Excel单元格中,并将单元格大小调整为适应图片大小。需要注意的

    2024年01月21日
    浏览(41)
  • SpringBoot整合Easyexcel实现将数据导出为Excel表格的功能

    本文主要介绍基于SpringBoot +MyBatis-Plus+Easyexcel+Vue实现缺陷跟踪系统中导出缺陷数据的功能,实现效果如下图: EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。 本文

    2024年02月14日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包