.NET使用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)方法,很有借鑒價(jià)值的一個(gè)技巧,需要的朋友可以參考下2014-08-08C#實(shí)現(xiàn)裝箱與拆箱操作簡(jiǎn)單實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)裝箱與拆箱操作,對(duì)于新手理解裝箱與拆箱有一定的幫助,需要的朋友可以參考下2014-07-07新手小白用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-01C#解析json字符串總是多出雙引號(hào)的原因分析及解決辦法
json好久沒用了,今天在用到j(luò)son的時(shí)候,發(fā)現(xiàn)對(duì)字符串做解析的時(shí)候總是多出雙引號(hào),下面給大家介紹C#解析json字符串總是多出雙引號(hào)的原因分析及解決辦法,需要的朋友參考下吧2016-03-03C#解析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