商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > c#如何使用ClosedXML操作Excel_c#ClosedXML操作Excel看这一篇就够了

c#如何使用ClosedXML操作Excel_c#ClosedXML操作Excel看这一篇就够了

  发布于2026-07-19 阅读(0)

扫一扫,手机访问

先说几个核心判断:ClosedXML 是目前 .NET 生态里操作 Excel 最顺手的库之一,但有几个坑是新手必踩的。都知道 ClosedXML 不支持 .xls 格式,但很多人拿到老文件就直接怼上去,结果要么抛 InvalidDataException,要么文件静默打开失败——这时候唯一的选择就是用 Excel 或 Microsoft.Office.Interop.Excel 转成 .xlsx 再处理,其他路都走不通。

花几分钟把下面这几个关键点过一遍,能省下不少调试时间。

安装包和基础写入:别漏掉 using ClosedXML.Excel;

通过 NuGet 装好 ClosedXML 之后,XLWorkbookIWorksheet 这些类型不会自动识别——必须显式引入命名空间,否则编译直接报红。这个错误很常见,装了包却忘了加 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 是只读结构,所有修改方法——比如 SetBoldSetFontName——都返回新实例,原对象不变。正确写法是:

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。合并单元格后,只有左上角单元格保留值,其余 Valuenull——判断是否合并请用 cell.MergedRange()

最常被忽略的是:ClosedXML 在多线程下操作同一个 XLWorkbook 实例会崩溃,即使只读也不安全;每次操作都应新建实例或加锁。另外,它不支持密码保护的 Excel 文件——试图打开的话,直接抛 InvalidOperationException,没有“其他选项”,就像撞上了南墙,无路可绕。

本文转载于:https://www.php.cn/faq/2312623.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注