在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,選擇一個控制台應用程式(.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格式功能。
在C#中從Excel文件讀取資料
現在我們已將資料寫入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解釋程式生成的.xlsx文件沒有包含所有元資料,直到它們在Excel中打開並保存。 這就是為什麼在真實的Excel應用程式中打開後,文件大小會增加。
他還指出EPPlus是一個精緻的穩健程式庫,支持:
圖表
圖像
晶Line
公式
頁面設置
邊框
- 單元格格式設置
結論
在C#中建立Excel文件不必困難或昂貴。由於EPPlus Excel程式庫,開發者可以程式化地構建功能豐富的Excel文件,而不需要MS Office。正如Tim Corey所展示的,僅需要幾行程式碼您就可以:
建立Excel文件
填充行和列
應用樣式
讀回資料
- 使用Excel作為使用者介面
這使其成為輕量報告工具、資料導入/導出或僅提供使用者已知介面的絕佳選擇。
所以下次您建立項目需要輸出或使用Excel資料時,嘗試實施Tim Corey的影片中的範例程式碼——並將Excel的力量引入您的.NET Framework或.NET Core應用程式。

