欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

.NET使用C#導(dǎo)入Excel文件數(shù)據(jù)到數(shù)據(jù)庫(kù)

 更新時(shí)間:2024年12月09日 09:08:26   作者:Eiceblue  
將Excel文件中的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)中不僅能夠提升數(shù)據(jù)處理的效率和準(zhǔn)確性,還能極大地促進(jìn)數(shù)據(jù)分析和決策制定的過程,本文將介紹如何在.NET平臺(tái)使用C#導(dǎo)入Excel文件數(shù)據(jù)到數(shù)據(jù)庫(kù)中,需要的可以參考下

將Excel文件中的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)中不僅能夠提升數(shù)據(jù)處理的效率和準(zhǔn)確性,還能極大地促進(jìn)數(shù)據(jù)分析和決策制定的過程。尤其在企業(yè)級(jí)應(yīng)用中,Excel作為數(shù)據(jù)輸入和初步整理的工具非常普遍,但其功能對(duì)于復(fù)雜查詢、大規(guī)模數(shù)據(jù)管理和跨部門的數(shù)據(jù)共享來說有所局限。通過使用C#在.NET平臺(tái)上實(shí)現(xiàn)這一過程,可以充分利用其強(qiáng)大的數(shù)據(jù)操作能力和豐富的庫(kù)支持,確保數(shù)據(jù)從Excel無縫遷移到諸如SQLite等關(guān)系型數(shù)據(jù)庫(kù)中,從而實(shí)現(xiàn)更高效的數(shù)據(jù)管理、增強(qiáng)的數(shù)據(jù)安全性和更好的性能優(yōu)化,同時(shí)為后續(xù)的數(shù)據(jù)挖掘和商業(yè)智能分析打下堅(jiān)實(shí)的基礎(chǔ)。

本文將介紹如何在.NET平臺(tái)使用C#導(dǎo)入Excel文件數(shù)據(jù)到數(shù)據(jù)庫(kù)中。

本文所使用的方法需要用到免費(fèi)的Free Spire.XLS for .NET,NuGet:PM> Install-Package FreeSpire.XLS,以及System.Data.SQLite,NuGet:PM> Install-Package System.Data.SQLite。

導(dǎo)入Excel數(shù)據(jù)到SQLite數(shù)據(jù)庫(kù)

我們可以使用Free Spire.XLS for .NET中的Workbook.LoadFromFile方法載入Excel文件,然后使用CellRange.Value讀取單元格的數(shù)據(jù),并搭配System.Data.SQLite模塊將數(shù)據(jù)寫入到SQLite數(shù)據(jù)庫(kù)中。以下是操作步驟示例:

以下是將提供的C#代碼轉(zhuǎn)換為操作步驟的介紹:

1.設(shè)置SQLite數(shù)據(jù)庫(kù)文件路徑為Sample.db,并指定Excel輸出文件路徑為output/DatabaseToExcel.xlsx。

2.創(chuàng)建一個(gè)新的Workbook實(shí)例以表示Excel工作簿,并清除默認(rèn)的工作表。

3.使用SQLiteConnection創(chuàng)建一個(gè)到SQLite數(shù)據(jù)庫(kù)的新連接,并打開這個(gè)連接。

4.通過調(diào)用GetSchema("Tables")從數(shù)據(jù)庫(kù)獲取所有表的名字,并存儲(chǔ)在一個(gè)DataTable對(duì)象中。

5.遍歷每個(gè)表名:

對(duì)于每個(gè)表,添加一個(gè)新的工作表到工作簿中,工作表名稱設(shè)為當(dāng)前表名。

6.構(gòu)建SQL查詢語句以選擇表中的所有數(shù)據(jù),并使用SQLiteCommand執(zhí)行此查詢。

7.使用SQLiteDataReader讀取查詢結(jié)果,并進(jìn)行以下操作:

  • 獲取列名并將它們寫入新工作表的第一行。
  • 設(shè)置第一行(即標(biāo)題行)的字體樣式為粗體,字號(hào)為12。

8.繼續(xù)遍歷數(shù)據(jù)行,并對(duì)每一行執(zhí)行以下操作:

  • 將每一行的數(shù)據(jù)值寫入相應(yīng)的單元格中。
  • 自動(dòng)調(diào)整每列的寬度以適應(yīng)內(nèi)容。
  • 設(shè)置數(shù)據(jù)行的字體大小為11。

9.關(guān)閉與SQLite數(shù)據(jù)庫(kù)的連接。

10.保存生成的工作簿到之前定義的Excel文件路徑,并釋放workbook對(duì)象使用的資源。

代碼示例:

using System.Data.SQLite;
using Spire.Xls;

namespace ExcelToSQLite
{
    class Program
    {
        static void Main(string[] args)
        {
            // Excel 文件路徑
            string excelFilePath = "G:/Documents/Sample37.xlsx";

            // SQLite 數(shù)據(jù)庫(kù)路徑
            string sqliteFilePath = "output/Database.db";

            // 打開 Excel 文件
            Workbook workbook = new Workbook();
            workbook.LoadFromFile(excelFilePath);

            // 如果數(shù)據(jù)庫(kù)文件不存在,則創(chuàng)建它
            if (!File.Exists(sqliteFilePath))
            {
                SQLiteConnection.CreateFile(sqliteFilePath);
                Console.WriteLine("已創(chuàng)建新的 SQLite 數(shù)據(jù)庫(kù)文件:output.db");
            }

            // 創(chuàng)建 SQLite 連接
            using (SQLiteConnection connection = new SQLiteConnection($"Data Source={sqliteFilePath};Version=3;"))
            {
                connection.Open();

                // 遍歷每個(gè)工作表
                foreach (Worksheet sheet in workbook.Worksheets)
                {
                    string tableName = sheet.Name;

                    // 獲取第一行作為列名
                    var columns = sheet.Rows[0].CellList;
                    string createTableQuery = $"CREATE TABLE IF NOT EXISTS [{tableName}] (";

                    foreach (var column in columns)
                    {
                        createTableQuery += $"[{column.Value}] TEXT,";
                    }
                    createTableQuery = createTableQuery.TrimEnd(',') + ");";

                    // 創(chuàng)建表
                    using (SQLiteCommand createTableCommand = new SQLiteCommand(createTableQuery, connection))
                    {
                        createTableCommand.ExecuteNonQuery();
                    }

                    // 插入數(shù)據(jù)
                    for (int i = 1; i < sheet.Rows.Length; i++) // 跳過第一行
                    {
                        var row = sheet.Rows[i];
                        string insertQuery = $"INSERT INTO [{tableName}] VALUES (";
                        foreach (var cell in row.CellList)
                        {
                            insertQuery += $"'{cell.Value?.Replace("'", "''")}',"; // 防止 SQL 注入
                        }
                        insertQuery = insertQuery.TrimEnd(',') + ");";

                        using (SQLiteCommand insertCommand = new SQLiteCommand(insertQuery, connection))
                        {
                            insertCommand.ExecuteNonQuery();
                        }
                    }
                }

                connection.Close();
                workbook.Dispose();
            }

            Console.WriteLine("Excel 數(shù)據(jù)已成功寫入新的 SQLite 數(shù)據(jù)庫(kù)!");
        }
    }
}

結(jié)果

導(dǎo)入Excel數(shù)據(jù)到SQLite數(shù)據(jù)庫(kù)

寫入到Access數(shù)據(jù)庫(kù)則需要用到System.Data.OleDb模塊,以下是操作步驟示例:

以下是將提供的C#代碼轉(zhuǎn)換為操作步驟的介紹:

1.設(shè)置Excel文件路徑為Sample.xlsx,并指定Access數(shù)據(jù)庫(kù)文件路徑為output/Database.accdb。

2.使用Workbook類打開指定路徑的Excel文件,并加載該文件到內(nèi)存中。

3.創(chuàng)建一個(gè)用于連接Access數(shù)據(jù)庫(kù)的OleDb連接字符串。

4.檢查Access數(shù)據(jù)庫(kù)文件是否存在。如果不存在,則提示用戶首先創(chuàng)建Access數(shù)據(jù)庫(kù)文件,并終止程序執(zhí)行。

5.創(chuàng)建一個(gè)新的OleDb連接對(duì)象,并打開與Access數(shù)據(jù)庫(kù)的連接。

6.遍歷Excel工作簿中的每個(gè)工作表:

獲取當(dāng)前工作表的名稱,并將其作為新表的名稱。

7.從工作表的第一行獲取列名,并構(gòu)建創(chuàng)建新表的SQL語句,假定所有列的數(shù)據(jù)類型均為文本類型(TEXT)。

8.嘗試執(zhí)行以下操作,對(duì)于每個(gè)工作表:

使用構(gòu)建的CREATE TABLE SQL語句創(chuàng)建新的表。

9.對(duì)于每個(gè)工作表中的每一行數(shù)據(jù)(跳過第一行,因?yàn)樗忻?/p>

構(gòu)建INSERT INTO SQL語句以插入數(shù)據(jù)行,同時(shí)處理可能的SQL注入問題,例如通過轉(zhuǎn)義單引號(hào)。

10.執(zhí)行構(gòu)建的INSERT INTO命令,將一行數(shù)據(jù)插入到對(duì)應(yīng)的Access表中。

11.如果在處理某個(gè)工作表時(shí)發(fā)生錯(cuò)誤,捕獲異常并打印錯(cuò)誤信息,繼續(xù)處理下一個(gè)工作表。

12.關(guān)閉與Access數(shù)據(jù)庫(kù)的連接,并釋放workbook對(duì)象使用的資源。

代碼示例:

using System.Data.OleDb;
using Spire.Xls;

namespace ExcelToAccess
{
    class Program
    {
        static void Main(string[] args)
        {
            // Excel 文件路徑
            string excelFilePath = "G:/Documents/Sample37.xlsx";

            // Access 數(shù)據(jù)庫(kù)路徑
            string accessDbPath = "output/Database.accdb";

            // 打開 Excel 文件
            Workbook workbook = new Workbook();
            workbook.LoadFromFile(excelFilePath);

            // 為 Access 創(chuàng)建 OleDb 連接字符串
            string connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={accessDbPath};Persist Security Info=False;";

            // 如果數(shù)據(jù)庫(kù)文件不存在,提示創(chuàng)建 - 注意:此步驟通常在代碼外部完成
            if (!System.IO.File.Exists(accessDbPath))
            {
                Console.WriteLine("請(qǐng)先創(chuàng)建一個(gè) Access 數(shù)據(jù)庫(kù)文件。");
                return;
            }

            // 創(chuàng)建 OleDb 連接
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                connection.Open();

                // 遍歷每個(gè)工作表
                foreach (Worksheet sheet in workbook.Worksheets)
                {
                    string tableName = sheet.Name;

                    // 獲取第一行作為列名
                    var columns = sheet.Rows[0].CellList;
                    string createTableQuery = $"CREATE TABLE [{tableName}] (";

                    foreach (var column in columns)
                    {
                        createTableQuery += $"[{column.Value}] TEXT,"; // 假設(shè)所有列都是文本類型
                    }
                    createTableQuery = createTableQuery.TrimEnd(',') + ");";

                    try
                    {
                        // 創(chuàng)建表
                        using (OleDbCommand createTableCommand = new OleDbCommand(createTableQuery, connection))
                        {
                            createTableCommand.ExecuteNonQuery();
                        }

                        // 插入數(shù)據(jù)
                        for (int i = 1; i < sheet.Rows.Length; i++) // 跳過第一行
                        {
                            var row = sheet.Rows[i];
                            string insertQuery = $"INSERT INTO [{tableName}] VALUES (";
                            foreach (var cell in row.CellList)
                            {
                                insertQuery += $"'{cell.Value?.Replace("'", "''")}',"; // 防止 SQL 注入
                            }
                            insertQuery = insertQuery.TrimEnd(',') + ");";

                            using (OleDbCommand insertCommand = new OleDbCommand(insertQuery, connection))
                            {
                                insertCommand.ExecuteNonQuery();
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"處理工作表 {sheet.Name} 時(shí)發(fā)生錯(cuò)誤:{ex.Message}");
                    }
                }

                connection.Close();
                workbook.Dispose();
            }

            Console.WriteLine("Excel 數(shù)據(jù)已成功寫入新的 Access 數(shù)據(jù)庫(kù)!");
        }
    }
}

結(jié)果

到此這篇關(guān)于.NET使用C#導(dǎo)入Excel文件數(shù)據(jù)到數(shù)據(jù)庫(kù)的文章就介紹到這了,更多相關(guān)C#導(dǎo)入Excel數(shù)據(jù)到數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#利用反射來判斷對(duì)象是否包含某個(gè)屬性的實(shí)現(xiàn)方法

    C#利用反射來判斷對(duì)象是否包含某個(gè)屬性的實(shí)現(xiàn)方法

    這篇文章主要介紹了C#利用反射來判斷對(duì)象是否包含某個(gè)屬性的實(shí)現(xiàn)方法,很有借鑒價(jià)值的一個(gè)技巧,需要的朋友可以參考下
    2014-08-08
  • C#圖像處理之頭發(fā)檢測(cè)的方法

    C#圖像處理之頭發(fā)檢測(cè)的方法

    這篇文章主要介紹了C#圖像處理之頭發(fā)檢測(cè)的方法,可實(shí)現(xiàn)針對(duì)圖像中頭發(fā)的檢測(cè)功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C#中String與string的區(qū)別分析

    C#中String與string的區(qū)別分析

    這篇文章主要介紹了C#中String與string的區(qū)別,對(duì)于加深C#數(shù)據(jù)類型與類的理解有很好的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-08-08
  • C#實(shí)現(xiàn)裝箱與拆箱操作簡(jiǎn)單實(shí)例

    C#實(shí)現(xiàn)裝箱與拆箱操作簡(jiǎn)單實(shí)例

    這篇文章主要介紹了C#實(shí)現(xiàn)裝箱與拆箱操作,對(duì)于新手理解裝箱與拆箱有一定的幫助,需要的朋友可以參考下
    2014-07-07
  • C#中IEnumerable接口用法實(shí)例分析

    C#中IEnumerable接口用法實(shí)例分析

    這篇文章主要介紹了C#中IEnumerable接口用法,實(shí)例分析了IEnumerable接口的功能與使用技巧,需要的朋友可以參考下
    2015-04-04
  • 新手小白用C# winform 讀取Excel表的實(shí)現(xiàn)

    新手小白用C# winform 讀取Excel表的實(shí)現(xiàn)

    這篇文章主要介紹了新手小白用C# winform 讀取Excel表的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C#求解哈夫曼樹,實(shí)例代碼

    C#求解哈夫曼樹,實(shí)例代碼

    C#求解哈夫曼樹,實(shí)例代碼,需要的朋友可以參考一下
    2013-04-04
  • C#中跨線程訪問控件的實(shí)現(xiàn)方法

    C#中跨線程訪問控件的實(shí)現(xiàn)方法

    C#中不允許跨線程直接訪問界面控件,即一個(gè)線程中如主線程創(chuàng)建的控件不允許被其他線程例如子線程直接訪問,在一個(gè)線程中設(shè)置其他線程所有的控件屬性通常有兩種方法,本文將詳細(xì)的給大家介紹一下,需要的朋友可以參考下
    2024-12-12
  • C#解析json字符串總是多出雙引號(hào)的原因分析及解決辦法

    C#解析json字符串總是多出雙引號(hào)的原因分析及解決辦法

    json好久沒用了,今天在用到j(luò)son的時(shí)候,發(fā)現(xiàn)對(duì)字符串做解析的時(shí)候總是多出雙引號(hào),下面給大家介紹C#解析json字符串總是多出雙引號(hào)的原因分析及解決辦法,需要的朋友參考下吧
    2016-03-03
  • C#解析char型指針?biāo)赶虻膬?nèi)容(實(shí)例解析)

    C#解析char型指針?biāo)赶虻膬?nèi)容(實(shí)例解析)

    在c++代碼中定義了一個(gè)功能函數(shù),這個(gè)功能函數(shù)會(huì)將計(jì)算的結(jié)果寫入一個(gè)字符串型的數(shù)組中output,然后c#會(huì)調(diào)用c++導(dǎo)出的dll中的接口函數(shù),然后獲取這個(gè)output并解析成string類型,本文通過實(shí)例解析C#?char型指針?biāo)赶虻膬?nèi)容,感興趣的朋友一起看看吧
    2024-03-03

最新評(píng)論