概述
本 Demo 展示了如何使用 SpreadJS 的表格功能,从数据源创建表格并设置表格属性。Demo 中创建了一个课程成绩表,包含表头、数据和汇总页脚,展示了表格的基本用法。
实现思路
准备数据源(包含课程信息的对象数组)
使用 addFromDataSource 方法从数据源创建表格,并指定表格主题样式
设置表格显示选项:显示表头、显示页脚、高亮首列
为学分和成绩列设置汇总公式(使用 SUBTOTAL 函数)
在页脚第一列设置"总计"文本
设置各列宽度以适应内容
使用 suspendPaint 和 resumePaint 优化性能
代码解析
从数据源创建表格
这段代码定义了课程数据数组,使用 addFromDataSource 方法创建表格。方法参数依次为:表格名称、起始行、起始列、数据源、表格主题。SpreadJS 会自动根据数据源的字段名生成表头。
设置表格属性
这些方法控制表格的显示样式:
showFooter(true) 显示页脚行
showHeader(true) 显示表头行
highlightFirstColumn(true) 高亮显示第一列
highlightLastColumn(false) 不高亮显示最后一列
设置汇总公式和页脚值
setColumnFormula 方法为指定列的页脚设置公式。这里使用 SUBTOTAL 函数计算学分和成绩的总和。参数 109 表示求和(忽略隐藏值)。使用结构化引用 [学分] 和 [成绩] 引用表格列。setColumnValue 方法设置页脚单元格的文本值。
性能优化
在进行大量操作时,使用 suspendPaint 暂停绘制,完成所有设置后调用 resumePaint 一次性渲染,可以显著提升性能。
运行效果
表格自动从数据源生成,包含课程、学期、学分、成绩、教师五列
表头自动显示字段名称
第一列(课程)以高亮样式显示
页脚行显示"总计",并在学分和成绩列显示汇总结果
各列宽度已调整以适应内容
API 参考
addFromDataSource 方法
name:表格名称
row、column:表格起始位置
dataSource:数据源,可以是对象数组或数据管理器表
style:可选,表格主题样式
options:可选,扩展选项
showFooter 方法
value:布尔值,是否显示页脚
isFooterInserted:可选,是否自动插入页脚行
setColumnFormula 方法
tableColumnIndex:表格列索引(从 0 开始)
formula:页脚公式,支持结构化引用(如 [列名])
setColumnValue 方法
tableColumnIndex:表格列索引
value:页脚单元格的值
window.onload = function () {
var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"));
initSpread(spread);
};
function initSpread(spread) {
var spreadNS = GC.Spread.Sheets;
var sheet = spread.getSheet(0);
var source = [
{ 课程: "微积分", 学期: 1, 学分: 5, 成绩: 80, 教师: "南希·费哈费尔" },
{ 课程: "体育", 学期: 1, 学分: 3.5, 成绩: 85, 教师: "安德鲁·森奇尼" },
{ 课程: "政治经济学", 学期: 1, 学分: 3.5, 成绩: 95, 教师: "扬·科塔斯" },
{ 课程: "计算机基础", 学期: 1, 学分: 2, 成绩: 85, 教师: "史蒂文·索普" },
{ 课程: "微观经济学", 学期: 1, 学分: 4, 成绩: 62, 教师: "扬·科塔斯" },
{ 课程: "线性代数", 学期: 2, 学分: 5, 成绩: 73, 教师: "南希·费哈费尔" },
{ 课程: "会计学", 学期: 2, 学分: 3.5, 成绩: 86, 教师: "南希·费哈费尔" },
{ 课程: "统计学", 学期: 2, 学分: 5, 成绩: 85, 教师: "罗伯特·扎雷" },
{ 课程: "市场营销学", 学期: 2, 学分: 4, 成绩: 70, 教师: "劳拉·朱萨尼" }
];
spread.suspendPaint();
var table = sheet.tables.addFromDataSource("Table1", 2, 1, source, spreadNS.Tables.TableThemes.medium7);
table.showFooter(true);
table.showHeader(true);
table.highlightFirstColumn(true);
table.highlightLastColumn(false);
table.setColumnFormula(2, "=SUBTOTAL(109,[学分])");
table.setColumnFormula(3, "=SUBTOTAL(109,[成绩])");
table.setColumnValue(0, "总计");
sheet.setColumnWidth(0, 20);
sheet.setColumnWidth(1, 130);
sheet.setColumnWidth(2, 70);
sheet.setColumnWidth(3, 70);
sheet.setColumnWidth(4, 70);
sheet.setColumnWidth(5, 100);
spread.resumePaint();
}
<!doctype html>
<html style="height:100%;font-size:14px;">
<head>
<meta name="spreadjs culture" content="zh-cn" />
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" type="text/css"
href="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets/styles/gc.spread.sheets.excel2013white.css">
<script src="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets/dist/gc.spread.sheets.all.min.js"
type="text/javascript"></script>
<script
src="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets-resources-zh/dist/gc.spread.sheets.resources.zh.min.js"
type="text/javascript"></script>
<script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script>
<script src="app.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
<div class="sample-tutorial">
<div id="ss" style="width:100%; height: 100%"></div>
</div>
</body>
</html>
.sample-tutorial {
position: relative;
height: 100%;
overflow: hidden;
}
body {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}