C#代碼實(shí)現(xiàn)添加或讀取Excel公式的完整指南
在日常的辦公數(shù)據(jù)處理任務(wù)中,Excel 公式和函數(shù)是自動(dòng)化計(jì)算和數(shù)據(jù)分析的基石。對(duì)于 .NET 開(kāi)發(fā)者而言,如何通過(guò)編程方式向 Excel 文件注入公式,或者從已有的表格中提取公式邏輯,是一個(gè)常見(jiàn)且實(shí)用的需求。本文將借助 Free Spire.XLS for .NET 這款輕量級(jí)且免費(fèi)的組件,詳細(xì)演示如何使用 C# 實(shí)現(xiàn) Excel 公式的添加與讀取操作。

準(zhǔn)備工作:引入 Free Spire.XLS
在開(kāi)始編碼之前,我們需要在項(xiàng)目中引入 Free Spire.XLS for .NET。該組件可以通過(guò) NuGet 包管理器輕松安裝,在包控制臺(tái)中執(zhí)行以下命令即可:
Install-Package FreeSpire.XLS
安裝完成后,我們就可以在代碼中通過(guò) using Spire.Xls; 命名空間來(lái)訪問(wèn)所有 Excel 操作相關(guān)的類(lèi)與方法。
一、向 Excel 添加公式
添加公式的場(chǎng)景非常廣泛,例如批量計(jì)算銷(xiāo)售總額、統(tǒng)計(jì)學(xué)生平均分、生成動(dòng)態(tài)報(bào)表等。下面的示例展示了如何創(chuàng)建一個(gè)新的 Excel 工作簿,并在其中寫(xiě)入基礎(chǔ)數(shù)據(jù),然后為指定單元格添加公式。
using Spire.Xls;
Workbook workbook = new Workbook();
Worksheet sheet = workbook.Worksheets[0];
// 添加基礎(chǔ)數(shù)值數(shù)據(jù)
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;
// 添加函數(shù)公式:AVERAGE 平均值
string averageFormula = "=AVERAGE(Sheet1!$A$1:A$6)";
sheet.Range[2, 1].Formula = averageFormula;
// 添加算術(shù)運(yùn)算公式
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();
代碼要點(diǎn)解析:
- 通過(guò)
sheet.Range[行, 列].Formula屬性直接為單元格賦值公式字符串,語(yǔ)法與 Excel 原生公式完全一致。 - 公式中支持絕對(duì)引用(如
$D$2)和相對(duì)引用(如F$2),這與 Excel 中的行為相同。 - 不僅可以添加簡(jiǎn)單的四則運(yùn)算,還可以使用
AVERAGE、SUM、IF等內(nèi)置函數(shù)。
二、從 Excel 讀取已有公式
在實(shí)際業(yè)務(wù)中,我們經(jīng)常需要解析他人制作的 Excel 報(bào)表,提取其中的計(jì)算邏輯以進(jìn)行審計(jì)、遷移或文檔化。以下代碼演示了如何加載一個(gè)現(xiàn)有的 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());
代碼要點(diǎn)解析:
cell.HasFormula屬性是一個(gè)布爾值,用于快速判斷單元格是否包含公式。cell.Formula返回公式的字符串形式,例如=AVERAGE(D2:F2)。- 通過(guò)
AllocatedRange獲取工作表中已使用數(shù)據(jù)的范圍,避免遍歷整個(gè)空白工作表,提升效率。 - 最終將提取出的公式信息寫(xiě)入文本文件,便于后續(xù)分析或存檔。
三、實(shí)戰(zhàn)應(yīng)用場(chǎng)景
掌握公式的添加與讀取后,我們可以構(gòu)建許多實(shí)用的自動(dòng)化工具:
- 報(bào)表生成器 :自動(dòng)向 Excel 模板寫(xiě)入原始數(shù)據(jù),并動(dòng)態(tài)添加
SUM、COUNTIF等統(tǒng)計(jì)公式。 - 公式審核工具 :批量讀取財(cái)務(wù)報(bào)表中的復(fù)雜公式,驗(yàn)證其邏輯是否正確,防止人為錯(cuò)誤。
- 公式遷移助手 :將舊版 Excel 文件中的公式提取出來(lái),批量應(yīng)用到新版模板的對(duì)應(yīng)位置。
- 教學(xué)輔助系統(tǒng) :自動(dòng)批改學(xué)生提交的 Excel 作業(yè),讀取其中的公式判斷解題步驟是否正確。
四、注意事項(xiàng)與建議
- 公式字符串必須以等號(hào)
=開(kāi)頭,否則組件會(huì)將其視為普通文本。 - 公式中引用的單元格范圍必須是有效的,如果引用了不存在的數(shù)據(jù),Excel 打開(kāi)時(shí)可能顯示
#REF!錯(cuò)誤。 - Free Spire.XLS 是免費(fèi)版本,但有一定的頁(yè)數(shù)限制(每個(gè)工作表最多 5 頁(yè))。對(duì)于大多數(shù)中小型項(xiàng)目來(lái)說(shuō)完全夠用。
- 如果需要處理超大文件或消除頁(yè)數(shù)限制,可以考慮升級(jí)到商業(yè)版 Spire.XLS。
五、知識(shí)擴(kuò)展
在 C# 中處理 Excel 公式,市面上有多種成熟的類(lèi)庫(kù)可供選擇。一般來(lái)說(shuō),如果你的應(yīng)用場(chǎng)景是讀取或生成基礎(chǔ)的 Excel 文件,使用 EPPlus 或 ClosedXML 這類(lèi)開(kāi)源庫(kù)就足夠了。如果需要進(jìn)行復(fù)雜的公式計(jì)算、處理大規(guī)模數(shù)據(jù)或需要企業(yè)級(jí)支持,那么 Aspose.Cells 會(huì)是更合適的選擇。
下面是幾種主流方案的對(duì)比,可以幫你快速?zèng)Q定。
| 庫(kù) | 特性 | 限制 | 適用場(chǎng)景 | 安裝方式 (NuGet) |
|---|---|---|---|---|
| EPPlus | 功能豐富,性能優(yōu)秀,社區(qū)活躍 | 5.0版本后商業(yè)使用需授權(quán) | 非商業(yè)、個(gè)人項(xiàng)目;中小規(guī)模商業(yè)項(xiàng)目 | Install-Package EPPlus |
| ClosedXML | 極其易用,API直觀,基于 OpenXML | 處理超大型文件時(shí)性能相對(duì)較弱 | 開(kāi)發(fā)者快速上手,處理中小型文件 | Install-Package ClosedXML |
| NPOI | 免費(fèi)開(kāi)源,支持 .xls (Excel 97-2003) 和 .xlsx 格式 | API相對(duì)老舊,部分高級(jí)功能需手動(dòng)實(shí)現(xiàn) | 需要兼容舊版 Excel 格式 (.xls) | Install-Package NPOI |
| Aspose.Cells | 企業(yè)級(jí)性能,功能最全面,無(wú)需安裝 Excel | 收費(fèi)高昂 | 大規(guī)模、高復(fù)雜度、企業(yè)級(jí)應(yīng)用 | Install-Package Aspose.Cells |
| Microsoft.Office.Interop.Excel | 官方庫(kù),能實(shí)現(xiàn)Excel的所有功能 | 依賴(lài)本地 Excel 組件,性能差,易出錯(cuò) | 僅限在裝有 Excel 的 Windows 客戶端本地使用 | 需在 Visual Studio 中添加 COM 引用 |
除了上述通用的公式操作,使用公式前需要確保單元格所在的行或列已經(jīng)創(chuàng)建,特別是在 NPOI 這類(lèi)庫(kù)中必須嚴(yán)格遵守這個(gè)順序。此外,如果需要數(shù)組公式或跨工作表引用,建議使用 NPOI、Aspose.Cells 或 Syncfusion 等支持更完善的庫(kù),在設(shè)置時(shí)可以借助 CellRangeAddress 等對(duì)象來(lái)處理。
下面我們從主要操作來(lái)演示一下各個(gè)主流庫(kù)的基本用法。
添加公式
// 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"; // 設(shè)置公式
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"; // 設(shè)置公式
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); // 必須先創(chuàng)建行
row.CreateCell(1).SetCellFormula("A1*2"); // 設(shè)置公式
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"; // 設(shè)置公式
workbook.Save("formula.xlsx");讀取公式文本
// EPPlus: 讀取單元格中的公式
string formula = worksheet.Cells["B1"].Formula;
// ClosedXML: 通過(guò) 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;讀取計(jì)算結(jié)果
根據(jù)不同的設(shè)計(jì)目標(biāo),各庫(kù)在讀取計(jì)算結(jié)果時(shí)存在差異。例如,Aspose.Cells 會(huì)自動(dòng)計(jì)算公式值,而 NPOI 則需要顯式調(diào)用計(jì)算引擎。
// EPPlus: 獲取公式計(jì)算結(jié)果
object result = worksheet.Cells["B1"].Value;
// ClosedXML: 獲取公式計(jì)算結(jié)果
object result = worksheet.Cell("B1").Value;
// NPOI: 先通過(guò)公式求值器計(jì)算,再讀取結(jié)果
var evaluator = new XSSFFormulaEvaluator(workbook);
ICell cell = sheet.GetRow(0).GetCell(1);
evaluator.EvaluateInCell(cell);
double result = cell.NumericCellValue; // 讀取計(jì)算結(jié)果
// Aspose.Cells: 計(jì)算結(jié)果自動(dòng)更新,直接讀取
object result = worksheet.Cells["B1"].Value;總結(jié)
- 最佳選擇:日常開(kāi)發(fā)推薦 EPPlus(個(gè)人/非商業(yè))和 ClosedXML(簡(jiǎn)單易用)。復(fù)雜企業(yè)級(jí)應(yīng)用推薦 Aspose.Cells。
- 核心操作:C# 操作 Excel 公式主要有
設(shè)置公式、讀取公式文本和讀取計(jì)算結(jié)果三類(lèi)操作。 - 關(guān)鍵特性:使用 NPOI 時(shí)務(wù)必注意操作順序,且數(shù)組公式需要用
ISheet.SetArrayFormula方法。對(duì)于復(fù)雜公式環(huán)境,謹(jǐn)慎使用依賴(lài)本機(jī)的Microsoft.Office.Interop.Excel組件。 - 實(shí)踐建議:建議在開(kāi)始編碼前,先在Excel里驗(yàn)證公式的正確性,這對(duì)于數(shù)組公式尤其重要。
六、結(jié)語(yǔ)
通過(guò)本文的示例代碼,我們可以清晰地看到,使用 Free Spire.XLS for .NET 在 C# 中操作 Excel 公式是非常直觀且高效的。無(wú)論是向表格中注入復(fù)雜的計(jì)算邏輯,還是反向解析已有的公式結(jié)構(gòu),這個(gè)組件都提供了完善且易用的 API 接口。希望這篇文章能幫助你在實(shí)際項(xiàng)目中更加得心應(yīng)手地處理 Excel 公式相關(guān)的開(kāi)發(fā)任務(wù)。
相關(guān)文章
C#借助Spire.XLS實(shí)現(xiàn)自動(dòng)化生成和操作Excel表格
Excel中的表格不僅僅是簡(jiǎn)單的數(shù)據(jù)區(qū)域,它具備了排序、篩選、格式化等一系列功能,可以大大提升數(shù)據(jù)處理的效率,本文我們就來(lái)簡(jiǎn)單講講如何使用C#實(shí)現(xiàn)在 Excel中高效創(chuàng)建和操作表格吧2025-11-11
C#使用oledb導(dǎo)出數(shù)據(jù)到excel的方法
這篇文章主要介紹了C#使用oledb導(dǎo)出數(shù)據(jù)到excel的方法,結(jié)合實(shí)例形式分析了C#操作oledb導(dǎo)出數(shù)據(jù)的相關(guān)技巧與注意事項(xiàng),需要的朋友可以參考下2016-06-06
C#引用類(lèi)型和值類(lèi)型的介紹與實(shí)例
這篇文章主要介紹了C#引用類(lèi)型和值類(lèi)型,有需要的朋友可以參考一下2013-12-12

