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 公式都能直接写入,
SUM、IF、跨表引用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 | 列名 + 行号 |
| R1C1 | RC[-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*A1、B2*A2、B3*A3—— 相对引用自动跟着单元格走,这正是"公式复用"的精髓。
R1C1 转换规则速查表
| R1C1 写法 | 写入 C3 单元格的结果 | 说明 |
|---|---|---|
R1C1 | $A$1 | 绝对行 + 绝对列 → 完全锁定 |
RC | C3 | 本行本列(相对引用) |
RC[-1] | B3 | 同行左移 1 列 |
R[-1]C | C2 | 上移 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 公式
new Formula("SUM(A1:A8)")写 A1 公式,不要带等号;Formula.R1C1("RC[-1]*RC[-2]")让一个公式自动适配整列单元格,省去手动改引用;- 超链接用
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),仅供参考