在 C# 中創建 Excel 文件
創建和使用Excel文件是任何C#開發人員建立報告工具、數據導出或用戶輸入界面的關鍵技能。 在本文中,我們深入探討Tim Corey於他的視頻"在C#中創建Excel文件"中提供的詳細演示,展示了如何使用C#創建Excel文件,格式化,甚至從中讀取數據——全部使用EPPlus程式庫。
無論您是想從List創建新的Excel工作簿、格式化Excel工作表單元格,還是將結構化數據讀回到您的應用程序中,Tim的示例作為實用教學涵蓋了C#中Excel文件生成的必備要點。
讓我們參考Tim的視頻,逐步分解。
簡介:為什麼在C#中使用Excel?
Tim開始解釋Microsoft Excel是商業中最重要的工具之一。 Excel文件用戶友好,靈活性高,非常適合表示數據。 他強調,在C#中創建Excel文件可以用作複雜報告解決方案的替代方案——讓Excel成為您的默認報告工具。
目標:使用C#創建一個Excel應用程序,填充數據,應用一些格式化,然後從該Excel文件中讀取。
在解決方案管理器中設置項目
Tim打開Visual Studio 2019,選擇Console Application (.NET Core),並將解決方案命名為ExcelDemoApp。 使用控制台應用程序提供了一個乾淨且無干擾的環境,專注於Excel相關代碼。
他將目標框架升級為.NET 5.0,以利用C# 9功能,如簡化的對象實例化。
從NuGet包中添加EPPlus
為了創建Excel工作簿,Tim通過NuGet包管理器安裝EPPlus包。 EPPlus是一個操作.xlsx文件(Open XML)的Excel程式庫,支持完整的Excel功能,如圖表、表格、樣式和公式——無需MS Office或Excel Interop。
注意:EPPlus對非商業使用免費,但商業應用需要授權。
他將必要的非商業授權接受行複製到他的代碼中,以避免運行時錯誤,並添加所需的using OfficeOpenXml; 指令。
定義Excel文件路徑
使用System.IO.FileInfo,Tim設置了一個硬編碼的文件路徑:
var file = new FileInfo(@"C:\demos\youtubedemo.xlsx");
var file = new FileInfo(@"C:\demos\youtubedemo.xlsx");
此文件最初不存在——將由程序動態創建。
創建數據模型
為了填充Excel工作表,Tim定義了一個簡單的PersonModel類,具有以下屬性:
-
int Id
-
string FirstName
- string LastName
他使用輔助方法GetSetupData(),返回一個包含示例數據(如Tim Corey, Sue Storm, 和 Jane Smith)的List
異步將數據保存到Excel文件
在現代開發中,阻塞UI線程是不可接受的。 這就是為什麼Tim定義一個異步方法:
static async Task SaveExcelFile(List<PersonModel> people, FileInfo file)
static async Task SaveExcelFile(List<PersonModel> people, FileInfo file)
在寫入Excel之前,他檢查文件是否存在並將其刪除以避免命名衝突。
if (file.Exists) file.Delete();
if (file.Exists) file.Delete();
創建和格式化Excel工作表
Tim在using塊中使用EPPlus ExcelPackage對象來確保正確的資源釋放:
using var package = new ExcelPackage(file);
using var package = new ExcelPackage(file);
他向工作簿中添加一個新的工作表:
var ws = package.Workbook.Worksheets.Add("MainReport");
var ws = package.Workbook.Worksheets.Add("MainReport");
加載數據
使用LoadFromCollection,他從"A2"單元格開始插入人員列表:
ws.Cells["A2"].LoadFromCollection(people, true);
ws.Cells["A2"].LoadFromCollection(people, true);
- true確保包括標頭(如"Id","FirstName","LastName")。
然後,AutoFitColumns()自動調整列寬:
ws.Cells[ws.Dimension.Address].AutoFitColumns();
ws.Cells[ws.Dimension.Address].AutoFitColumns();
最後,他保存Excel文件:
await package.SaveAsync();
await package.SaveAsync();
樣式化Excel單元格和行
為了使Excel文件更具可讀性,Tim展示如何應用樣式:
標題行
ws.Cells["A1"].Value = "Our Cool Report";
ws.Cells["A1:C1"].Merge = true; ws.Row(1).Style.Font.Size = 24;
ws.Row(1).Style.Font.Color.SetColor(Color.Blue);
ws.Column(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
ws.Cells["A1"].Value = "Our Cool Report";
ws.Cells["A1:C1"].Merge = true; ws.Row(1).Style.Font.Size = 24;
ws.Row(1).Style.Font.Color.SetColor(Color.Blue);
ws.Column(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
標頭行
ws.Row(2).Style.Font.Bold = true;
ws.Row(2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
ws.Row(2).Style.Font.Bold = true;
ws.Row(2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
自定義列寬
ws.Column(3).Width = 20;
ws.Column(3).Width = 20;
本節展示了高級格式化,如:
-
合併單元格
-
字體樣式
-
背景顏色
-
行/列對齊
- 寬度調整
這些模仿典型的MS Office Excel格式化功能。
從Excel文件中讀取數據到C
現在我們已經將數據寫入Excel,是時候讀回到C#。
Tim介紹了這個方法:
static async Task<List<PersonModel>> LoadExcelFile(FileInfo file)
static async Task<List<PersonModel>> LoadExcelFile(FileInfo file)
他設置了行和列計數器:
int row = 3; // Skip title and header rows int col = 1;
int row = 3; // Skip title and header rows int col = 1;
循環遍歷行
使用while循環,他檢查非空單元格並讀取值:
while (!string.IsNullOrWhiteSpace(ws.Cells[row, col].Value?.ToString()))
while (!string.IsNullOrWhiteSpace(ws.Cells[row, col].Value?.ToString()))
在循環內,讀取並解析值:
p.Id = int.Parse(ws.Cells[row, col].Value.ToString());
p.FirstName = ws.Cells[row, col + 1].Value.ToString();
p.LastName = ws.Cells[row, col + 2].Value.ToString();
p.Id = int.Parse(ws.Cells[row, col].Value.ToString());
p.FirstName = ws.Cells[row, col + 1].Value.ToString();
p.LastName = ws.Cells[row, col + 2].Value.ToString();
List
驗證導入的數據
Tim循環遍歷返回的列表,並將每個條目寫入控制台:
foreach (var p in peopleFromExcel)
{
Console.WriteLine($"{p.Id} {p.FirstName} {p.LastName}");
}
foreach (var p in peopleFromExcel)
{
Console.WriteLine($"{p.Id} {p.FirstName} {p.LastName}");
}
為了展示Excel作為用戶輸入工具的靈活性,Tim直接在Excel文件中手動添加新記錄("Bill Smith", "Mary White")。 當重新運行應用程序時,這些條目被導入,而不需要改變代碼——證明了Excel作為數據輸入界面的潛力。
實用用例
Tim強調使用C# Excel解決方案的用例:
-
將數據庫表導出到Excel
-
導入最終用戶輸入的數據
-
使用Excel作為報告儀錶板
- 創建結構化工作簿進行數據處理
而且這一切都不依賴於Microsoft.Office.Interop.Excel,這需要安裝Excel。
關於EPPlus和Excel文件的最後說明
Tim解釋說,程序創建的.xslx文件在打開並保存到Excel之前不包含所有的元數據。 這就是為什麼該文件在真實的Excel應用程序中打開後文件大小增加的原因。
他還指出EPPlus是一個功能強大、穩定的程式庫,支持:
-
圖表
-
圖像
-
火花線
-
公式
-
頁面設置
-
邊框
- 單元格格式
結論
在C#中創建Excel文件不必困難或昂貴。 感謝EPPlus Excel程式庫,開發人員可以在程序中創建具有豐富功能的Excel文檔,而無需MS Office。 如Tim Corey所示,只需幾行代碼,您就可以:
-
創建Excel文件
-
填充行和列
-
應用樣式
-
讀取數據
- 使用Excel作為用戶界面
這使它成為輕量級報告工具、數據導入/導出或簡單地提供用戶已知界面的絕佳選擇。
所以,下一次當您構建項目需要輸出或消耗Excel數據時,試著從Tim Corey的視頻中實施示例代碼——將Excel的強大功能帶入您的.NET Framework或.NET Core應用程序中。
