在C#中创建Excel文件
对于任何构建报表工具、数据导出或用户输入界面的 C# 开发人员来说,创建和处理 Excel 文件都是一项至关重要的技能。 在本文中,我们将深入了解 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 文件读取数据。
在解决方案资源管理器中设置项目
蒂姆打开 Visual Studio 2019,选择一个控制台应用程序(.NET Core),并将解决方案命名为 ExcelDemoApp。使用控制台应用程序可以提供一个干净整洁、无干扰的环境,从而可以专注于 Excel 相关的代码。
他将目标框架升级到 .NET 5.0,以利用 C# 9 的功能,如简化对象实例化。
从 NuGet 软件包中添加 EPPlus.
为了创建 Excel 工作簿,Tim 通过 NuGet 软件包管理器安装了 EPPlus 软件包。 EPPlus 是一个 Excel 库,可与 .xlsx 文件(Open XML)一起使用,支持完整的 Excel 功能,如图表、表格、样式和公式,而无需使用 MS Office 或 Excel Interop。
注:EPPlus 可免费用于非商业用途,但商业应用需要许可证。
他将所需的非商业许可接受行复制到代码中,以避免运行时出错,并使用 OfficeOpenXml 添加必要的内容; 指令。
定义 Excel 文件路径
Tim 使用 System.IO.FileInfo 设置了一个硬编码文件路径:
var file = new FileInfo(@"C:\demos\youtubedemo.xlsx");var file = new FileInfo(@"C:\demos\youtubedemo.xlsx");该文件最初并不存在--它将由程序动态创建。
创建数据模型
为了填充 Excel 工作表,Tim 定义了一个简单的 PersonModel 类,该类具有以下属性:
int Id
字符串 FirstName
- 字符串 LastName
他使用辅助方法 GetSetupData() 返回一个 List
异步将数据保存到 Excel 文件
在现代开发中,阻塞用户界面线程是不可接受的。 这就是 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);- 确保包含标题(如 "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# 了。
蒂姆介绍方法:
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 作为用户输入工具的灵活性,蒂姆直接在 Excel 文件中手动添加新记录("比尔-史密斯"、"玛丽-怀特")。在重新运行应用程序时,这些条目无需更改代码即可导入,这证明了 Excel 作为数据输入界面的潜力。
实际用例
Tim 重点介绍了 C# Excel 解决方案的使用案例:
将数据库表格导出到 Excel
导入最终用户输入的数据
将 Excel 用作报告仪表板
- 为数据处理创建结构化工作簿
所有这一切都不能依赖 Microsoft.Office.Interop.Excel,因为它需要安装 Excel。
关于 EPPlus 和 Excel 文件的最终说明
Tim 解释说,在 Excel 中打开和保存之前,以编程方式创建的 .xlsx 文件不包含所有元数据。 这就是为什么在真正的 Excel 应用程序中打开后文件大小会增大的原因。
他还指出,EPPlus 是一个完善、强大的库,支持以下语言:
图表
图片
火花线
公式
页面设置
边界
- 单元格格式
结论
用 C# 创建 Excel 文件并不困难,也不昂贵。有了 EPPlus Excel 库,开发人员无需使用 MS Office 即可通过编程创建功能丰富的 Excel 文档。正如 Tim Corey 所演示的那样,只需几行代码,您就可以:
创建 Excel 文件
填充行和列
应用样式
回读数据
- 将 Excel 用作面向用户的用户界面
这使它成为轻量级报告工具、数据导入/导出或仅仅为用户提供他们已经熟悉的界面的绝佳选择。
因此,下次当您在构建项目并需要输出或消耗 Excel 数据时,请尝试执行 Tim Corey 的 视频中的示例代码,并将 Excel 的强大功能带入您的 .NET Framework 或 .NET Core 应用程序中。

