Excel C# 脚本引擎插件 — 像 VBA 一样在 Excel 中运行脚本,但用 JavaScript 风格语法和现代 C# 引擎。
ExcelScriptLoader 是一个 Excel XLL 插件,让 SereinScript(基于 .NET 的 JS 风格动态脚本语言)能够嵌入 Excel 进程内运行,直接操作工作表、单元格、表格等 Excel 对象。
类似 VBA,但语法更现代,开发体验更好。
| 特性 | 说明 |
|---|---|
| 🚀 现代语法 | JavaScript 风格,支持 lambda、闭包、解构 |
| 📦 随文件保存 | 脚本存储在 xlsx 的 CustomXMLParts 中,无需额外文件 |
| ⚡ 编译执行 | 字节码编译 + VM 执行,非解释执行 |
| 🔧 VS Code 集成 | 可选在 VS Code 中编辑脚本,借助 LSP 获得语法高亮和自动补全 |
| 🪶 轻量 | 基于 Excel-DNA,纯 C# 实现 |
import { excel } from "excel"
// 读取数据
let data = excel.sheet("销售数据").read()
// 数据汇总
let summary = {}
for i in range(1, len(data)) {
let dept = data[i][1]
let amt = data[i][3]
summary[dept] = (summary[dept] ?? 0) + amt
}
// 写入结果
let ws = excel.active.addSheet("汇总")
ws.write("A1", [["部门","合计"]] + ...)
excel.active.save()ExcelScriptLoader.slnx
├── ExcelScriptLoader/ ← Excel-DNA XLL 插件
│ ├── AddIn.cs IExcelAddIn 入口,生命周期管理
│ ├── ExcelModule.cs excel.* 顶层 API(PrototypeExtension)
│ ├── ExcelModule.Workbook.cs 工作簿对象工厂
│ ├── ExcelModule.Worksheet.cs 工作表对象工厂
│ ├── ExcelModule.Cell.cs 单元格对象工厂
│ ├── ExcelModule.Range.cs 区域对象工厂
│ ├── ExcelModule.Table.cs 表格对象工厂
│ ├── ExcelModule.Utilities.cs 值转换 / 读写 / 格式化工具
│ ├── ExcelMacro.cs 宏数据模型 + XML 序列化
│ ├── MacroStorage.cs CustomXMLParts 存储层
│ ├── ScriptEngineAdapter.cs 脚本引擎适配 + Console 重定向
│ ├── RibbonController.cs 自定义 Ribbon 标签页 "脚本宏"
│ ├── ExternalEditor.cs VS Code 外部编辑器集成
│ ├── Dialogs/
│ │ ├── MacroEditorDialog.cs 宏编辑器
│ │ ├── MacroSelectorDialog.cs 宏选择器(运行/编辑/删除)
│ │ └── OutputWindow.cs 脚本输出窗口
│ └── ExcelScriptLoader-AddIn.dna Excel-DNA 清单
│
└── ScriptLang/ ← SereinScript 脚本引擎
├── ScriptEngine.cs 引擎入口 + CreateTaskFromSource()
├── Runtime/ImportResolver.cs 模块解析 + RegisterBuiltinModule()
└── System/*Module.cs Timer/File/Console 等内置模块
| 层 | 技术 |
|---|---|
| 插件宿主 | Excel-DNA 1.9 |
| 运行时 | .NET 10.0-windows |
| 脚本引擎 | SereinScript(AST→字节码→VM) |
| UI | WinForms |
| 宏存储 | CustomXMLParts(随 xlsx 自动保存) |
- 下载
ExcelScriptLoader-AddIn64-packed.xll(Releases) - 打开 Excel → 文件 → 选项 → 加载项
- 管理:Excel 加载项 → 转到 → 浏览
- 选择
.xll文件 → 确定
需要安装 .NET 10 Runtime
- 打开任意 xlsx 工作簿
- 点击 Ribbon 标签页 "脚本宏" → "新建宏"
- 输入宏名称和脚本代码:
import { excel } from "excel"
let cell = excel.cell()
cell.value("Hello, Excel Script!")- 点击 "运行" → 当前单元格显示
Hello, Excel Script! - 点击 "保存" → 宏随工作簿保存
| 按钮 | 功能 |
|---|---|
| 🆕 新建宏 | 打开编辑器创建新宏 |
| ✏️ 编辑宏 | 查看并编辑已有宏 |
| 选择宏并执行 | |
| 🗑️ 删除宏 | 删除选中的宏 |
| 📋 宏列表 | 查看当前工作簿所有宏 |
| 📤 输出 | 打开脚本输出窗口 |
import { excel } from "excel"| API | 说明 |
|---|---|
excel.active |
当前宿主工作簿 |
excel.sheet(name?) |
获取工作表 |
excel.cell() |
当前活动单元格 |
excel.selection() |
当前选中区域 |
excel.open(path) / .create() |
打开 / 新建工作簿 |
excel.read(path) / .write(path, data) |
快捷读 / 写外部文件 |
excel.screenUpdating() / (bool) |
屏幕刷新开关(批量写入时关闭可大幅提速) |
excel.calculation() / (mode) |
计算模式(auto/manual/semiauto) |
excel.calculate() |
强制重算所有工作簿 |
excel.displayAlerts() / (bool) |
弹窗警告开关 |
excel.enableEvents() / (bool) |
事件触发开关 |
excel.active → Workbook
.sheet("数据") → Worksheet
.cell("A1") → Cell
.value("Hello") → 读写值
.formula("=SUM") → 读写公式
.format({...}) → 读写格式
.address() → "$A$1"
.row() / .column() / .hasFormula()
.range("A1:C10") → Range
.values() → 读写值(二维数组)
.formulas() → 读写公式
.find("关键词") → 查找
.offset(1, 2) → 偏移
.sort("B", {order:"desc"}) → 排序
.autoFilter(1, ">100") → 筛选
.merge() / .unmerge() → 合并单元格
.border({style:"thin"}) → 边框
.alignment({horizontal:"center"})
.cut() / .copy("E1") → 剪切/复制
.insert("down") / .delete("up")
.entireRow() / .entireColumn()
.table("用户表") → Table
.rows() → 读取数据行
.add({...}) → 新增行
.addAll([...]) → 批量新增
.insertRow(3) → 插入行
.removeRow(3) → 删除行
.hideRow(5) / .hideColumn(3)
.rowHeight(2) / .rowHeight(2, 30)
.visible() / .visible("hidden")
.activate()
使用 print() 输出日志,结果显示在输出窗口中:
print("开始处理...")
print("共 " + len(data) + " 行")完整 API 文档:docs/ExcelScriptLoader-v1/API_REFERENCE.md
API 命名与风格规范:docs/ExcelScriptLoader-v1/API_STYLE_GUIDE.md
- .NET 10.0 SDK
- Visual Studio 2022+ 或 VS Code + C# Dev Kit
- Microsoft Excel 2019+ (64-bit)
- SereinScript 项目(项目引用)
git clone https://github.com/your-org/ExcelScriptLoader
git clone https://github.com/your-org/SereinScript
# 构建(关闭 Excel 后再执行)
cd ExcelScriptLoader
dotnet build
# 输出: ExcelScriptLoader/bin/Debug/net10.0-windows/publish/ExcelScriptLoader-AddIn64-packed.xll| 文件 | 职责 |
|---|---|
AddIn.cs |
插件入口:AutoOpen/AutoClose、工作簿事件 |
ExcelModule.cs |
excel.* 顶层 API(PrototypeExtension) |
ExcelModule.*.cs (6 个) |
子对象工厂:Workbook/Worksheet/Cell/Range/Table + 工具方法 |
MacroStorage.cs |
宏持久化:CustomXMLParts 读写 |
ScriptEngineAdapter.cs |
引擎适配:编译执行、模块注册、COM 释放 |
RibbonController.cs |
Ribbon UI 回调 |
Dialogs/ |
WinForms 对话框 |
- 顶层
excel.xxx→ 编辑ExcelModule.cs,添加[PrototypeFunction]或[PrototypeProperty] - 子对象 API → 编辑对应的
ExcelModule.Xxx.cs工厂文件,在 Dictionary 中添加F("name", ...)条目 - 遵循 API_STYLE_GUIDE.md 中的命名和代码骨架规范
插件自动检测 VS Code 安装。编辑脚本时点击 "VS Code" 按钮:
- 代码保存为临时
.script文件 - VS Code 打开(LSP 扩展提供语法高亮、补全)
- 关闭标签页后代码自动回填
| 文档 | 说明 |
|---|---|
| API_REFERENCE.md | Excel 脚本 API 完整参考手册 |
| API_STYLE_GUIDE.md | API 命名约定、代码骨架、开发检查清单 |
开发过程中的需求分析、架构设计、任务拆分等文档位于
docs/dev/(已通过.gitignore隐藏),仅供二次开发参考。
QQ 群:955830545 提供技术交流与支持,欢迎加入。
因为个人是社畜,所以可能不会及时回复,请谅解。
本项目基于 MIT 许可证 开源。