C#代码实现添加或读取Excel公式的完整指南

 更新时间:2026年05月14日 08:10:07   作者:LSTM97  
在日常的办公数据处理任务中,Excel 公式和函数是自动化计算和数据分析的基石,本文将借助 Free Spire.XLS for .NET 这款轻量级且免费的组件,详细演示如何使用 C# 实现 Excel 公式的添加与读取操作,感兴趣的小伙伴可以了解下

在日常的办公数据处理任务中,Excel 公式和函数是自动化计算和数据分析的基石。对于 .NET 开发者而言,如何通过编程方式向 Excel 文件注入公式,或者从已有的表格中提取公式逻辑,是一个常见且实用的需求。本文将借助 Free Spire.XLS for .NET 这款轻量级且免费的组件,详细演示如何使用 C# 实现 Excel 公式的添加与读取操作。

准备工作:引入 Free Spire.XLS

在开始编码之前,我们需要在项目中引入 Free Spire.XLS for .NET。该组件可以通过 NuGet 包管理器轻松安装,在包控制台中执行以下命令即可:

Install-Package FreeSpire.XLS

安装完成后,我们就可以在代码中通过 using Spire.Xls; 命名空间来访问所有 Excel 操作相关的类与方法。

一、向 Excel 添加公式

添加公式的场景非常广泛,例如批量计算销售总额、统计学生平均分、生成动态报表等。下面的示例展示了如何创建一个新的 Excel 工作簿,并在其中写入基础数据,然后为指定单元格添加公式。

using Spire.Xls;

Workbook workbook = new Workbook();
Worksheet sheet = workbook.Worksheets[0];

// 添加基础数值数据
sheet.Range[1, 1].NumberValue = 1;
sheet.Range[1, 2].NumberValue = 2;
sheet.Range[1, 3].NumberValue = 3;
sheet.Range[1, 4].NumberValue = 4;
sheet.Range[1, 5].NumberValue = 4;
sheet.Range[1, 6].NumberValue = 6;

// 添加函数公式:AVERAGE 平均值
string averageFormula = "=AVERAGE(Sheet1!$A$1:A$6)";
sheet.Range[2, 1].Formula = averageFormula;

// 添加算术运算公式
string calcFormula = "=1+2+3+4+5-6-7+8-9";
sheet.Range[3, 1].Formula = calcFormula;

workbook.SaveToFile("AddFormulasAndFunctions.xlsx", ExcelVersion.Version2016);
workbook.Dispose();

代码要点解析:

  • 通过 sheet.Range[行, 列].Formula 属性直接为单元格赋值公式字符串,语法与 Excel 原生公式完全一致。
  • 公式中支持绝对引用(如 $D$2)和相对引用(如 F$2),这与 Excel 中的行为相同。
  • 不仅可以添加简单的四则运算,还可以使用 AVERAGESUMIF 等内置函数。

二、从 Excel 读取已有公式

在实际业务中,我们经常需要解析他人制作的 Excel 报表,提取其中的计算逻辑以进行审计、迁移或文档化。以下代码演示了如何加载一个现有的 Excel 文件,遍历所有已使用的单元格,并找出其中包含公式的单元格。

using Spire.Xls;
using System.IO;
using System.Text;

Workbook workbook = new Workbook();
workbook.LoadFromFile("Formulas.xlsx");

Worksheet sheet = workbook.Worksheets[0];
StringBuilder sb = new StringBuilder();
CellRange usedRange = sheet.AllocatedRange;

foreach (CellRange cell in usedRange)
{
    if (cell.HasFormula)
    {
        string cellName = cell.RangeAddressLocal;
        string formula = cell.Formula;
        sb.AppendLine($"{cellName} 包含公式: {formula}");
    }
}

File.WriteAllText("ReadFormulasAndFunctions.txt", sb.ToString());

代码要点解析:

  • cell.HasFormula 属性是一个布尔值,用于快速判断单元格是否包含公式。
  • cell.Formula 返回公式的字符串形式,例如 =AVERAGE(D2:F2)
  • 通过 AllocatedRange 获取工作表中已使用数据的范围,避免遍历整个空白工作表,提升效率。
  • 最终将提取出的公式信息写入文本文件,便于后续分析或存档。

三、实战应用场景

掌握公式的添加与读取后,我们可以构建许多实用的自动化工具:

  1. 报表生成器 :自动向 Excel 模板写入原始数据,并动态添加 SUMCOUNTIF 等统计公式。
  2. 公式审核工具 :批量读取财务报表中的复杂公式,验证其逻辑是否正确,防止人为错误。
  3. 公式迁移助手 :将旧版 Excel 文件中的公式提取出来,批量应用到新版模板的对应位置。
  4. 教学辅助系统 :自动批改学生提交的 Excel 作业,读取其中的公式判断解题步骤是否正确。

四、注意事项与建议

  • 公式字符串必须以等号 = 开头,否则组件会将其视为普通文本。
  • 公式中引用的单元格范围必须是有效的,如果引用了不存在的数据,Excel 打开时可能显示 #REF! 错误。
  • Free Spire.XLS 是免费版本,但有一定的页数限制(每个工作表最多 5 页)。对于大多数中小型项目来说完全够用。
  • 如果需要处理超大文件或消除页数限制,可以考虑升级到商业版 Spire.XLS。

五、知识扩展

在 C# 中处理 Excel 公式,市面上有多种成熟的类库可供选择。一般来说,如果你的应用场景是读取或生成基础的 Excel 文件,使用 EPPlus 或 ClosedXML 这类开源库就足够了。如果需要进行复杂的公式计算、处理大规模数据或需要企业级支持,那么 Aspose.Cells 会是更合适的选择。

下面是几种主流方案的对比,可以帮你快速决定。

特性限制适用场景安装方式 (NuGet)
EPPlus功能丰富,性能优秀,社区活跃5.0版本后商业使用需授权非商业、个人项目;中小规模商业项目Install-Package EPPlus
ClosedXML极其易用,API直观,基于 OpenXML处理超大型文件时性能相对较弱开发者快速上手,处理中小型文件Install-Package ClosedXML
NPOI免费开源,支持 .xls (Excel 97-2003) 和 .xlsx 格式API相对老旧,部分高级功能需手动实现需要兼容旧版 Excel 格式 (.xls)Install-Package NPOI
Aspose.Cells企业级性能,功能最全面,无需安装 Excel收费高昂大规模、高复杂度、企业级应用Install-Package Aspose.Cells
Microsoft.Office.Interop.Excel官方库,能实现Excel的所有功能依赖本地 Excel 组件,性能差,易出错仅限在装有 Excel 的 Windows 客户端本地使用需在 Visual Studio 中添加 COM 引用

除了上述通用的公式操作,使用公式前需要确保单元格所在的行或列已经创建,特别是在 NPOI 这类库中必须严格遵守这个顺序。此外,如果需要数组公式跨工作表引用,建议使用 NPOIAspose.Cells 或 Syncfusion 等支持更完善的库,在设置时可以借助 CellRangeAddress 等对象来处理。

下面我们从主要操作来演示一下各个主流库的基本用法。

添加公式

// EPPlus
using OfficeOpenXml;
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
using (var package = new ExcelPackage())
{
    var sheet = package.Workbook.Worksheets.Add("Sheet1");
    sheet.Cells["A1"].Value = 100;
    sheet.Cells["B1"].Formula = "A1*2"; // 设置公式
    package.SaveAs(new FileInfo("formula.xlsx"));
}
// ClosedXML
using ClosedXML.Excel;
using (var workbook = new XLWorkbook())
{
    var worksheet = workbook.Worksheets.Add("Sheet1");
    worksheet.Cell("A1").Value = 100;
    worksheet.Cell("B1").FormulaA1 = "=A1*2"; // 设置公式
    workbook.SaveAs("formula.xlsx");
}
// NPOI
using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;
var workbook = new XSSFWorkbook();
var sheet = workbook.CreateSheet("Sheet1");
var row = sheet.CreateRow(0);
row.CreateCell(0).SetCellValue(100); // 必须先创建行
row.CreateCell(1).SetCellFormula("A1*2"); // 设置公式
using (var fs = new FileStream("formula.xlsx", FileMode.Create))
    workbook.Write(fs);
// Aspose.Cells
using Aspose.Cells;
var workbook = new Workbook();
var worksheet = workbook.Worksheets[0];
worksheet.Cells["A1"].PutValue(100);
worksheet.Cells["B1"].Formula = "=A1*2"; // 设置公式
workbook.Save("formula.xlsx");

读取公式文本

// EPPlus: 读取单元格中的公式
string formula = worksheet.Cells["B1"].Formula;
// ClosedXML: 通过 FormulaA1 属性读取公式字符串
string formula = worksheet.Cell("B1").FormulaA1;
// NPOI: 获取包含公式的单元格
ICell cell = sheet.GetRow(0).GetCell(1);
string formula = cell.CellFormula; // 读取公式文本
// Aspose.Cells: 从单元格获取公式字符串
string formula = worksheet.Cells["B1"].Formula;

读取计算结果

根据不同的设计目标,各库在读取计算结果时存在差异。例如,Aspose.Cells 会自动计算公式值,而 NPOI 则需要显式调用计算引擎。

// EPPlus: 获取公式计算结果
object result = worksheet.Cells["B1"].Value;
// ClosedXML: 获取公式计算结果
object result = worksheet.Cell("B1").Value;
// NPOI: 先通过公式求值器计算,再读取结果
var evaluator = new XSSFFormulaEvaluator(workbook);
ICell cell = sheet.GetRow(0).GetCell(1);
evaluator.EvaluateInCell(cell);
double result = cell.NumericCellValue; // 读取计算结果
// Aspose.Cells: 计算结果自动更新,直接读取
object result = worksheet.Cells["B1"].Value;

总结

  • 最佳选择:日常开发推荐 EPPlus(个人/非商业)和 ClosedXML(简单易用)。复杂企业级应用推荐 Aspose.Cells
  • 核心操作:C# 操作 Excel 公式主要有 设置公式读取公式文本 和 读取计算结果 三类操作。
  • 关键特性:使用 NPOI 时务必注意操作顺序,且数组公式需要用 ISheet.SetArrayFormula 方法。对于复杂公式环境,谨慎使用依赖本机的 Microsoft.Office.Interop.Excel 组件。
  • 实践建议:建议在开始编码前,先在Excel里验证公式的正确性,这对于数组公式尤其重要。

六、结语

通过本文的示例代码,我们可以清晰地看到,使用 Free Spire.XLS for .NET 在 C# 中操作 Excel 公式是非常直观且高效的。无论是向表格中注入复杂的计算逻辑,还是反向解析已有的公式结构,这个组件都提供了完善且易用的 API 接口。希望这篇文章能帮助你在实际项目中更加得心应手地处理 Excel 公式相关的开发任务。

相关文章

  • C#中把英文字母转换为大写或小写的方法

    C#中把英文字母转换为大写或小写的方法

    这篇文章主要介绍了C#中把英文字母转换为大写或小写的方法,在编码中是一个比较常用的功能,需要的朋友可以参考下
    2014-08-08
  • C#如何使用PaddleOCR进行图片文字识别功能

    C#如何使用PaddleOCR进行图片文字识别功能

    PaddlePaddle(飞桨)是百度开发的深度学习平台,旨在为开发者提供全面、灵活的工具集,用于构建、训练和部署各种深度学习模型,它具有开放源代码、高度灵活性、可扩展性和分布式训练等特点,这篇文章主要介绍了C#使用PaddleOCR进行图片文字识别,需要的朋友可以参考下
    2024-04-04
  • C# Console类的具体用法

    C# Console类的具体用法

    这篇文章主要介绍C# Console类的具体用法,需要的朋友可以参考下
    2013-03-03
  • C# Csv实现基本的读写和转换DataTable

    C# Csv实现基本的读写和转换DataTable

    本文主要介绍了C# Csv实现基本的读写和转换DataTable,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • C# 获取当前年份的周期及周期所在日期范围(推荐)

    C# 获取当前年份的周期及周期所在日期范围(推荐)

    这篇文章主要介绍了C# 获取当前年份的周期,周期所在日期范围 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • C#获取微信小程序的云数据库中数据的示例代码

    C#获取微信小程序的云数据库中数据的示例代码

    本文主要介绍了C#获取微信小程序的云数据库中数据的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • c#如何显式实现接口成员

    c#如何显式实现接口成员

    这篇文章主要介绍了c#如何显式实现接口成员,帮助大家更好的利用c#处理接口,感兴趣的朋友可以了解下
    2020-10-10
  • Unity UGUI的Canvas画布组件使用示例详解

    Unity UGUI的Canvas画布组件使用示例详解

    这篇文章主要介绍了Unity UGUI的Canvas画布组件使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • C#中的composite模式示例详解

    C#中的composite模式示例详解

    Composite组合模式属于设计模式中比较热门的一个,相信大家对它一定不像对访问者模式那么陌生,这篇文章主要介绍了C#中的composite模式,需要的朋友可以参考下
    2022-06-06
  • 同步调用和异步调用WebService

    同步调用和异步调用WebService

    本文给大家介绍webservice同步调用和异步调用,同步调用就是一个同步操作会阻塞整个当前的进程,直到这个操作完成才能执行下一段代码,异步调用不会阻塞启动操作的调用线程,调用程序必须通过轮流检测,或者等待完成信号来发现调用的完成。小伙伴们跟着小编一起学习
    2015-09-09

最新评论