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 格式。
说明:
-
new XLWorkbook()
创建一个 Excel 工作簿。 -
AddWorksheet("sheet1")
添加一个名为 “Sheet1” 的工作表。 -
Cell(1, 1).Value = "Hello, ClosedXML!"
在 第一行第一列添加数据,在Excel中列用字母排序,行用阿拉伯数字表示,因此第一行第一列可以用A1
表示,用Cell("A1").Value = "Hello, ClosedXML!"
添加数据是一样的效果。 -
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中可以对单元格设置样式、背景、边框、内容字体和许多其他选项。
修改样式有两种方式,Fluent
和properties
,无论哪种方式对产生的样式效果都是相同的。
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);
其中XLAlignmentVerticalValues
是 ClosedXML 提供的一个枚举类型 (enum
),用于设置单元格的 垂直对齐方式。它的可选值如下:
XLAlignmentVerticalValues 枚举值
值 | 描述 |
---|---|
Top | 顶部对齐 |
Center | 居中对齐 |
Bottom | 底部对齐 |
Justify | 两端对齐(适用于自动换行的单元格) |
Distributed | 分散对齐(均匀分布文本) |
XLAlignmentHorizontalValues
是 ClosedXML 提供的一个枚举类型 (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 | 数字(数值类型,包括整数和小数) | 100 ,3.14 |
DateTime | 日期时间 | DateTime.Now ,2025-03-05 10:30:00 |
Boolean | 布尔值 | true ,false |
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 常见操作汇总
操作 | 代码 |
---|---|
创建 Excel | new XLWorkbook(); |
添加工作表 | workbook.Worksheets.Add("Sheet1"); |
读取 Excel | new 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#上位机的更多技巧! 🎉