最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot自定義工具類實(shí)現(xiàn)Excel數(shù)據(jù)存入MySQL數(shù)據(jù)庫

 更新時(shí)間:2024年03月15日 09:12:24   作者:浩澤學(xué)編程  
這篇文章主要為大家詳細(xì)介紹了如何使用EasyExcel讀取Excel內(nèi)數(shù)據(jù)并轉(zhuǎn)換為csv格式數(shù)據(jù),然后實(shí)現(xiàn)字符串分割,分割出屬性名和屬性值建表插入MySQL數(shù)據(jù)庫中,感興趣的可以了解下

前言

本文主要介紹使用EasyExcel讀取Excel內(nèi)數(shù)據(jù)并轉(zhuǎn)換為csv格式數(shù)據(jù)(String字符串),然后實(shí)現(xiàn)字符串分割,分割出屬性名和屬性值建表插入MySQL數(shù)據(jù)庫中。

一、EasyExcel轉(zhuǎn)CSV

使用EasyExcel讀取Excel文件,轉(zhuǎn)換為csv數(shù)據(jù),也就是轉(zhuǎn)化為一個(gè)字符串。

工具類:

/**
 * @Version: 1.0.0
 * @Author: Dragon_王
 * @ClassName: ExcelUtils
 * @Description: Excel相關(guān)工具類
 * @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 相關(guān)工具類
 */
@Slf4j
public class ExcelUtils {

    /**
     * excel 轉(zhuǎn) csv
     *
     * @param multipartFile
     * @return
     */
    public static String excelToCsv(MultipartFile multipartFile) {
        // 讀取數(shù)據(jù)
        List<Map<Integer, String>> list = null;
        try {
            list = EasyExcel.read(multipartFile.getInputStream()).excelType(ExcelTypeEnum.XLSX).sheet().headRowNumber(0).doReadSync();
        } catch (IOException e) {
            log.error("表格處理錯(cuò)誤", e);
        }
        if (CollUtil.isEmpty(list)) {
            return "";
        }
        // 轉(zhuǎn)換為 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");
        // 讀取數(shù)據(jù)
        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();
    }
}

實(shí)際運(yùn)用中,只需要如下調(diào)用:

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

Excel文件格式如下:

讀取的數(shù)據(jù)如下格式(這里我用加號(hào)拼接更清晰,實(shí)際上就是一個(gè)包含換行符的字符串,并不包含+號(hào)):

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

二、分割建表入庫

將獲取的csv數(shù)據(jù),其實(shí)這里就是一個(gè)String字符串,記住現(xiàn)在是字符串不是數(shù)組。

首先我們分析一下,如何從字符串從分割出屬性名(日期、閱讀量)以及插入表中的每行屬性值(3 253;4 408…):

  • 找出第一個(gè)換行符(\n)的位置index,然后從第一位切割到index,這時(shí)候就得到屬性名的字符串。再以英文逗號(hào)為分割符進(jìn)行分割,得到屬性名數(shù)組。
  • 從index切割到字符串最后的位置就是全部屬性值,那么如何分割得到每行的屬性值呢?同樣以換行符為分割符進(jìn)行分割得到每行屬性值的數(shù)組。(這里注意一下,數(shù)組中的每個(gè)元素是一個(gè)包含一行值的字符串,如:“3,253”)
  • 分割得到的屬性值數(shù)組內(nèi)的每個(gè)元素再以英文逗號(hào)為分割符進(jìn)行分割得到每行屬性值,如"3"和"253"
  • 最后根據(jù)屬性名和屬性值動(dòng)態(tài)構(gòu)建sql語句進(jìn)行創(chuàng)建表,插入值的操作。

分割csv數(shù)據(jù)并調(diào)用自定義建表和插入函數(shù):

        //定義表名
        String tableName = "test";
        //獲取第一個(gè)換行符的索引
        int index = csvData.indexOf("\n");
        //分割出屬性名字符串,如"日期,閱讀量"
        String colum = csvData.substring(0,index);
        //得到屬性名數(shù)組,如{"日期","閱讀量"}
        String[] colums = colum.split(",");
        //得到全部屬性值字符串,如"3,253\n4,408\n5,363\n6,955\n7,496\n8,1310\n9,748"
        String data = csvData.substring(index).trim();
        //得到全部屬性值數(shù)組,如:{"3,253","4,408","5,363""6,955".......}
        String[] split_data = data.split("\n");
        //調(diào)用建表
        tableCreationUtils.createTable(tableName,colums);
        //調(diào)用插入
        tableCreationUtils.Dynamicinsert(tableName,colums,split_data);

動(dòng)態(tài)構(gòu)造建表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;


/**
 * 構(gòu)建生成表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);
    }

    /**
     * 動(dòng)態(tài)構(gòu)建創(chuàng)建表的sql語句并執(zhí)行
     *
     * @param tableName 表名字符串
     * @param columnNames 屬性名數(shù)組
     * @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);
    }

    /**
     * 動(dòng)態(tài)構(gòu)建插入sql語句并執(zhí)行
     *
     * @param tableName 表名字符串
     * @param columnName 屬性名數(shù)組,如{"日期","閱讀"}
     * @param rowData 屬性值數(shù)組,如{"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++){
            //傳進(jìn)來的是所有屬性值數(shù)組,如:{"3,253","4,408","5,363""6,955".......}
            //所以以將每個(gè)元素取出以英文逗號(hào)分割,得到插入的每行元素如["3","253"]
            String[] row = rowData[i].split(",");
            // 構(gòu)建占位符
            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的占位符
            }

            // 構(gòu)建完整的SQL語句
            String sql = "INSERT INTO " + tableName + " (" + columnNames + ") VALUES (" + placeholders + ")";

            // 使用JdbcTemplate執(zhí)行插入操作,如第一次循環(huán):insert into tablename (日期,閱讀) values (?,?)
            //row:["3","253"]
            jdbcTemplate.update(sql,row);
        }
    }

}

上面代碼有以上面EXcel數(shù)據(jù)為例子的詳細(xì)講解,我就不再贅訴,很簡(jiǎn)單的思路。

以上就是SpringBoot自定義工具類實(shí)現(xiàn)Excel數(shù)據(jù)存入MySQL數(shù)據(jù)庫的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Excel數(shù)據(jù)存入數(shù)據(jù)庫的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot自帶線程池ThreadPoolTaskExecutor使用

    springboot自帶線程池ThreadPoolTaskExecutor使用

    本文主要介紹了springboot自帶線程池ThreadPoolTaskExecutor使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C語言中下標(biāo)與指針的轉(zhuǎn)換以及指向指針的指針的例子

    C語言中下標(biāo)與指針的轉(zhuǎn)換以及指向指針的指針的例子

    這篇文章主要介紹了C語言中下標(biāo)與指針的轉(zhuǎn)換以及指向指針的指針的示例,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • Java壓縮解壓縮工具類

    Java壓縮解壓縮工具類

    這篇文章主要為大家詳細(xì)介紹了Java壓縮解壓縮工具類,如何壓縮單個(gè)文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 利用java操作Excel文件的方法

    利用java操作Excel文件的方法

    以下是對(duì)利用java操作Excel文件的方法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下
    2013-09-09
  • Spring將MultipartFile轉(zhuǎn)存到本地磁盤的三種方式

    Spring將MultipartFile轉(zhuǎn)存到本地磁盤的三種方式

    在Java中處理文件向來是一種不是很方便的操作,然后隨著Spring框架的崛起,使用Spring框架中的MultipartFile來處理文件也是件很方便的事了,今天就給大家介紹Spring將MultipartFile轉(zhuǎn)存到本地磁盤的方式,需要的朋友可以參考下
    2024-10-10
  • Mybatis中isNotNull與isNotEmpty的使用心得

    Mybatis中isNotNull與isNotEmpty的使用心得

    這篇文章主要介紹了Mybatis中isNotNull與isNotEmpty的使用心得,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 淺析final,finally,finalize 的區(qū)別

    淺析final,finally,finalize 的區(qū)別

    以下是對(duì)final,finally,finalize的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • springboot訪問請(qǐng)求404的原因及解決辦法

    springboot訪問請(qǐng)求404的原因及解決辦法

    在使用Spring Boot開發(fā)應(yīng)用程序時(shí),有時(shí)可能會(huì)遇到訪問請(qǐng)求出現(xiàn)404錯(cuò)誤的情況,即請(qǐng)求的資源未找到,這篇文章主要給大家介紹了關(guān)于springboot訪問請(qǐng)求404的原因及解決辦法,需要的朋友可以參考下
    2023-09-09
  • java多線程通過CompletableFuture組裝異步計(jì)算單元

    java多線程通過CompletableFuture組裝異步計(jì)算單元

    這篇文章主要為大家介紹了java多線程通過CompletableFuture組裝異步計(jì)算單元,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Java整合Protocol?Buffers實(shí)現(xiàn)高效數(shù)據(jù)序列化實(shí)踐

    Java整合Protocol?Buffers實(shí)現(xiàn)高效數(shù)據(jù)序列化實(shí)踐

    Protocol?Buffers是Google開發(fā)的一種語言中立、平臺(tái)中立、可擴(kuò)展的結(jié)構(gòu)化數(shù)據(jù)序列化機(jī)制,類似于XML但更小、更快、更簡(jiǎn)單,本文給大家介紹了Java整合Protocol?Buffers實(shí)現(xiàn)高效數(shù)據(jù)序列化的操作實(shí)踐,需要的朋友可以參考下
    2025-08-08

最新評(píng)論

齐河县| 瓦房店市| 昆山市| 黑龙江省| 沂水县| 大庆市| 东源县| 崇明县| 荣成市| 河北区| 辰溪县| 霍邱县| 杨浦区| 五莲县| 淮安市| 榆社县| 松滋市| 新蔡县| 彭泽县| 泰来县| 西华县| 淮南市| 花垣县| 武义县| 华宁县| 中西区| 玛曲县| 阿瓦提县| 阿克苏市| 兴仁县| 措美县| 天津市| 黄骅市| 乌审旗| 江源县| 弥勒县| 汕头市| 论坛| 布尔津县| 双牌县| 化德县|