C#實(shí)現(xiàn)導(dǎo)出數(shù)據(jù)庫數(shù)據(jù)到Excel文件
隨著企業(yè)業(yè)務(wù)的增長和復(fù)雜性的增加,對(duì)數(shù)據(jù)進(jìn)行有效的分析、共享和報(bào)告變得至關(guān)重要;而Excel,作為一款廣泛接受的數(shù)據(jù)處理工具,提供了強(qiáng)大的計(jì)算能力、可視化選項(xiàng)以及與多種數(shù)據(jù)分析工具的兼容性,使得它成為從數(shù)據(jù)庫導(dǎo)出數(shù)據(jù)的理想選擇。通過利用C#編程語言的強(qiáng)大特性和豐富的.NET庫支持,開發(fā)人員不僅能夠高效地完成從數(shù)據(jù)庫到Excel文件的數(shù)據(jù)遷移,還可以根據(jù)特定業(yè)務(wù)邏輯定制導(dǎo)出過程,確保數(shù)據(jù)的準(zhǔn)確性和完整性,同時(shí)提升用戶體驗(yàn)并滿足不同用戶的報(bào)表需求。
本文將介紹如何在.NET平臺(tái)使用C#代碼導(dǎo)出數(shù)據(jù)庫數(shù)據(jù)到Excel文件。
本文所使用的方法需要用到,免費(fèi)的Free Spire.XLS for .NET,以及System.Data.SQLite和System.Data.OleDb。NuGet:
PM> Install-Package FreeSpire.XLS PM> Install-Package System.Data.SQLite PM> Install-Package System.Data.OleDb
導(dǎo)出SQLite數(shù)據(jù)庫到Excel文件
System.Data.SQLite
模塊可以直接從SQLite數(shù)據(jù)庫文件中讀取數(shù)據(jù)。讀取到數(shù)據(jù)之后,我們可以使用Free Spire.XLS for .NET創(chuàng)建Excel文件并將數(shù)據(jù)寫入其中。以下是操作步驟及代碼示例:
1.定義文件路徑
- 設(shè)置SQLite數(shù)據(jù)庫文件路徑為Sample.db。
- 設(shè)置Excel輸出文件路徑為output/DatabaseToExcel.xlsx。
2.創(chuàng)建Excel工作簿實(shí)例
- 創(chuàng)建一個(gè)新的Workbook實(shí)例以表示要導(dǎo)出的Excel文件。
- 清除默認(rèn)包含的工作表,確保工作簿為空。
3.建立SQLite連接
- 使用SQLiteConnection類創(chuàng)建一個(gè)到SQLite數(shù)據(jù)庫的新連接,并通過提供數(shù)據(jù)源和版本號(hào)來初始化連接字符串。
- 打開與SQLite數(shù)據(jù)庫的連接。
4.獲取數(shù)據(jù)庫中的所有表名
通過調(diào)用GetSchema("Tables")方法從數(shù)據(jù)庫中獲取所有表的名字,并將結(jié)果存儲(chǔ)在一個(gè)DataTable對(duì)象中。
5.遍歷每個(gè)表并處理
- 遍歷DataTable對(duì)象中的每一行,提取表名。
- 對(duì)于每個(gè)表,添加一個(gè)新的工作表到Excel工作簿中,并將工作表命名為對(duì)應(yīng)的表名。
6.讀取表數(shù)據(jù)并寫入Excel
構(gòu)建SQL查詢語句以選擇當(dāng)前表中的所有數(shù)據(jù),并使用SQLiteCommand執(zhí)行此查詢。
使用SQLiteDataReader讀取查詢結(jié)果:
- 獲取列名并將它們寫入新工作表的第一行。
- 設(shè)置第一行(即標(biāo)題行)的字體樣式為粗體,字號(hào)為12。
- 遍歷數(shù)據(jù)行,將每一行的數(shù)據(jù)值寫入相應(yīng)的單元格中,同時(shí)自動(dòng)調(diào)整每列的寬度以適應(yīng)內(nèi)容。
- 設(shè)置數(shù)據(jù)行的字體大小為11。
7.關(guān)閉數(shù)據(jù)庫連接
完成所有表的數(shù)據(jù)讀取和寫入后,關(guān)閉與SQLite數(shù)據(jù)庫的連接。
8.保存Excel文件
將生成的工作簿保存到之前定義的Excel文件路徑。
釋放workbook對(duì)象使用的資源。
代碼示例
using System.Data; using System.Data.SQLite; using Spire.Xls; namespace SQLiteToExcel { class Program { static void Main(string[] args) { // SQLite數(shù)據(jù)庫路徑 string sqliteFilePath = "Sample.db"; // Excel文件路徑 string excelFilePath = "output/DatabaseToExcel.xlsx"; // 創(chuàng)建一個(gè)新的工作簿實(shí)例 Workbook workbook = new Workbook(); // 清除默認(rèn)的工作表 workbook.Worksheets.Clear(); // 創(chuàng)建SQLite連接 using (SQLiteConnection connection = new SQLiteConnection($"Data Source={sqliteFilePath};Version=3;")) { connection.Open(); // 獲取所有表名 DataTable tables = connection.GetSchema("Tables"); // 遍歷每個(gè)表 foreach (DataRow tableRow in tables.Rows) { string tableName = tableRow["TABLE_NAME"].ToString(); // 創(chuàng)建一個(gè)新的工作表 Worksheet sheet = workbook.Worksheets.Add(tableName); // 獲取表數(shù)據(jù) string selectQuery = $"SELECT * FROM [{tableName}]"; using (SQLiteCommand command = new SQLiteCommand(selectQuery, connection)) { using (SQLiteDataReader reader = command.ExecuteReader()) { // 獲取列名并寫入第一行 for (int col = 0; col < reader.FieldCount; col++) { sheet.Range[1, col + 1].Value = reader.GetName(col); } // 設(shè)置標(biāo)題行的字體樣式 sheet.Rows[0].Style.Font.IsBold = true; sheet.Rows[0].Style.Font.Size = 12; // 寫入數(shù)據(jù)行 int rowIndex = 2; while (reader.Read()) { for (int col = 0; col < reader.FieldCount; col++) { sheet.Range[rowIndex, col + 1].Value = reader.GetValue(col).ToString(); // 自動(dòng)調(diào)整列寬 sheet.AutoFitColumn(col + 1); } // 設(shè)置數(shù)據(jù)行的字體樣式 sheet.Rows[rowIndex - 1].Style.Font.Size = 11; rowIndex++; } } } } connection.Close(); } // 保存Excel文件 workbook.SaveToFile(excelFilePath); workbook.Dispose(); Console.WriteLine("數(shù)據(jù)已成功導(dǎo)出到Excel文件!"); } } }
結(jié)果
導(dǎo)出Access數(shù)據(jù)庫到Excel文件
System.Data.OleDb可以直接讀取Access數(shù)據(jù)庫中的數(shù)據(jù),我們可以使用同樣的方法來導(dǎo)出Access數(shù)據(jù)庫到Excel文件。以下是操作步驟及代碼示例:
以下是將提供的C#代碼轉(zhuǎn)換為操作步驟的介紹,用于將Access數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)出到Excel文件:
1.定義文件路徑
- 設(shè)置Access數(shù)據(jù)庫文件路徑為Database.accdb。
- 設(shè)置Excel輸出文件路徑為output/DatabaseToExcel.xlsx。
2.創(chuàng)建Excel工作簿實(shí)例
- 創(chuàng)建一個(gè)新的Workbook實(shí)例以表示要導(dǎo)出的Excel文件。
- 清除默認(rèn)包含的工作表,確保工作簿為空。
3.定義連接字符串
定義一個(gè)連接字符串,用于連接到指定路徑的Access數(shù)據(jù)庫。這里使用的是Microsoft.ACE.OLEDB.12.0提供程序,并指定了不持久化安全信息。
4.建立OleDb連接
使用OleDbConnection類創(chuàng)建一個(gè)新的連接對(duì)象,并通過調(diào)用Open()方法打開與Access數(shù)據(jù)庫的連接。
5.獲取所有表名
通過調(diào)用GetSchema("Tables")方法從數(shù)據(jù)庫中獲取所有表的名字,并將結(jié)果存儲(chǔ)在一個(gè)DataTable對(duì)象中。
6.遍歷每個(gè)表并處理(跳過系統(tǒng)表)
- 遍歷DataTable對(duì)象中的每一行,提取表名。
- 跳過非用戶定義的表(例如,系統(tǒng)表)。這一步可以通過檢查TABLE_TYPE列來完成,只處理類型為TABLE的表。
- 對(duì)于每個(gè)用戶定義的表,添加一個(gè)新的工作表到Excel工作簿中,并將工作表命名為對(duì)應(yīng)的表名。
7.讀取表數(shù)據(jù)并寫入Excel
構(gòu)建SQL查詢語句以選擇當(dāng)前表中的所有數(shù)據(jù),并使用OleDbCommand執(zhí)行此查詢。
使用OleDbDataReader讀取查詢結(jié)果:
- 獲取列名并將它們寫入新工作表的第一行。
- 設(shè)置第一行(即標(biāo)題行)的字體樣式為粗體,字號(hào)為12。
- 遍歷數(shù)據(jù)行,將每一行的數(shù)據(jù)值寫入相應(yīng)的單元格中,同時(shí)自動(dòng)調(diào)整每列的寬度以適應(yīng)內(nèi)容。
- 設(shè)置數(shù)據(jù)行的字體大小為11。
8.關(guān)閉數(shù)據(jù)庫連接
完成所有表的數(shù)據(jù)讀取和寫入后,關(guān)閉與Access數(shù)據(jù)庫的連接。
9.保存Excel文件
將生成的工作簿保存到之前定義的Excel文件路徑。
釋放workbook對(duì)象使用的資源。
代碼實(shí)例
using System.Data; using System.Data.OleDb; using Spire.Xls; namespace AccessToExcel { class Program { static void Main(string[] args) { // Access數(shù)據(jù)庫路徑 string accessFilePath = "Database.accdb"; // Excel文件路徑 string excelFilePath = "output/DatabaseToExcel.xlsx"; // 創(chuàng)建一個(gè)新的工作簿實(shí)例 Workbook workbook = new Workbook(); // 清除默認(rèn)的工作表 workbook.Worksheets.Clear(); // 定義Access數(shù)據(jù)庫的連接字符串 string connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={accessFilePath};Persist Security Info=False;"; // 創(chuàng)建OleDb連接 using (OleDbConnection connection = new OleDbConnection(connectionString)) { connection.Open(); // 獲取所有表名 DataTable tables = connection.GetSchema("Tables"); // 遍歷每個(gè)表 foreach (DataRow tableRow in tables.Rows) { // 跳過系統(tǒng)表,您可以在這里添加更多條件 if (tableRow["TABLE_TYPE"].ToString() != "TABLE") continue; string tableName = tableRow["TABLE_NAME"].ToString(); // 創(chuàng)建一個(gè)新的工作表 Worksheet sheet = workbook.Worksheets.Add(tableName); // 獲取表數(shù)據(jù) string selectQuery = $"SELECT * FROM [{tableName}]"; using (OleDbCommand command = new OleDbCommand(selectQuery, connection)) { using (OleDbDataReader reader = command.ExecuteReader()) { // 獲取列名并寫入第一行 for (int col = 0; col < reader.FieldCount; col++) { sheet.Range[1, col + 1].Value = reader.GetName(col); } // 設(shè)置標(biāo)題行的字體樣式 sheet.Rows[0].Style.Font.IsBold = true; sheet.Rows[0].Style.Font.Size = 12; // 寫入數(shù)據(jù)行 int rowIndex = 2; while (reader.Read()) { for (int col = 0; col < reader.FieldCount; col++) { sheet.Range[rowIndex, col + 1].Value = reader.GetValue(col)?.ToString() ?? ""; // 自動(dòng)調(diào)整列寬 sheet.AutoFitColumn(col + 1); } // 設(shè)置數(shù)據(jù)行的字體樣式 sheet.Rows[rowIndex - 1].Style.Font.Size = 11; rowIndex++; } } } } connection.Close(); } // 保存Excel文件 workbook.SaveToFile(excelFilePath); workbook.Dispose(); Console.WriteLine("數(shù)據(jù)已成功導(dǎo)出到Excel文件!"); } } }
結(jié)果
以上就是C#實(shí)現(xiàn)導(dǎo)出數(shù)據(jù)庫數(shù)據(jù)到Excel文件的詳細(xì)內(nèi)容,更多關(guān)于C#數(shù)據(jù)庫數(shù)據(jù)導(dǎo)出至Excel的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用C#實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)堆的代碼
這篇文章主要介紹了使用C#實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)堆,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02親自教你實(shí)現(xiàn)棧及C#中Stack源碼分析
大家都知道棧的實(shí)現(xiàn)方式有兩種,一種是基于數(shù)組實(shí)現(xiàn)的順序棧,另一種是基于鏈表實(shí)現(xiàn)的鏈?zhǔn)綏!_@篇文章主要介紹了手把手教你實(shí)現(xiàn)棧以及C#中Stack源碼分析,需要的朋友可以參考下2021-09-09C# Oracle數(shù)據(jù)庫操作類實(shí)例詳解
這篇文章主要介紹了C# Oracle數(shù)據(jù)庫操作類實(shí)例,進(jìn)行數(shù)據(jù)庫操作時(shí)很有實(shí)用價(jià)值,需要的朋友可以參考下2014-07-07C#實(shí)現(xiàn)DevExpress本地化實(shí)例詳解
這篇文章主要介紹了C#實(shí)現(xiàn)DevExpress本地化,以實(shí)例形式較為詳細(xì)的分析了DevExpress本地化的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08C#實(shí)現(xiàn)多選項(xiàng)卡的瀏覽器控件
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)多選項(xiàng)卡的瀏覽器控件的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-03-03