表单级别数据绑定

SpreadJS 支持将数据源绑定到表单级别,实现数据与表格界面的自动关联。该示例演示了如何通过自动生成列或自定义列配置的方式处理列表数据,允许开发者灵活控制列的显示名称、格式、大小及单元格类型等属性。

概述 本 Demo 展示了表单级别数据绑定的两种实现方式。第一个工作表使用默认的自动生成列方式绑定数据,第二个工作表使用自定义列配置方式,可以精确控制每列的显示名称、大小、格式化器和单元格类型等属性。 实现思路 创建产品数据源(Product 对象数组,包含编号、名称、产品线、颜色、价格、成本、重量、停产状态和评级等字段) 第一个工作表使用默认绑定方式,调用 setDataSource 方法自动生成列 第二个工作表使用自定义绑定方式,设置 autoGenerateColumns 为 false,然后使用 bindColumns 方法配置列信息 自定义列配置包括显示名称、列宽、数字格式化和复选框单元格类型 代码解析 生成测试数据 创建包含 9 个字段的产品数据对象,并生成 100 条测试数据。 默认绑定方式 使用默认的自动生成列方式,SpreadJS 会根据数据源的字段自动创建列,列名为字段名,宽度为默认值。 自定义列绑定 通过设置 autoGenerateColumns 为 false 禁用自动生成列,然后使用 bindColumns 方法传入列配置数组。每个列配置对象可以设置: name:数据字段名 displayName:列标题显示名称 size:列宽 formatter:格式化器(如 "0.00" 显示两位小数) cellType:单元格类型(如复选框) 运行效果 第一个工作表「默认绑定」:显示 100 条产品数据,列名为英文字段名,所有列宽度相同 第二个工作表「自定义绑定」:显示相同数据,但列名显示为中文,价格、成本和重量列格式化为两位小数,已停产列显示为复选框 可以通过切换工作表标签对比两种绑定方式的显示效果 API 参考 setDataSource 方法 将数据源绑定到表单,dataSource 可以是对象数组。 autoGenerateColumns 属性 控制是否自动生成列,默认为 true。设置为 false 时需要手动配置列信息。 bindColumns 方法 批量绑定多个列,colInfos 是列配置对象数组。 列配置对象属性 name:数据字段名(必填) displayName:列标题显示名称 size:列宽(像素) formatter:单元格格式化器 cellType:单元格类型 visible:是否显示列
var _lines = ["计算机", "洗衣机", "炉灶"]; var _colors = ["红色", "绿色", "蓝色", "白色"]; var _ratings = ["糟糕", "差", "一般", "好", "很棒", "极棒"]; window.onload = function () { var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), { sheetCount: 2 }); initSpread(spread); }; function Product(id, line, color, name, price, cost, weight, discontinued, rating) { this.id = id; this.line = line; this.color = color; this.name = name; this.price = price; this.cost = cost; this.weight = weight; this.discontinued = discontinued; this.rating = rating; } function getProducts(count) { var dataList = []; for (var i = 1; i <= count; i++) { var line = _lines[parseInt(Math.random() * 3)]; dataList[i - 1] = new Product(i, line, _colors[parseInt(Math.random() * 4)], line + " " + line.charAt(0) + i, parseInt(Math.random() * 5001) / 10.0 + 500, parseInt(Math.random() * 6001) / 10.0, parseInt(Math.random() * 10001) / 100.0, !!(Math.random() > 0.5) === true ? "是" : "否", _ratings[parseInt(Math.random() * 6)]); } return dataList; } function initSpread(spread) { spread.suspendPaint(); spread.options.tabStripRatio = 0.8; var products = getProducts(100); var sheet = spread.getSheet(0); sheet.name("默认绑定"); sheet.setDataSource(products); var sheet2 = spread.getSheet(1); sheet2.name("自定义绑定"); sheet2.autoGenerateColumns = false; sheet2.setDataSource(products); var colInfos = [ { name: "id", displayName: "编号" }, { name: "name", displayName: "名称", size: 100 }, { name: "line", displayName: "产品线", size: 80 }, { name: "color", displayName: "颜色" }, { name: "price", displayName: "价格", formatter: "0.00", size: 80 }, { name: "cost", displayName: "成本", formatter: "0.00", size: 80 }, { name: "weight", displayName: "重量", formatter: "0.00", size: 80 }, { name: "discontinued", displayName: "已停产", cellType: new GC.Spread.Sheets.CellTypes.CheckBox(), size: 100 }, { name: "rating", displayName: "评级" } ]; sheet2.bindColumns(colInfos); 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; }