SpreadCheetah 公式实战:如何快速写入 Excel 公式并转换 R1C1 引用格式
2026/8/25 8:35:57 网站建设 项目流程

SpreadCheetah 公式实战:如何快速写入 Excel 公式并转换 R1C1 引用格式

【免费下载链接】spreadcheetahSpreadCheetah is a high-performance .NET library for generating spreadsheet (Microsoft Excel XLSX) files.项目地址: https://gitcode.com/gh_mirrors/sp/spreadcheetah

SpreadCheetah 是一款高性能的 .NET Excel 表格生成库,本文带你实战用它写入 Excel 公式:从最简单的 A1 公式、公式缓存值,到 R1C1 引用格式自动转换 A1 的完整指南,帮你快速生成带公式的 XLSX 文件。

为什么生成 Excel 需要写公式

用 SpreadCheetah 生成报表时,除了写死数据,你往往还需要:

  • 汇总列:销售额合计、平均值、百分比占比;
  • 可复用的行内公式:每一行都要计算"本行 A 列 × B 列",总不能手改 1000 次引用;
  • 可点击的超链接:报告里的文档地址、系统入口。

SpreadCheetah 用轻量的 Formula 结构体覆盖了这三种场景,其中 R1C1 引用转换是最亮眼的功能 ⚡

如何写入第一个 Excel 公式(A1 格式)

最直接的用法:公式文本不带开头的等号,包进Formula,再放进Cell写入工作表:

var spreadsheet = await Spreadsheet.CreateNewAsync(stream); await spreadsheet.StartWorksheetAsync("Sheet"); var formula = new Formula("SUM(A1:A8)/20"); // 注意:没有开头的 = await spreadsheet.AddRowAsync([new Cell(1), new Cell(2), new Cell(formula)]); await spreadsheet.FinishAsync();

几个要点:

  • 任何 Excel 支持的 A1 公式都能直接写入,SUMIF、跨表引用Sheet1!A1都支持;
  • 公式单元格同样支持样式,例如new Cell(formula, styleId)给汇总结果加粗;
  • 超长公式也没问题,测试中 8192 字符的公式均被正确写入(见 SpreadsheetFormulaRowTests.cs)。

公式缓存值:打开即可见结果

公式写入后,Excel 首次打开时会重新计算。为了让不重算的读取器(如某些解析工具)也能看到值,可以给公式附上缓存值

var formula = new Formula("SUM(A1,A2)"); await spreadsheet.AddRowAsync([new Cell(formula, 30)]); // 30 是缓存值

Cell为公式 + 缓存值提供了 int、double、DateTime 等全套重载(见 Cell.cs),内部由 FormulaCellHelper.cs 把公式与缓存值写成<f>…</f><v>…</v>结构。

R1C1 引用格式:一套公式复用到所有单元格 💡

这是 SpreadCheetah 公式功能中最好用的设计。Excel 有两种引用体系:

引用方式写法含义
A1(XLSX 必需)B3$A$1列名 + 行号
R1C1RC[-1]R1C1行偏移 + 列偏移

R1C1 用相对偏移表达位置,天生适合"同一公式铺到整列"的场景。SpreadCheetah 提供静态工厂方法,写入时自动按单元格位置转换成 XLSX 要求的 A1 格式:

var formula = Formula.R1C1("RC[-1]*RC[-2]"); // 本行左边两列相乘 for (var i = 0; i < 3; i++) await spreadsheet.AddRowAsync([new Cell(1), new Cell(2), new Cell(formula)]);

同一个formula实例写入 3 行后,文件中实际得到的是B1*A1B2*A2B3*A3—— 相对引用自动跟着单元格走,这正是"公式复用"的精髓。

R1C1 转换规则速查表

R1C1 写法写入 C3 单元格的结果说明
R1C1$A$1绝对行 + 绝对列 → 完全锁定
RCC3本行本列(相对引用)
RC[-1]B3同行左移 1 列
R[-1]CC2上移 1 行
R1C1:R3C1$A$1:$A$3单元格范围
R5$5:$5整行引用
C3$C:$C整列引用

大小写不敏感(rc[-1]RC[-1]等价),且转换器很"聪明":

  • 引号内的文本(如"R1C1"、工作表名'My Sheet'!不会被误转换
  • 相对偏移越界(比如第一行引用RC[-1])会抛出SpreadCheetahException,而不是写出坏文件;
  • 完整规则可参考单元测试 R1C1FormulaConverterTests.cs,转换核心实现在 R1C1FormulaConverter.cs。

超链接公式:一行代码生成 HYPERLINK

不需要手写HYPERLINK("..."),直接用静态方法,URI 与友好名称的双引号转义、绝对地址校验都已内置:

await spreadsheet.AddRowAsync([new Cell(Formula.Hyperlink(new Uri("https://example.com/")))]); await spreadsheet.AddRowAsync([new Cell(Formula.Hyperlink(new Uri("https://example.com/"), "文档入口"))]);

注意两个限制:URI 必须是绝对地址且不超过 255 字符,友好名称同样不超过 255 字符(实现见 HyperlinkFormula.cs)。

源码导航:公式模块在哪里

想深入阅读或修改行为,按下面路径找:

  • SpreadCheetah/Formula.cs —— 公式类型定义(A1 / R1C1 / 超链接三个入口)
  • SpreadCheetah/Formulas/R1C1FormulaConverter.cs —— R1C1 → A1 解析转换
  • SpreadCheetah/Formulas/HyperlinkFormula.cs —— HYPERLINK 生成与转义
  • SpreadCheetah/Helpers/FormulaCellHelper.cs —— 公式 + 缓存值的底层写入
  • SpreadCheetah.Test/Tests/R1C1FormulaConverterTests.cs —— 转换规则的全部测试用例

需要本地研究时,可先克隆仓库:

git clone https://link.gitcode.com/i/5f83920748ffcdb94bc53e64322f956e

小结:三句话记住 SpreadCheetah 公式

  1. new Formula("SUM(A1:A8)")写 A1 公式,不要带等号
  2. Formula.R1C1("RC[-1]*RC[-2]")让一个公式自动适配整列单元格,省去手动改引用;
  3. 超链接用Formula.Hyperlink(uri)生成,缓存值用new Cell(formula, cachedValue)补齐。

配合它的流式写入与高速缓冲,SpreadCheetah 能让"带公式的大表"生成依然保持高性能,是 .NET 技术栈里做 Excel 报表的轻量之选 📊

【免费下载链接】spreadcheetahSpreadCheetah is a high-performance .NET library for generating spreadsheet (Microsoft Excel XLSX) files.项目地址: https://gitcode.com/gh_mirrors/sp/spreadcheetah

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询