跳至頁尾內容
Iron Academy Logo
學習C#
學習C#

其他類別

在C#中建立Excel文件

Tim Corey
55m 42s

建立和處理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應用程式。

Hero Worlddot related to 在C#中建立Excel文件
Hero Affiliate related to 在C#中建立Excel文件

分享您所愛以賺取更多報酬

您是否為使用 .NET、C#、Java、Python 或 Node.js 的開發者建立內容?將您的專業知識轉化為額外收入!

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話