ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Jspreadsheet 表格公式实战:在 JavaScript 数据表格中引入 Excel 风格公式、第三方公式库与自定义公式函数

Jspreadsheet 表格公式实战:在 JavaScript 数据表格中引入 Excel 风格公式、第三方公式库与自定义公式函数 前端UI组件【免费下载链接】ceJspreadsheet is a lightweight JavaScript data grid component for creating interactive data grids with advanced spreadsheet controls.项目地址https://gitcode.com/gh_mirrors/ce/ce点击查看免费下载Jspreadsheet前身为 Jexcel是一个轻量级 JavaScript 数据表格组件支持在网格单元格中直接书写以开头的 Excel 风格公式。本文基于仓库中 v2 示例文档 展开完整覆盖三类实战用法内置公式计算、借助第三方公式库underscore.string、moment、jstat、numeric、numeral 等扩展统计与日期计算以及自定义 JavaScript 公式函数并结合当前仓库源码internal.js、data.js、package.json深入讲解公式的解析执行、循环保护与依赖链自动更新原理。读完本文你可以直接在自己的页面中实现公式单元格 自动联动 自定义函数的完整电子表格能力。背景Jexcel v2 时代的公式能力本文关联文档属于docs/jspreadsheet/v2/系列对应 Jspreadsheet 的 jQuery 版本CDN 上以jquery.jexcel.js发布版本 2.1.0。在该版本中公式的引入方式非常轻量引入公式解析引擎excel-formula.min.js可选地配合formulas.js扩展库在数据数组的任意单元格写入以开头的表达式字符串表格初始化后自动计算并展示结果单元格数据变化时联动更新。这套以开头即公式的约定一直延续到当前仓库的 v5 实现在 internal.js 中isFormula函数判断一个值是否为公式export const isFormula function (value) { const v ( value)[0]; return v || v # ? true : false; };即单元格值以或#开头即被视为公式参与计算。后续所有示例都遵循这一规则。第一个实战Excel 风格公式以下代码是 原 v2 示例 的第一个完整实现一张设备清单表格包含数量B 列、单价C 列、总价D 列B*C以及是否超过 5000 的判断列E 列IF(...)并在末行使用SUM求和。html script srchttps://cdnjs.cloudflare.com/ajax/libs/numeral.js/2.0.6/numeral.min.js/script script srchttp://cdn.bossanova.uk/js/excel-formula.min.js/script script srchttps://cdnjs.cloudflare.com/ajax/libs/jexcel/2.1.0/js/jquery.jexcel.js/script link relstylesheet hrefhttps://cdnjs.cloudflare.com/ajax/libs/jexcel/2.1.0/css/jquery.jexcel.min.css typetext/css / div idmy/div script let data [ [Furnace,1,10000,B1*C1,IF(C1 5000, true, false)], [Tower,2,6000,B2*C2,IF(C2 5000, true, false)], [Drum,3,5000,B3*C3,IF(C3 5000, true, false)], [Pump,4,4000,B4*C4,IF(C4 5000, true, false)], [Total,SUM(B1:B4),(C1C2C3C4),SUM(D1:D4),] ] $(#my).jexcel({ data:data, columns: [ { type:text }, { type:numeric }, { type:numeric }, { type:numeric }, ], colHeaders: [Equipment,Quantity, Price, Total, 5000?], colWidths: [ 200, 80, 100, 100, 100 ] }); $(#my).jexcel(updateSettings, { table: function (instance, cell, col, row, val, id) { // Format numbers if (col 2 || col 3) { // Get text txt $(cell).text(); // Format text txt numeral(txt).format(0,0.00); // Update cell value $(cell).html( $ txt); } // Bold the total row if ($(cell).text() Total) { $(.r row).css(font-weight, bold); $(.r row).css(background-color, #fffaa3); } } }); /script /html要点拆解公式即数据公式直接写在数据数组的字符串里如B1*C1、IF(C1 5000, true, false)初始化时即被解析。D 列四个单元格分别引用 B、C 列对应行做乘法E 列使用条件函数IF。区间引用第 5 行Total使用了SUM(B1:B4)、(C1C2C3C4)与SUM(D1:D4)。其中(C1C2C3C4)演示了不带函数的纯算术表达式同样可用。列类型声明columns中将第 2、3、4 列声明为numeric用于规范数值列行为colHeaders与colWidths分别设置表头与列宽。格式化与样式联动通过updateSettings的table回调用 numeral.js 将价格列格式化为两位小数0,0.00并加$前缀当单元格文本为Total时将整行加粗并设置浅黄背景色#fffaa3。这是公式计算结果 展示格式化分离的典型做法——公式引擎算的是裸数值呈现层负责美化。公式是如何被解析执行的源码级原理v2 示例依赖外置的excel-formula.min.js引擎而在当前仓库jspreadsheet-ce v5中公式引擎被封装为 npm 依赖jspreadsheet/formula见 package.json解析入口集中在 src/utils/internal.js 的executeFormula。从数据到计算结果的调用链单元格值进入表格后parseValue 会先判断值是否以开头if (( value).substr(0, 1) obj.parent.config.parseFormulas ! false) { value executeFormula.call(obj, value, i, j); }也就是说parseFormulas配置为false时公式不会被计算该配置项同样见于 v3 快速参考 与 v4 快速参考。随后executeFormula完成以下关键步骤循环保护维护一个formulaLoopProtection表若某个单元格在计算链中被再次访问则判定Reference loop detected并返回#ERRORinternal.js。自引用保护解析出表达式中的所有单元格 token如B1若其中包含公式自身所在单元格则判定Self Reference detected并返回#ERRORinternal.js。范围展开将A1:B2这类区间 token 按行列坐标展开成逗号分隔的单元格列表internal.js因此SUM(B1:B4)会被展开为SUM(B1,B2,B3,B4)后交给引擎。类型转换对于被引用的单元格空值转为null可转为数字的值受autoCasting配置约束转为Number否则包装成字符串字面量...internal.js。公式转 JavaScript 并执行调用formula(expression.substr(1), formulaExpressions, x, y, obj)完成计算执行异常时返回#ERROR若debugFormulas为true则在控制台输出诊断信息internal.js。onbeforeformula 事件在正式交给引擎计算之前executeFormula会派发onbeforeformula事件允许开发者拦截或改写表达式internal.jsconst ret dispatch.call(obj, onbeforeformula, obj, expression, x, y); if (ret false) { return expression; } else if (ret) { expression ret; }该事件的签名在 v5 公式文档 中有明确记载onbeforeformula(worksheet, expression, x, y) String返回false表示跳过计算返回字符串则替换原表达式。典型用途包括动态改写公式、记录审计日志、或在计算前做权限校验。公式链与自动联动更新电子表格公式的核心体验是改一个单元格依赖它的所有公式自动重算。这一机制在源码中有完整实现当executeFormula解析表达式时会把当前公式单元格 → 被引用单元格的依赖关系登记到obj.formula[cellId]链表中internal.js。用户通过setValue/setValueFromCoords修改任意单元格时updateCell更新目标值后立即调用updateFormulaChaindata.js、data.js找到所有依赖该单元格的公式并强制重算internal.js。重算过程同样带chainLoopProtection防环保护若发现循环依赖则把相关单元格显示为#ERROR并清空该链internal.js。因此v2 示例中的B1*C1等公式在用户编辑 B1 或 C1 后会自动更新结果这正是公式链机制带来的能力。第二个实战引入第三方公式实现excel-formula.min.js只提供基础函数若要使用更丰富的统计、文本、日期函数可以叠加第三方公式库。原文档给出的第二个示例引入了一组知名的 JavaScript 库并配合formulas.jsbossanova 提供的公式扩展直接用AVERAGE、STDEVA、MAX、COUNT等统计函数html script srchttps://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.0/underscore-min.js/script script srchttps://cdnjs.cloudflare.com/ajax/libs/underscore.string/3.3.4/underscore.string.js/script script srchttps://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment.min.js/script script srchttps://cdnjs.cloudflare.com/ajax/libs/jstat/1.7.1/jstat.min.js/script script srchttps://cdnjs.cloudflare.com/ajax/libs/numeric/1.2.6/numeric.min.js/script script srchttps://cdnjs.cloudflare.com/ajax/libs/numeral.js/2.0.6/numeral.min.js/script script srchttps://bossanova.uk/components/jexcel/dist/js/excel-formula.min.js/script script srchttps://bossanova.uk/components/jexcel/dist/js/formulas.js/script script srchttps://cdnjs.cloudflare.com/ajax/libs/jexcel/2.1.0/js/jquery.jexcel.js/script link relstylesheet hrefhttps://cdnjs.cloudflare.com/ajax/libs/jexcel/2.1.0/css/jquery.jexcel.min.css typetext/css / div idmy1/div script let data1 [ [Furnace, 10, AVERAGE, AVERAGE(B1:B4)], [Tower, 9, STDEVA, STDEVA(B1:B4)], [Drum, 44, MAX, MAX(B1,B2,B3,B4)], [Pump, 12, COUNT, COUNT(B1:B4)], ]; $(#my1).jexcel({ data:data1, colWidths: [ 400, 80, 100, 200 ], }); /script /html几个值得注意的实战细节库的分工underscore与underscore.string提供通用的集合与字符串处理能力moment处理日期时间jstat提供统计学函数标准差、分布等numeric提供数值与矩阵运算numeral负责数字格式化。这些库为formulas.js中的高级公式函数提供底层支撑。函数名大小写示例中的函数名AVERAGE、STDEVA、MAX、COUNT全部大写。v5 官方文档也明确要求所有公式名包括自定义的都应大写以符合安全与标准化要求见 docs/jspreadsheet/docs/formulas.md。三种引用方式并存AVERAGE(B1:B4)与STDEVA(B1:B4)使用区间引用MAX(B1,B2,B3,B4)使用逗号分隔的逐单元格引用两种写法在引擎中都得到支持。关于当前仓库的能力边界jspreadsheet-ce 的 公式文档 说明CE 版本提供 SUM、AVERAGE 及基础算术等公式更完整的 Excel 兼容函数集VLOOKUP、SUMIF、财务函数、跨工作表计算、动态区间A:A等属于 Pro 扩展能力这一点在选择第三方库方案时可以作为参考。第三个实战自定义 JavaScript 公式当内置与第三方函数都不满足需求时可以直接在页面中定义普通 JavaScript 函数公式引擎会自动按函数名调用它们。原文档第三个示例定义了CUSTOM、CONSOLE、CONCAT_COLUMNS、AVG四个自定义函数html script srchttp://cdn.bossanova.uk/js/excel-formula.min.js/script script srchttps://cdnjs.cloudflare.com/ajax/libs/jexcel/2.1.0/js/jquery.jexcel.js/script link relstylesheet hrefhttps://cdnjs.cloudflare.com/ajax/libs/jexcel/2.1.0/css/jquery.jexcel.min.css typetext/css / div idmy2/div script let data2 [ [Furnace,CUSTOM(A1), 10], [Tower,CONSOLE(A2), 9], [Drum,CONCAT_COLUMNS(A1,A3), 3], [Pump,CONSOLE(A4), 7], [Total,, AVG(C1:C4)], ] $(#my2).jexcel({ data:data1, colWidths: [ 400, 200 ], }); function CUSTOM(cell) { return alert: cell; } function CONSOLE(cell) { console.log(cell); return cell; } function CONCAT_COLUMNS(a, b) { return a , b; } function AVG(v) { var sum v.reduce(function(a, b) { return a b; }); var avg sum / v.length; return avg; } /script /html自定义函数的编写要点函数名即公式名页面全局作用域中定义function CUSTOM(cell) {...}表格里写CUSTOM(A1)即可调用。参数可以是单个单元格引用、多个单元格引用如CONCAT_COLUMNS(A1,A3)或区间引用。区间参数以数组传入AVG(C1:C4)中的区间C1:C4会被展开为一个数组因此AVG内部使用v.reduce(...)求和再取平均这正是范围展开机制前述源码第 3 步对外暴露的调用形态。返回值即单元格结果函数返回的字符串或数值直接作为公式结果渲染CONSOLE演示了副作用 原样返回的模式把值打印到控制台再返回。注意示例中的一个易错点该示例jexcel({...})传入的data是data1而非data2属于示例代码的笔误。正确做法是传入data: data2否则自定义公式行不会被渲染。这也是复制示例到生产环境时需要自行修正的地方。自定义公式的实现原理在 v5 源码中同样清晰executeFormula最终把表达式交给jspreadsheet/formula引擎执行引擎在受限的 JavaScript 求值环境中按函数名查找并调用全局函数internal.js。若自定义函数抛出异常结果会统一收敛为#ERROR。公式相关的配置项与安全边界综合 v5 公式文档 与源码实现与公式直接相关的配置、事件、方法整理如下类别名称说明默认值配置parseFormulas是否解析执行开头的公式设为false则公式原样显示不计算internal.jstrue配置secureFormulas公式安全开关开启后将公式内字母统一转为大写小写字符串字面量除外以防范不安全的公式构造internal.js、internal.jstrue配置debugFormulas公式计算抛异常时是否在控制台输出表达式与参数详情internal.jsfalse配置autoCasting引用单元格数值的自动类型转换开关value Number(value)时转数字影响公式运算精度internal.js由实例配置决定事件onbeforeformula公式执行前拦截可返回false跳过或返回新表达式替换internal.js—方法executeFormula(expression, x, y)手动触发一次公式计算internal.js—此外需要注意两个安全细节开头的值会被当公式执行因此从外部URL、接口、用户输入带入表格的字符串若以开头会被当作公式求值。secureFormulas默认开启即为缓解此类注入风险的手段之一。#开头同样被isFormula判为公式internal.js设计表格数据时应避免以#开头存放普通文本。从 v2 到 v5公式能力的演进脉络本文主体来自 v2 时代的 jQuery 插件示例引入jquery.jexcel.js并调用$(#my).jexcel({...})。当前仓库已演进为 jspreadsheet-ce v5见 package.json公式相关的两个关键变化值得了解引擎内化v2 需要在页面手动引入excel-formula.min.jsv5 将公式引擎作为jspreadsheet/formula依赖随包发布package.json开发者无需再关心引擎脚本的引入顺序。多工作表与配置精细化v5 中公式与worksheets结构结合secureFormulas、parseFormulas、debugFormulas、onbeforeformula等配置/事件在 公式官方文档 中成为一等公民跨工作表计算如Sheet2!A1在 CE 中属于 Pro 扩展能力。若你使用的是 v5 API参考 公式用法示例 即可体验同样的数据中写公式、自动计算联动能力script srchttps://bossanova.uk/jspreadsheet/v5/jspreadsheet.js/script script srchttps://jsuites.net/v5/jsuites.js/script link relstylesheet hrefhttps://jsuites.net/v5/jsuites.css typetext/css / link relstylesheet hrefhttps://bossanova.uk/jspreadsheet/v5/jspreadsheet.css typetext/css / div idspreadsheet/div script jspreadsheet(document.getElementById(spreadsheet), { worksheets: [{ data: [ [ Crayons Crayola only (No Rose Art), 2, 5.01, 0.01, B1*C1*(1-D1) ], [ Colored Pencils Crayola only, 2, 4.41, 0.02, B2*C2*(1-D2) ], [ Total, SUM(B1:B8), ROUND(SUM(C1:C8), 2), , SUM(E1:E8) ], ], columns: [ { type: text, title:Product, width:300 }, { type: number, title: Total, width: 100px, format: US #.##0,00 }, ] }] }); /script小结本文以 v2 官方示例为骨架覆盖了 Jspreadsheet 公式能力的完整路径在数据中以开头书写 Excel 风格公式 → 借助第三方库扩展统计/日期/文本函数 → 用普通 JavaScript 函数实现自定义公式。同时通过当前仓库源码可以确认这些能力背后的工程保障executeFormula的循环/自引用保护、范围 token 展开与类型转换internal.js、updateFormulaChain的依赖链自动重算internal.js、secureFormulas的安全兜底internal.js以及parseFormulas、debugFormulas、onbeforeformula等精细化控制开关。进一步阅读可参考v2 示例索引查看更多列类型、事件处理、表格样式等示例v2 快速参考jexcel 方法与初始化参数速查表v5 公式文档当前版本公式配置、事件与方法的官方说明自定义公式文档CE 自定义公式的进阶用法公式核心实现executeFormula、updateFormulaChain、secureFormula等函数源码。赞分享前端UI组件【免费下载链接】ceJspreadsheet is a lightweight JavaScript data grid component for creating interactive data grids with advanced spreadsheet controls.项目地址https://gitcode.com/gh_mirrors/ce/ce点击查看免费下载相关推荐在Doocs/md中自定义LaTeX公式、表格与Mermaid图形的样式在Doocs/md中自定义LaTeX公式、表格与Mermaid图形的样式 背景介绍 Doocs/md是一款强大的Markdown编辑器支持丰富的文档渲染功能。前端富文本AI 应用5 分钟上手的 douyin-downloader抖音视频无水印批量下载实操教程5 分钟上手的 douyin downloader抖音视频无水印批量下载实操教程 douyin downloader 是一款开源免费的抖音批量下载工具支持视网页爬虫CLI飞书表格公式生成与 Excel 迁移权威指南投影语义、ARRAYFORMULA、AI 公式与不兼容函数清单飞书表格公式生成与 Excel 迁移权威指南投影语义、ARRAYFORMULA、AI 公式与不兼容函数清单 本文是 lark sheets Skill 中「飞CLIAI 技能上一篇Kafka-Docker终极安全加固指南认证授权与数据加密配置下一篇彻底解决Redisson解码异常从ClassNotFound到数据错乱的实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表