ZetCode

C# Excel

最后修改时间 2025 年 5 月 1 日

C# Excel 教程展示了如何使用 ClosedXML 库在 C# 中处理 Excel 文件。

了解 Excel 文件格式

在本文中,我们将重点介绍 .xlsx 文件——一种在 Microsoft Excel 中广泛使用的 Open XML 电子表格格式。与旧格式不同,.xlsx 基于 Office Open XML 标准,提供更好的压缩和数据完整性。

其他相关的 Excel 格式包括

介绍 ClosedXML

ClosedXML 是一个强大的 .NET 库,专为在 C# 中处理 Excel 2007+(.xlsx、.xlsm)文件而设计。它提供了一个直观的 API,用于读取、修改和写入 Excel 电子表格,而无需直接与 Excel 交互。

安装

要将 ClosedXML 集成到您的 .NET 项目中,请使用以下命令通过 NuGet 安装它

$ dotnet add package ClosedXML

安装完成后,ClosedXML 可以实现无缝的电子表格操作,使其成为数据处理和自动化任务的理想选择。

C# Excel 简单示例

在第一个示例中,我们使用 ClosedXML 创建一个新的 xlsx 文件。

Program.cs
using ClosedXML.Excel;

using var wbook = new XLWorkbook();

var ws = wbook.Worksheets.Add("Sheet1");
ws.Cell("A1").Value = "150";

wbook.SaveAs("simple.xlsx");

我们创建一个新的 Excel 文件并将一个值写入单元格。

using var wbook = new XLWorkbook();

创建了一个新的 XLWorkbook

var ws = wbook.Worksheets.Add("Sheet1");

我们向工作簿添加一个新的工作表。

ws.Cell("A1").Value = "150";

一个值被写入到地址为 A1 的单元格。

wbook.SaveAs("simple.xlsx");

工作簿使用 SaveAs 方法保存。

C# Excel 单元格

单元格是行和列的交集。每个单元格都有一个唯一的地址,由其列字母和行号组成。例如,位于工作表左上角的第一个单元格的地址为 A1。

Program.cs
using ClosedXML.Excel;

using var wbook = new XLWorkbook();

var ws = wbook.AddWorksheet("Sheet1");

ws.FirstCell().Value = 150;

ws.Cell(3, 2).Value = "Hello there!";
ws.Cell("A6").SetValue("falcon").SetActive();

ws.Column(2).AdjustToContents();

wbook.SaveAs("data.xlsx");

在本例中,我们处理单元格。

ws.FirstCell().Value = 150;

FirstCell 检索对工作表中第一个单元格的引用。我们使用 Value 属性将其值设置为 150。

ws.Cell(3, 2).Value = "Hello there!";

引用单元格的另一种方法是使用重载的 Cell 方法,该方法将行号和列号作为参数。

ws.Cell("A6").SetValue("falcon").SetActive();

在这里,我们通过其地址 (A6) 获取一个单元格,并使用 SetValue 方法将字符串写入单元格。 SetActive 方法使单元格处于活动状态。

ws.Column(2).AdjustToContents();

我们将第二列的宽度调整为内容;Hello there! 值完全可见。

C# 读取 Excel 文件

在下一个示例中,我们从先前创建的 Excel 文件中读取数据。

Program.cs
using ClosedXML.Excel;

using var wbook = new XLWorkbook("simple.xlsx");

var ws1 = wbook.Worksheet(1); 
var data = ws1.Cell("A1").GetValue<string>();

Console.WriteLine(data);

该示例从单元格中读取一个值。

using var wbook = new XLWorkbook("simple.xlsx");

我们打开一个工作簿。

var ws1 = wbook.Worksheet(1); 

我们导航到第一个工作表。

var data = ws1.Cell("A1").GetValue<string>();

使用 GetValue 方法,我们从单元格 A1 读取一个值。

C# Excel 应用样式

可以通过 Style 属性应用样式。

Program.cs
using ClosedXML.Excel;

using var wbook = new XLWorkbook();

var ws = wbook.Worksheets.Add("Sheet1");

var c1 = ws.Column("A");
c1.Width = 25;

var c2 = ws.Column("B");
c2.Width = 15;

ws.Cell("A3").Value = "an old falcon";
ws.Cell("B2").Value = "150";
ws.Cell("B5").Value = "Sunny day";

ws.Cell("A3").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
ws.Cell("A3").Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
ws.Cell("A3").Style.Font.Italic = true;

ws.Cell("B2").Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
ws.Cell("B5").Style.Font.FontColor = XLColor.Red;

wbook.SaveAs("styled.xlsx");

在本例中,我们将样式应用于单元格。

var c1 = ws.Column("A");
c1.Width = 25;

var c2 = ws.Column("B");
c2.Width = 15;

我们设置 A 列和 B 列的宽度。

ws.Cell("A3").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
ws.Cell("A3").Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
ws.Cell("A3").Style.Font.Italic = true;

在 A3 单元格中,我们水平和垂直居中文本,并选择草书字体。

ws.Cell("B2").Style.Border.OutsideBorder = XLBorderStyleValues.Thin;

我们为 B2 单元格设置一个细边框。

ws.Cell("B5").Style.Font.FontColor = XLColor.Red;

在 B5 单元格中,字体颜色设置为红色。

C# Excel 范围

范围是一组一个或多个单元格。范围地址由左上角的单元格地址和右下角的地址指定,并用冒号分隔。

使用 Range 创建单个范围;使用 Ranges 创建多个范围。

Program.cs
using ClosedXML.Excel;

using var wbook = new XLWorkbook();

var ws = wbook.Worksheets.Add("Sheet1");

ws.Range("D2:E2").Style.Fill.BackgroundColor = XLColor.Gray;
ws.Ranges("C5, F5:G8").Style.Fill.BackgroundColor = XLColor.Gray;

var rand = new Random();
var range = ws.Range("C10:E15");

foreach (var cell in range.Cells())
{
    cell.Value = rand.Next();
}

ws.Column("C").AdjustToContents();
ws.Column("D").AdjustToContents();
ws.Column("E").AdjustToContents();

wbook.SaveAs("ranges.xlsx");

在本例中,我们处理范围。

ws.Range("D2:E2").Style.Fill.BackgroundColor = XLColor.Gray;

我们更改 D2:E2 范围的背景颜色。

ws.Ranges("C5, F5:G8").Style.Fill.BackgroundColor = XLColor.Gray;

在这里,我们更改两个范围的背景颜色。

var rand = new Random();
var range = ws.Range("C10:E15");

foreach (var cell in range.Cells())
{
    cell.Value = rand.Next();
}

C10:E15 范围的每个单元格中,我们设置一个随机值。 我们使用 Cells 方法获取范围的单元格。

ws.Column("C").AdjustToContents();

我们将 C 列的宽度调整为写入的内容,以便整个值都可见。

C# Excel 合并单元格

要合并单元格,我们使用 Merge 方法。

Program.cs
using ClosedXML.Excel;

using var wbook = new XLWorkbook();

var ws = wbook.Worksheets.Add("Sheet1");

ws.Cell("A1").Value = "Sunny day";
ws.Cell("A1").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
ws.Cell("A1").Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;

ws.Range("A1:B2").Merge();

wbook.SaveAs("merged.xlsx");

我们将四个单元格合并为一个。

ws.Range("A1:B2").Merge();

我们在四个单元格的范围内调用 Merge 方法; A1 到 B2。

C# Excel 排序

可以使用 Sort 方法对列进行排序。

Program.cs
using ClosedXML.Excel;

using var wbook = new XLWorkbook();

var ws = wbook.Worksheets.Add("Sheet1");

var rand = new Random();
var range = ws.Range("A1:A15");

foreach (var cell in range.Cells())
{
    cell.Value = rand.Next(1, 100);
}

ws.Sort("A");

wbook.SaveAs("sorted.xlsx");

我们向 A 列添加十五个随机值。 然后我们使用 Sort 对列进行排序。

C# Excel CellsUsed

CellsUsed 方法返回具有值的单元格的集合。

Program.cs
using ClosedXML.Excel;

using var wbook = new XLWorkbook();

var ws = wbook.Worksheets.Add("Sheet1");

ws.Cell("A1").Value = "sky";
ws.Cell("A2").Value = "cloud";
ws.Cell("A3").Value = "book";
ws.Cell("A4").Value = "cup";
ws.Cell("A5").Value = "snake";
ws.Cell("A6").Value = "falcon";
ws.Cell("B1").Value = "in";
ws.Cell("B2").Value = "tool";
ws.Cell("B3").Value = "war";
ws.Cell("B4").Value = "snow";
ws.Cell("B5").Value = "tree";
ws.Cell("B6").Value = "ten";

var n = ws.Range("A1:C10").CellsUsed().Count();
Console.WriteLine($"There are {n} words in the range");

Console.WriteLine("The following words have three latin letters:");

var words = ws.Range("A1:C10")
    .CellsUsed()
    .Select(c => c.Value.ToString())
    .Where(c => c?.Length == 3)
    .ToList();

words.ForEach(Console.WriteLine);

wbook.SaveAs("usedcells.xlsx");

在本例中,我们将十二个单词写入工作表的两列。

var n = ws.Range("A1:C10").CellsUsed().Count();
Console.WriteLine($"There are {n} words in the range");

我们定义一个大于我们写入的单元格的范围。 借助 CellsUsed 方法,我们获得所有非空单元格。 Count 方法计算非空单元格的数量。

var words = ws.Range("A1:C10")
    .CellsUsed()
    .Select(c => c.Value.ToString())
    .Where(c => c?.Length == 3)
    .ToList();

在这里,我们过滤所有包含三个拉丁字母的单词。

C# Excel 表达式求值

使用 Evaluate,我们可以评估一个表达式。

Program.cs
using ClosedXML.Excel;

using var wbook = new XLWorkbook("data.xlsx");

var ws = wbook.Worksheet(1); 

var sum = ws.Evaluate("SUM(A1:A7)");
var max = ws.Evaluate("MAX(A1:A7)");

Console.WriteLine($"The sum is: {sum}");
Console.WriteLine($"The maximum valus is: {max}");

在本例中,A 列中有值。 我们评估值的 SUM 和 MAX 表达式。

C# Excel 公式

使用 FormulaA1 属性,我们可以在单元格中插入公式。

Program.cs
using ClosedXML.Excel;

using var wbook = new XLWorkbook("data.xlsx");

var ws = wbook.Worksheet(1); 

ws.Cell("A8").FormulaA1 = "SUM(A1:A7)";
ws.Cell("A8").Style.Font.Bold = true;

wbook.SaveAs("data2.xlsx");

在本例中,我们在值下方的单元格中插入 SUM 公式。

来源

ClosedXML Github 页面

在本文中,我们演示了如何使用 ClosedXML 库在 C# 中处理 Excel 文件。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 我从 2007 年开始撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程