.NET使用C#導(dǎo)入Excel文件數(shù)據(jù)到數(shù)據(jù)庫
將Excel文件中的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫中不僅能夠提升數(shù)據(jù)處理的效率和準(zhǔn)確性,還能極大地促進(jìn)數(shù)據(jù)分析和決策制定的過程。尤其在企業(yè)級應(yīng)用中,Excel作為數(shù)據(jù)輸入和初步整理的工具非常普遍,但其功能對于復(fù)雜查詢、大規(guī)模數(shù)據(jù)管理和跨部門的數(shù)據(jù)共享來說有所局限。通過使用C#在.NET平臺上實現(xiàn)這一過程,可以充分利用其強(qiáng)大的數(shù)據(jù)操作能力和豐富的庫支持,確保數(shù)據(jù)從Excel無縫遷移到諸如SQLite等關(guān)系型數(shù)據(jù)庫中,從而實現(xiàn)更高效的數(shù)據(jù)管理、增強(qiáng)的數(shù)據(jù)安全性和更好的性能優(yōu)化,同時為后續(xù)的數(shù)據(jù)挖掘和商業(yè)智能分析打下堅實的基礎(chǔ)。
本文將介紹如何在.NET平臺使用C#導(dǎo)入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。
導(dǎo)入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工作簿,并清除默認(rèn)的工作表。
3.使用SQLiteConnection創(chuàng)建一個到SQLite數(shù)據(jù)庫的新連接,并打開這個連接。
4.通過調(diào)用GetSchema("Tables")從數(shù)據(jù)庫獲取所有表的名字,并存儲在一個DataTable對象中。
5.遍歷每個表名:
對于每個表,添加一個新的工作表到工作簿中,工作表名稱設(shè)為當(dāng)前表名。
6.構(gòu)建SQL查詢語句以選擇表中的所有數(shù)據(jù),并使用SQLiteCommand執(zhí)行此查詢。
7.使用SQLiteDataReader讀取查詢結(jié)果,并進(jìn)行以下操作:
- 獲取列名并將它們寫入新工作表的第一行。
- 設(shè)置第一行(即標(biāo)題行)的字體樣式為粗體,字號為12。
8.繼續(xù)遍歷數(shù)據(jù)行,并對每一行執(zhí)行以下操作:
- 將每一行的數(shù)據(jù)值寫入相應(yīng)的單元格中。
- 自動調(diào)整每列的寬度以適應(yīng)內(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é)果

導(dǎo)入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工作簿中的每個工作表:
獲取當(dāng)前工作表的名稱,并將其作為新表的名稱。
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ù)插入到對應(yīng)的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#導(dǎo)入Excel文件數(shù)據(jù)到數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)C#導(dǎo)入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),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
C#解析char型指針?biāo)赶虻膬?nèi)容(實例解析)
在c++代碼中定義了一個功能函數(shù),這個功能函數(shù)會將計算的結(jié)果寫入一個字符串型的數(shù)組中output,然后c#會調(diào)用c++導(dǎo)出的dll中的接口函數(shù),然后獲取這個output并解析成string類型,本文通過實例解析C#?char型指針?biāo)赶虻膬?nèi)容,感興趣的朋友一起看看吧2024-03-03

