C# 操作 Excel 的利器:ClosedXML 全面解析(附代码示例)

C# 操作 Excel 的利器:ClosedXML 全面解析(附代码示例)

一、介绍

在 C# 中操作 Excel 文件,我们通常会选择 OpenXML、EPPlus 或者 Interop.Excel,其中 ClosedXML 是基于 OpenXML 的一个更高级的封装,它提供了更简洁易懂的 API,不需要你直接与复杂的 OpenXML API 交互,让开发者可以像操作 List、Dictionary 一样操作 Excel,极大地提升了开发效率。

它可以用来创建、读取、编辑和保存 Excel 文件(.xlsx 格式),并支持常见的 Excel 功能,比如格式化单元格、设置公式、冻结窗格、图表、数据验证等。

  • 适用于快速开发、日常的 Excel 操作、数据导出导入等。
  • 适用于中小型的文件处理,不需要完全控制 Excel 的每个细节。
  • 适合大多数业务应用,如报告生成、导入导出功能。

二、使用教程

###1、安装

在 C# 项目中安装 ClosedXML 只需要一行命令:

Install-Package ClosedXML

或者在 NuGet 管理器中搜索 ClosedXML 并安装。

2、准备知识

在Excel中,一个.xlsx文件就是一个工作簿,对应XLWorkbook对象;在工作簿中有若干个表,称为工作表 worksheet

3、创建一个 Excel 文件并写入数据

创建一个 Excel 文件,并在第 1 行 1 列单元格写入 Hello, ClosedXML!

using ClosedXML.Excel; 
var workbook = new XLWorkbook(); // 创建工作簿
var worksheet = workbook.AddWorksheet("sheet1");    // 创建名称为sheet1的工作表
worksheet.Cell(1, 1).Value = "Hello, ClosedXML!";   // 向第一行第一列写入数据方法1
worksheet.Cell("A1").Value = "Hello, ClosedXML!";   // 向第一行第一列写入数据方法2       
workbook.SaveAs("Test.xlsx");     // 将工作簿保存为 .xlsx 格式。

说明:

  1. new XLWorkbook() 创建一个 Excel 工作簿。

  2. AddWorksheet("sheet1") 添加一个名为 “Sheet1” 的工作表。

  3. Cell(1, 1).Value = "Hello, ClosedXML!" 在 第一行第一列添加数据,在Excel中列用字母排序,行用阿拉伯数字表示,因此第一行第一列可以用A1表示,用Cell("A1").Value = "Hello, ClosedXML!"添加数据是一样的效果。

  4. SaveAs("Test.xlsx") 保存 Excel 文件。

4、读取Excel表

 var wb = new XLWorkbook("Test.xlsx"); // 读取工作簿路径
 var ws = wb.Worksheet(1);       	   // 读取第一张表
 string x = ws.Cell("A1").Value.ToString();  // 读取A1单元格的数据
 MessageBox.Show(x);

说明:

  • new XLWorkbook("Test.xlsx") 读取已有的 Excel 文件。
  • Cell("A1").Value.ToString() 获取 A1 单元格的数据。同理Cell(1,1).Value.ToString()一样的效果。

5、追加数据

如果要在已有 Excel 文件中追加数据,我们可以先读取,再定位到最后一行进行写入:

using ClosedXML.Excel;

var filePath = "Test.xlsx";
var workbook = new XLWorkbook(filePath);
var worksheet = workbook.Worksheet(1);

// 获取最后一行的行号
int lastRow = worksheet.LastRowUsed()?.RowNumber() ?? 0;

// 追加新数据
worksheet.Cell(lastRow + 1, 1).Value = "新增数据";

// 保存修改
workbook.Save();
Console.WriteLine("数据追加成功!");

6、单元格样式操作

在Excel中通常需要对表格的样式做修改,以达到需要的效果,在CloseXml中可以对单元格设置样式、背景、边框、内容字体和许多其他选项。

修改样式有两种方式,Fluentproperties,无论哪种方式对产生的样式效果都是相同的。

6.1、对字体的修改
//  properties方式
worksheet.Cell("A1").Style.Font.FontSize = 20;           // 字体大小20
worksheet.Cell("A1").Style.Font.FontName = "Arial";	  // 字体类型Arial

// fluent方式
worksheet.Cell("A1").Style
    .Font.SetFontSize(20)
    .Font.SetFontName("Arial");
6.2、合并单元格
worksheet.Range(2,3,8,9).Merge(); // 第二行第三列 到 第八行第九列 合并
worksheet.Range("A1:C5").Merge(); // A1到C5合并
6.3、居中设置
// fluent方式A1单元格设置水平居中
worksheet.Cell(1, 1).Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center);
// fluent方式A1单元格设置垂直居中
worksheet.Cell(1, 1).Style.Alignment.SetVertical(XLAlignmentVerticalValues.Center);
// properties方式设置整个工作表内容垂直居中
worksheet.Rows().Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
// 设置范围内所有单元格水平居中
var range = worksheet.Range("A1:C3");
range.Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center);

其中XLAlignmentVerticalValuesClosedXML 提供的一个枚举类型 (enum),用于设置单元格的 垂直对齐方式。它的可选值如下:

XLAlignmentVerticalValues 枚举值

描述
Top顶部对齐
Center居中对齐
Bottom底部对齐
Justify两端对齐(适用于自动换行的单元格)
Distributed分散对齐(均匀分布文本)

XLAlignmentHorizontalValuesClosedXML 提供的一个枚举类型 (enum),用于设置单元格的 水平对齐方式。它的可选值如下:

XLAlignmentHorizontalValues 枚举值

描述
Left左对齐
Center水平居中对齐
Right右对齐
Justify两端对齐(适用于自动换行的单元格)
Distributed分散对齐(均匀分布文本)
Fill填充对齐(重复文本填充整个单元格)
CenterContinuous跨列居中(在合并单元格的情况下生效)
General默认对齐方式(文本左对齐,数字右对齐)

####6.4、设置边框

worksheet.Cell(1, 1).Style.Border.OutsideBorder = XLBorderStyleValues.Thick;

给单元格加上粗边框

XLBorderStyleValues 枚举用于设置 Excel 单元格的 边框样式。以下是可用的 边框样式 及其说明:

XLBorderStyleValues 枚举值

效果说明
None❌ 无边框默认状态,无任何边框
DashDot─ ┄ ─短划线-点-短划线边框
DashDotDot─ ┄ ┄ ─短划线-点-点-短划线边框
Dashed─ ─ ─虚线边框
Dotted⋯⋯⋯⋯点状边框
Double═══双线边框
Hair……极细边框
Medium中等粗细边框
MediumDashDot— ┄ —中等粗细的短划线-点边框
MediumDashDotDot— ┄ ┄ —中等粗细的短划线-点-点边框
MediumDashed— — —中等粗细的虚线边框
SlantDashDot/ ┄ /倾斜短划线-点边框
Thick===粗线边框
Thin-细线边框

7、忽略 Excel 错误

当我们写入数据时,可能会出现 Number Stored as Text 之类的错误,我们可以使用 IgnoreErrors 方法忽略它:

worksheet.Cell(1, 1).SetValue("123456").SetDataType(XLDataType.Number);

或者

worksheet.Cell(1, 1).Style.NumberFormat.Format = "0";

XLDataType 枚举用于定义 Excel 单元格的数据类型。正确设置数据类型可以 避免格式错误,例如数值被错误地当作字符串存储,或者日期无法正确计算等。

XLDataType 枚举值

说明示例
Text纯文本(字符串)"Hello""123"
Number数字(数值类型,包括整数和小数)1003.14
DateTime日期时间DateTime.Now2025-03-05 10:30:00
Boolean布尔值truefalse
TimeSpan时间间隔new TimeSpan(2, 30, 0)(2小时30分)
Blank空值null

8、保存 Excel 并避免文件被占用

ClosedXML 处理 Excel 时可能会占用文件,我们可以使用 using 让它自动释放资源:

using (var workbook = new XLWorkbook())
{
    var worksheet = workbook.Worksheets.Add("Sheet1");
    worksheet.Cell(1, 1).Value = "ClosedXML 测试";
    workbook.SaveAs("Test.xlsx");
}

这样 workbook 在使用完毕后会自动释放资源。

三、总结

ClosedXML 常见操作汇总

操作代码
创建 Excelnew XLWorkbook();
添加工作表workbook.Worksheets.Add("Sheet1");
读取 Excelnew XLWorkbook("Test.xlsx");
读取单元格worksheet.Cell(1, 1).GetValue<string>();
追加数据worksheet.Cell(lastRow + 1, 1).Value = "新数据";
合并单元格worksheet.Range(1, 1, 1, 3).Merge();
居中对齐worksheet.Cell(1, 1).Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center);
设置边框worksheet.Cell(1, 1).Style.Border.OutsideBorder = XLBorderStyleValues.Thick;
删除行worksheet.Row(2).Delete();
删除列worksheet.Column(3).Delete();

ClosedXML 是 C# 操作 Excel 的强大工具,它简化了 OpenXML 复杂的 API,提供了类似于 Excel 操作的直观方法,适合 WinForms、WPF 及 Web 应用开发。因为接触不多,以上内容只是项目中常用的一些操作,如果需要可以参考官网文档查找更多的使用方法;附上CloseXML文档链接:https://docs.closedxml.io/en/0.104.2/index.html。希望这篇文章对你有所帮助!

欢迎在评论区交流 C#上位机的更多技巧! 🎉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值