【SpringBoot】实现Excel数据新建表并将数据导入至MySQL数据库

本文介绍了如何使用EasyExcel库读取Excel文件,将其内容转换为CSV字符串,然后通过字符串处理方法分割出属性名和属性值,最终动态创建表并插入MySQL数据库的过程。
摘要由CSDN通过智能技术生成

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

一、EasyExcel转CSV

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

CSV(Comma-Separated Values,逗号分隔的值)是一种简单、实用的文件格式,用于存储和表示包括文本、数值等各种类型的数据。CSV 文件通常以 .csv 作为文件扩展名。这种文件格式的一个显著特点是:文件内的数据以逗号 , 分隔,呈现一个表格形式。CSV 文件已广泛应用于存储、传输和编辑数据

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字符串,记住现在是字符串不是数组。

如何从字符串从分割出属性名(日期、阅读量)以及插入表中的每行属性值?

找出第一个换行符(\n)的位置index,然后从第一位切割到index,这时候就得到属性名的字符串。再以英文逗号为分割符进行分割,得到属性名数组。从index切割到字符串最后的位置就是全部属性值。

如何分割得到每行的属性值呢?

同样以换行符为分割符进行分割得到每行属性值的数组。分割得到的属性值数组内的每个元素再以英文逗号为分割符进行分割得到每行属性值,如"3"和"253"
最后根据属性名和属性值动态构建sql语句进行创建表,插入值的操作。

        //定义表名
        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;


@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);
        }
    }

}

End

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

  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将Excel数据导入MySQL数据库,可以按照以下步骤进行操作: 1. 首先,查看提供的Excel数据数据库的字段,确保它们的对应关系。 2. 对于Excel表中的时间数据,需要进行调整以避免导入数据库后出现部分缺失。可以选择分列、固定列宽,并将数据完全包含在黑线左侧。还需将时间格式改为文本。 3. 对于一些文字数据,如果数据库中利用枚举(int类型)存储类型字段,需要将Excel表的数据改成枚举或int类型。可以使用Ctrl+F选择替换来修改。 4. 接下来,将Excel数据导入MySQL数据库。在MySQL的表上点击鼠标右键,选择需要导入Excel文件和数据表。在导入过程中,选择需要导入的字段行、数据行以及日期格式,并选择需要导入MySQL表。点击下一步即可。 5. 导入完成后,可以查看Excel的字段和MySQL表中的字段是否一致,以确保导入数据正确无误。 6. 最后,刷查看数据库表,确认数据已经成功导入。 另外,还可以使用另一种方法将Excel数据导入MySQL数据库: 1. 将Excel表格另存为CSV文件,CSV文件默认为逗号分隔。 2. 使用记事本工具打开保存好的CSV文件,并将其转换为UTF-8格式。 3. 使用MySQL可视化界面(如navicat for mysql),找到对应的数据库表,右键点击导入向导。 4. 在导入向导中,选择文本文件作为导入类型,并找到保存好的CSV文件作为数据源。选择逗号作为分隔符,并根据需求进行定义。然后检查源表和数据库表是否正确,建立映射关系。 5. 最后,点击开始,等待数据导入完成。在导入完成后,可以打开对应的数据库表,确认数据已经导入成功。 通过以上方法,您可以将Excel表中的数据快速导入MySQL数据库中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值