.NET使用C#導入Excel文件數(shù)據(jù)到數(shù)據(jù)庫
將Excel文件中的數(shù)據(jù)導入到數(shù)據(jù)庫中不僅能夠提升數(shù)據(jù)處理的效率和準確性,還能極大地促進數(shù)據(jù)分析和決策制定的過程。尤其在企業(yè)級應用中,Excel作為數(shù)據(jù)輸入和初步整理的工具非常普遍,但其功能對于復雜查詢、大規(guī)模數(shù)據(jù)管理和跨部門的數(shù)據(jù)共享來說有所局限。通過使用C#在.NET平臺上實現(xiàn)這一過程,可以充分利用其強大的數(shù)據(jù)操作能力和豐富的庫支持,確保數(shù)據(jù)從Excel無縫遷移到諸如SQLite等關(guān)系型數(shù)據(jù)庫中,從而實現(xiàn)更高效的數(shù)據(jù)管理、增強的數(shù)據(jù)安全性和更好的性能優(yōu)化,同時為后續(xù)的數(shù)據(jù)挖掘和商業(yè)智能分析打下堅實的基礎(chǔ)。
本文將介紹如何在.NET平臺使用C#導入Excel文件數(shù)據(jù)到數(shù)據(jù)庫中。
本文所使用的方法需要用到免費的Free Spire.XLS for .NET,NuGet:PM> Install-Package FreeSpire.XLS
,以及System.Data.SQLite,NuGet:PM> Install-Package System.Data.SQLite
。
導入Excel數(shù)據(jù)到SQLite數(shù)據(jù)庫
我們可以使用Free Spire.XLS for .NET中的Workbook.LoadFromFile方法載入Excel文件,然后使用CellRange.Value讀取單元格的數(shù)據(jù),并搭配System.Data.SQLite模塊將數(shù)據(jù)寫入到SQLite數(shù)據(jù)庫中。以下是操作步驟示例:
以下是將提供的C#代碼轉(zhuǎn)換為操作步驟的介紹:
1.設(shè)置SQLite數(shù)據(jù)庫文件路徑為Sample.db,并指定Excel輸出文件路徑為output/DatabaseToExcel.xlsx。
2.創(chuàng)建一個新的Workbook實例以表示Excel工作簿,并清除默認的工作表。
3.使用SQLiteConnection創(chuàng)建一個到SQLite數(shù)據(jù)庫的新連接,并打開這個連接。
4.通過調(diào)用GetSchema("Tables")從數(shù)據(jù)庫獲取所有表的名字,并存儲在一個DataTable對象中。
5.遍歷每個表名:
對于每個表,添加一個新的工作表到工作簿中,工作表名稱設(shè)為當前表名。
6.構(gòu)建SQL查詢語句以選擇表中的所有數(shù)據(jù),并使用SQLiteCommand執(zhí)行此查詢。
7.使用SQLiteDataReader讀取查詢結(jié)果,并進行以下操作:
- 獲取列名并將它們寫入新工作表的第一行。
- 設(shè)置第一行(即標題行)的字體樣式為粗體,字號為12。
8.繼續(xù)遍歷數(shù)據(jù)行,并對每一行執(zhí)行以下操作:
- 將每一行的數(shù)據(jù)值寫入相應的單元格中。
- 自動調(diào)整每列的寬度以適應內(nèi)容。
- 設(shè)置數(shù)據(jù)行的字體大小為11。
9.關(guān)閉與SQLite數(shù)據(jù)庫的連接。
10.保存生成的工作簿到之前定義的Excel文件路徑,并釋放workbook對象使用的資源。
代碼示例:
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ù)庫路徑 string sqliteFilePath = "output/Database.db"; // 打開 Excel 文件 Workbook workbook = new Workbook(); workbook.LoadFromFile(excelFilePath); // 如果數(shù)據(jù)庫文件不存在,則創(chuàng)建它 if (!File.Exists(sqliteFilePath)) { SQLiteConnection.CreateFile(sqliteFilePath); Console.WriteLine("已創(chuàng)建新的 SQLite 數(shù)據(jù)庫文件:output.db"); } // 創(chuàng)建 SQLite 連接 using (SQLiteConnection connection = new SQLiteConnection($"Data Source={sqliteFilePath};Version=3;")) { connection.Open(); // 遍歷每個工作表 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ù)庫!"); } } }
結(jié)果
導入Excel數(shù)據(jù)到SQLite數(shù)據(jù)庫
寫入到Access數(shù)據(jù)庫則需要用到System.Data.OleDb模塊,以下是操作步驟示例:
以下是將提供的C#代碼轉(zhuǎn)換為操作步驟的介紹:
1.設(shè)置Excel文件路徑為Sample.xlsx,并指定Access數(shù)據(jù)庫文件路徑為output/Database.accdb。
2.使用Workbook類打開指定路徑的Excel文件,并加載該文件到內(nèi)存中。
3.創(chuàng)建一個用于連接Access數(shù)據(jù)庫的OleDb連接字符串。
4.檢查Access數(shù)據(jù)庫文件是否存在。如果不存在,則提示用戶首先創(chuàng)建Access數(shù)據(jù)庫文件,并終止程序執(zhí)行。
5.創(chuàng)建一個新的OleDb連接對象,并打開與Access數(shù)據(jù)庫的連接。
6.遍歷Excel工作簿中的每個工作表:
獲取當前工作表的名稱,并將其作為新表的名稱。
7.從工作表的第一行獲取列名,并構(gòu)建創(chuàng)建新表的SQL語句,假定所有列的數(shù)據(jù)類型均為文本類型(TEXT)。
8.嘗試執(zhí)行以下操作,對于每個工作表:
使用構(gòu)建的CREATE TABLE SQL語句創(chuàng)建新的表。
9.對于每個工作表中的每一行數(shù)據(jù)(跳過第一行,因為它包含列名):
構(gòu)建INSERT INTO SQL語句以插入數(shù)據(jù)行,同時處理可能的SQL注入問題,例如通過轉(zhuǎn)義單引號。
10.執(zhí)行構(gòu)建的INSERT INTO命令,將一行數(shù)據(jù)插入到對應的Access表中。
11.如果在處理某個工作表時發(fā)生錯誤,捕獲異常并打印錯誤信息,繼續(xù)處理下一個工作表。
12.關(guān)閉與Access數(shù)據(jù)庫的連接,并釋放workbook對象使用的資源。
代碼示例:
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ù)庫路徑 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ù)庫文件不存在,提示創(chuàng)建 - 注意:此步驟通常在代碼外部完成 if (!System.IO.File.Exists(accessDbPath)) { Console.WriteLine("請先創(chuàng)建一個 Access 數(shù)據(jù)庫文件。"); return; } // 創(chuàng)建 OleDb 連接 using (OleDbConnection connection = new OleDbConnection(connectionString)) { connection.Open(); // 遍歷每個工作表 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} 時發(fā)生錯誤:{ex.Message}"); } } connection.Close(); workbook.Dispose(); } Console.WriteLine("Excel 數(shù)據(jù)已成功寫入新的 Access 數(shù)據(jù)庫!"); } } }
結(jié)果
到此這篇關(guān)于.NET使用C#導入Excel文件數(shù)據(jù)到數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)C#導入Excel數(shù)據(jù)到數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#利用反射來判斷對象是否包含某個屬性的實現(xiàn)方法
這篇文章主要介紹了C#利用反射來判斷對象是否包含某個屬性的實現(xiàn)方法,很有借鑒價值的一個技巧,需要的朋友可以參考下2014-08-08新手小白用C# winform 讀取Excel表的實現(xiàn)
這篇文章主要介紹了新手小白用C# winform 讀取Excel表的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01