Jspreadsheet 表格页脚(Table Footer)实战:在底部固定公式与动态汇总

📅 发布时间:2026/10/5 2:03:30
Jspreadsheet 表格页脚(Table Footer)实战:在底部固定公式与动态汇总
前端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点击查看免费下载导读本文聚焦 Jspreadsheetjspreadsheet-ce的表格页脚footer功能如何在数据网格底部固定一行或多行自定义汇总区域并通过footers配置项在初始化时注入文本或公式。文章将以官方示例 footers.md 为主线完整还原其可运行的 HTML 源码同时结合 footer.js、columns.js、history.js 等源码实现深入剖析页脚渲染、自定义公式注册以及列增删移动时页脚同步的底层机制。读完本文你将掌握 Jspreadsheet 页脚的完整配置方法、自定义聚合公式如 SUMCOL的注册方式并能基于源码理解其生命周期行为。页脚是什么固定计算区的核心价值页脚table footer是固定在 Jspreadsheet 表格底部的独立区域通常以tfoot元素呈现。它最常见的用途是在表格底部展示列级汇总例如总计平均值最大值等。与单元格内的普通公式不同页脚公式的特点是位置固定不随数据滚动或排序而移动始终位于表格底部独立渲染由footers配置驱动通过 setFooter 单独渲染支持公式既可以写静态文本如 Total也可以写SUM(B1:B4)这类标准公式还可以调用通过formula.setFormula注册的自定义公式。在 Jspreadsheet 的官方示例中页脚最常见的应用是订单明细 底部合计场景数据区存放商品名、数量、单价与金额页脚固定显示数量合计与金额合计。footers 配置项与初始化示例页脚在 Jspreadsheet 初始化时通过footers配置项注入其形态为二维数组外层数组的每个元素对应页脚中的一行内层数组的每个元素对应该行在每一列上的取值。官方示例v4给出了一个完整可运行的页面html script srchttps://bossanova.uk/jspreadsheet/v4/jspreadsheet.js/script script srchttps://jsuites.net/v5/jsuites.js/script script srchttps://cdn.jsdelivr.net/npm/jspreadsheet/formula/dist/index.min.js/script link relstylesheet hrefhttps://jsuites.net/v5/jsuites.css typetext/css / link relstylesheet hrefhttps://bossanova.uk/jspreadsheet/v4/jspreadsheet.css typetext/css / div idspreadsheet/div script // A custom method to SUM all the cells in the current column let SUMCOL function(columnId) { let instance jspreadsheet.current let total 0; for (let j 0; j instance.options.data.length; j) { if (Number(instance.records[j][columnId].innerHTML)) { total Number(instance.records[j][columnId].innerHTML); } } return total; } formula.setFormula({ SUMCOL }) let table jspreadsheet(document.getElementById(spreadsheet), { data: [ [Cheese, 10, 6.00, B1*C1], [Apples, 5, 4.00, B2*C2], [Carrots, 5, 1.00, B3*C3], [Oranges, 6, 2.00, B4*C4], ], minDimensions: [4,10], columnDrag:true, footers: [[Total,SUMCOL(1),SUMCOL(2),SUMCOL(3)]], columns: [{ width:200px, }] }); /script /html上例中各配置项的作用如下配置项取值说明data4 行 × 4 列的二维数组商品名、数量、单价与金额D 列为B1*C1这类行内公式minDimensions[4, 10]网格最小尺寸为 4 列 × 10 行保证页脚下方留有空白行columnDragtrue允许拖拽列验证列移动后页脚同步见后文footers[[Total,SUMCOL(1),SUMCOL(2),SUMCOL(3)]]一行页脚第 0 列显示文本 Total第 1~3 列分别对 B、C、D 列求和columns[0].width200px列宽设置其中SUMCOL(1)的入参是列索引从 0 开始SUMCOL(1)对第 1 列B 列数量求和SUMCOL(2)对第 2 列C 列单价求和SUMCOL(3)对第 3 列D 列金额求和——D 列本身是公式列其单元格内的计算结果会被Number()转换后累加从而实现对公式列再求和的级联汇总。自定义公式注册formula.setFormula 与 SUMCOL 拆解页脚公式并不局限于内置的SUM、AVERAGE等Jspreadsheet 的公式引擎jspreadsheet/formula仓库源码在 internal.js 中直接import formula from jspreadsheet/formula引入允许通过formula.setFormula注册自定义函数示例中的SUMCOL即为一例。SUMCOL的实现要点let SUMCOL function(columnId) { let instance jspreadsheet.current // 当前活动实例 let total 0; for (let j 0; j instance.options.data.length; j) { if (Number(instance.records[j][columnId].innerHTML)) { total Number(instance.records[j][columnId].innerHTML); } } return total; } formula.setFormula({ SUMCOL })jspreadsheet.current用于获取当前活动的工作表实例多工作表场景下指向最近操作的实例instance.records保存了每个可见单元格的 DOM 元素records[j][columnId].innerHTML读取第 j 行第 columnId 列的渲染后文本再经Number()转数值if (Number(...))过滤掉非数值单元格避免把文本或空值累加进去注册后即可在页脚以及数据区任意单元格中以SUMCOL(1)形式调用。这种遍历可见单元格求和的实现方式与内置SUM(B1:B4)的引用区间写法互为补充SUM适合固定行区间的普通列SUMCOL适合按列整体汇总且无需关心行号的场景。源码级原理setFooter 的渲染流程页脚的渲染核心位于 footer.js 的setFooter函数。当初始化配置或运行时更新footers后Jspreadsheet 按以下流程渲染建立tfoot容器若实例尚无tfoot节点则document.createElement(tfoot)并追加到obj.table末尾footer.js逐行逐列写入单元格外层循环遍历footers的每一行内层循环遍历obj.headers.length个列如果某位置未配置取值会自动补为空字符串footer.js文本对齐继承列设置新建的页脚单元格取columns[i].align || defaultColAlign || center作为textAlignfooter.js因此页脚文本默认与数据列对齐策略保持一致公式求值单元格内容通过parseValue.call(obj, ...)解析——parseValue定义于 internal.js它负责将SUMCOL(1)这类表达式交给公式引擎计算并把结果写入td.textContentfooter.js隐藏列联动td.style.display obj.cols[i].colElement.style.display让页脚单元格跟随hideColumn()/showColumn()同步显隐footer.js。setFooter的触发点覆盖了数据变更的主要路径数据或尺寸变化后的整体刷新updateTable在渲染末尾调用setFooter.call(obj)internal.js列显隐操作后重建页脚hideColumn/showColumn末尾均调用setFootercolumns.js。动态场景列增删、移动与撤销重做时的页脚同步页脚并不是静态文本Jspreadsheet 在结构变更时会对footers数组做同步维护确保页脚始终与列一一对应插入列insertColumn会为每一行页脚在该位置插入空字符串占位保证新列对应一个可编辑的页脚单元格columns.js移动列moveColumn同步对页脚数组做同样的splice位移实现列拖到哪、页脚跟着走这也正是示例中开启columnDrag:true的意义所在columns.js删除列deleteColumn从每行页脚中splice掉对应列的取值并记录到历史记录中columns.js撤销 / 重做undo/redo在处理列结构历史时会分别从footers数组删除或回填对应片段history.js、history.js保证撤销/重做后页脚与列结构一致。因此合计列这类页脚在用户拖拽列、插入列或撤销操作后依然能指向正确的列不会出现错位。从已有 HTML 表格生成页脚除了在 JS 配置中手写footersJspreadsheet 还支持从现成的 HTMLtable初始化时自动提取页脚。在 helpers.js 的表格解析逻辑中el.querySelectorAll(tfoot tr)会抓取源表格tfoot中每一行的单元格文本组装为二维数组写入options.footers。这意味着你可以先写一个带tfoot的静态 HTML 表格再交给 Jspreadsheet 渲染页脚内容会被原样保留。测试验证footers 的预期行为仓库测试 footer.js 明确验证了页脚的渲染行为初始化一个带footers: [[a,b,c], [1,2,3]]的双行页脚工作表后断言tfoot首行子节点索引 1 起因为索引 0 是行首单元格的innerHTML分别为a、b、c第二行分别为1、2、3。这从测试层面确认了页脚渲染在tfoot元素中每行页脚的首个td会被跳过作为行首分隔数值型页脚内容会以文本形式写入单元格。这一从第 1 个单元格索引 1开始渲染的行为与 footer.js 中children[i 1]的索引偏移逻辑完全对应。最佳实践与注意事项区分内置公式与自定义公式对固定行区间的简单汇总直接用SUM(B1:B4)需要对整列求和或对公式列求和时再自定义SUMCOL这类函数并通过formula.setFormula注册页脚取值支持多行footers是二维数组可配置多行页脚如合计行 平均行每行独立渲染空值自动补齐某列未配置页脚取值时会渲染为空不必刻意补齐占位符列操作联动由于插入、删除、移动列时页脚数组会被同步维护建议在页脚中使用列索引对应的公式时保持列顺序稳定或在拖拽后通过运行时 API 重新计算对齐一致性页脚默认继承列的对齐设置未设置时居中如需统一样式可在columns中配置align运行时可更新页脚支持在初始化后通过实例 API 动态修改相关用法可参考 程序化更新示例 与 列拖拽示例v5 版本还支持直接使用SUM(B1:B4)区间引用语法见 新版页脚文档。小结Jspreadsheet 的表格页脚机制以footers二维数组为配置入口以tfootsetFooter为渲染骨架以jspreadsheet/formula公式引擎为求值核心并在列增删、移动、显隐、撤销重做等全部结构变更路径中保持同步。官方示例中的SUMCOL自定义公式展示了对整列可见单元格求和的典型模式是构建订单合计、报表汇总等场景的实用方案。结合 footer.js、columns.js、history.js 与 footer.js 测试你可以完全掌控页脚的渲染时机与数据流并在此基础上扩展出自己的聚合逻辑。赞分享前端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点击查看免费下载相关推荐Cerbero-7b与其他意大利语模型对比Camoscio、Fauno全面评测 Cerbero 7b与其他意大利语模型对比Camoscio、Fauno全面评测 在意大利语人工智能领域 Cerbero 7b 作为首个完全开源免费的意Jspreadsheet 表格公式实战在 JavaScript 数据表格中引入 Excel 风格公式、第三方公式库与自定义公式函数Jspreadsheet 表格公式实战在 JavaScript 数据表格中引入 Excel 风格公式、第三方公式库与自定义公式函数 Jspreadsheet前端UI组件Jspreadsheet 固定表头与滚动表格实战tableOverflow 配置全解析Jspreadsheet 固定表头与滚动表格实战tableOverflow 配置全解析 Jspreadsheetv2 时代以 jexcel 插件形式发布是前端UI组件上一篇League Akari深度解析开源游戏辅助工具如何突破传统技术瓶颈下一篇Inno Setup中文界面终极指南让你的安装程序说中文创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考