c#如何使用ClosedXML操作Excel_c#ClosedXML操作Excel看这一篇就够了
ClosedXML是.NET生态中操作Excel的常用库,但不支持.xls格式,需转为.xlsx。安装需引入ClosedXML.Excel命名空间。写入时注意Cell行号从1开始,需调用SaveAs保存。读取用RowsUsed()可避免行数误判。设置字体须用SetBold方法,公式用FormulaA1。多线程下操作同一实例不安全,且不支持密码保护文件。
先说几个核心判断:ClosedXML 是目前 .NET 生态里操作 Excel 最顺手的库之一,但有几个坑是新手必踩的。都知道 ClosedXML 不支持 .xls 格式,但很多人拿到老文件就直接怼上去,结果要么抛 InvalidDataException,要么文件静默打开失败——这时候唯一的选择就是用 Excel 或 Microsoft.Office.Interop.Excel 转成 .xlsx 再处理,其他路都走不通。
花几分钟把下面这几个关键点过一遍,能省下不少调试时间。
安装包和基础写入:别漏掉 using ClosedXML.Excel;
通过 NuGet 装好 ClosedXML 之后,XLWorkbook、IWorksheet 这些类型不会自动识别——必须显式引入命名空间,否则编译直接报红。这个错误很常见,装了包却忘了加 using,代码写完了才发现类型找不到。
基础写入的套路其实很简单:
using (var wb = new XLWorkbook())
{
var ws = wb.Worksheets.Add("Sheet1");
ws.Cell("A1").Value = "Hello";
ws.Cell(2, 1).Value = 123; // 行号在前,列号在后
wb.Sa veAs("output.xlsx");
}
需要注意几个细节:Cell("A1") 和 Cell(2, 1) 是等价的,但后者在循环写入时更顺手。列号从 1 开始,不是 0,Cell(1, 1) 对应 A1,这个很容易搞混。另外,不调用 Sa veAs() 或 Sa ve(),文件不会生成,不少人写完数据忘了保存,回头一看,文件空空如也。
读取已有 Excel:用 IXLWorksheet.RowsUsed() 而非 Row(1).LastCellUsed().RowNumber()
读取现有文件时,很多人想“获取最后一行”,于是用 Row(1).LastCellUsed().RowNumber(),结果在空行或合并单元格后严重误判。正确做法是用 RowsUsed() 获取所有有值或有样式的行:
using (var wb = new XLWorkbook("input.xlsx"))
{
var ws = wb.Worksheet(1);
foreach (var row in ws.RowsUsed()) // 自动跳过全空行
{
var value = row.Cell(1).Value.ToString();
Console.WriteLine(value);
}
}
RowsUsed() 比 RowCount() 更可靠,后者返回的是 Excel 内部记录的“最大行数”,哪怕整张表只填了 A1,也可能返回 1048576——这个坑很多人踩过。如果必须按行号遍历,用 ws.Rows(1, ws.LastRowUsed().RowNumber()) 会更稳妥。
还有一个容易忽略的点:读取日期时,Cell.Value 默认返回 DateTime,但如果单元格格式是文本,内容为 “2023-01-01”,就会返回字符串。这时候需要手动 TryParse,否则可能类型不匹配。
样式与公式:设置字体后必须调用 Cell.Style 的 setter,不能只改 Font 属性
看这段代码,你觉得它生效吗?
var cell = ws.Cell("A1");
cell.Value = "Bold";
cell.Style.Font.Bold = true; // ❌ 不生效
实际上,根本不会生效。原因在于 XLFont 是只读结构,所有修改方法——比如 SetBold、SetFontName——都返回新实例,原对象不变。正确写法是:
var cell = ws.Cell("A1");
cell.Value = "Bold";
cell.Style.Font.SetBold(true); // ✅ 推荐
// 或
cell.Style = cell.Style.Clone().Font.SetBold(true); // ✅
公式写入用 cell.FormulaA1 = "=SUM(A2:A10)",不要用 Value;读取公式结果用 cell.Value,读取原始公式用 cell.FormulaA1。合并单元格后,只有左上角单元格保留值,其余 Value 为 null——判断是否合并请用 cell.MergedRange()。
最常被忽略的是:ClosedXML 在多线程下操作同一个 XLWorkbook 实例会崩溃,即使只读也不安全;每次操作都应新建实例或加锁。另外,它不支持密码保护的 Excel 文件——试图打开的话,直接抛 InvalidOperationException,没有“其他选项”,就像撞上了南墙,无路可绕。
Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。
Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。
Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。
Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。















