Overview

A TableSheet can be rendered in a Worksheet as a Data Range.

This data range contains the same instance of the TableSheet, meaning they share the same state.

This data range will also inherit most of the tablesheet features.

Usage The below code renders a TableSheet in a worksheet. Features in This Demo basic rendering values read and write remote CRUD styles conditional formats row actions relationship lookup column calculation column context menu selections filter sort
<template> <div class="sample-tutorial"> <gc-spread-sheets class="sample-spreadsheets" @workbookInitialized="initSpread"> </gc-spread-sheets> </div> </template> <script setup> import GC from "@mescius/spread-sheets"; import { ref, toRaw } from "vue"; import '@mescius/spread-sheets-shapes'; import '@mescius/spread-sheets-datacharts-addon'; import "@mescius/spread-sheets-tablesheet"; const spreadRef = ref(null); function initSpread(spread) { spread.suspendPaint(); var sheet = spread.getActiveSheet(); initTableSheet(spread, function (tableSheet) { spread.setActiveSheet(sheet.name()); setDashboard(sheet); var dataRange = registerTableSheetIntoWorksheet(tableSheet, sheet); beautifySheet(sheet, dataRange); addDataCharts(sheet); spread.undoManager().clear(); }); spread.resumePaint(); } function setDashboard(sheet) { sheet.getCell(1, 1) .value("Product Dashboard") .font("20px Calibri") .fontWeight("bold"); sheet.setRowHeight(1, 30); sheet.addSpan(1, 1, 1, 9); sheet.addSpan(16, 1, 1, 9); } async function initTableSheet(spread, callback) { spread.options.autoFitType = GC.Spread.Sheets.AutoFitType.cellWithHeader; //init a data manager var dataManager = spread.dataManager(); var categoryAPI = getBaseApiUrl() + "/Category"; var categoryTable = dataManager.addTable("categoryTable", { remote: { read: { url: categoryAPI } } }); var supplierAPI = getBaseApiUrl() + "/Supplier"; var supplierTable = dataManager.addTable("supplierTable", { remote: { read: { url: supplierAPI } } }); var productAPI = getBaseApiUrl() + "/Product"; var productTable = dataManager.addTable("productTable", { autoSync: true, remote: { read: { url: productAPI }, update: { url: productAPI, method: "PUT" }, create: { url: productAPI }, delete: { url: productAPI } }, schema: { columns: { CategoryId: { lookup: { name: "category", columns: [ { value: "Id", width: 100 }, { value: "CategoryName", width: 160 }, { value: "Description", width: 400 } ] } }, SupplierId: { lookup: { name: "supplier", columns: [ { value: "Id", width: 100 }, { value: "CompanyName", width: 180 }, { value: "ContactName", width: 140 }, { value: "ContactTitle", width: 140 }, { value: "ContactTitle", width: 140 }, { value: "City", width: 100 }, { value: "Address", width: 140 }, { value: "Phone", width: 100 } ] } }, TotalPrice: { caption: "Total Price", dataType: "formula", value: "=[@UnitPrice]*[@UnitsInStock]" } } } }); dataManager.addRelationship(productTable, "CategoryId", "category", categoryTable, "Id", "product"); dataManager.addRelationship(productTable, "SupplierId", "supplier", supplierTable, "Id", "product"); //init a table sheet var tableSheet = spread.addSheetTab(0, "MyTableSheet", GC.Spread.Sheets.SheetType.tableSheet); tableSheet.applyTableTheme(GC.Spread.Sheets.Tables.TableThemes.professional15); tableSheet.rowActionOptions([]); //bind a view to the table sheet await categoryTable.fetch(); await supplierTable.fetch(); await productTable.fetch(); var nameStyle = { fontWeight: "bold" }; var relationStyle = { foreColor: "#818181" }; var formulaRule = { ruleType: "formulaRule", formula: "@>1000", style: { foreColor: "orange" } }; var myView = productTable.addView("myView", [ { value: "ProductName", caption: "Name", width: 250, style: nameStyle }, { value: "QuantityPerUnit", caption: "Quantity Per Unit", width: 140 }, { value: "SupplierId", caption: "Supplier Id", width: 140 }, { value: "supplier.CompanyName", caption: "Supplier Company", width: 200, style: relationStyle, headerStyle: relationStyle }, { value: "CategoryId", caption: "Category Id", width: 140 }, { value: "category.CategoryName", caption: "Category Name", width: 140, style: relationStyle, headerStyle: relationStyle }, { value: "UnitPrice", caption: "Unit Price", width: 140 }, { value: "UnitsInStock", caption: "Units In Stock", width: 140 }, { value: "TotalPrice", caption: "Total Price", conditionalFormats: [formulaRule] } ]); tableSheet.setDataView(myView); spread.suspendPaint(); callback && callback(tableSheet); spread.resumePaint(); return tableSheet; } function registerTableSheetIntoWorksheet(tableSheet, sheet) { var name = tableSheet.name() + "_DataRange"; var row = 17; var col = 1; var dataRange = sheet.dataRanges.add(name, tableSheet.name(), new GC.Spread.Sheets.Range(row, col, -1, -1)); return dataRange; } function addDataCharts(sheet) { var columnChart = sheet.dataCharts.add("columnChart", 62, 50, 694, 281, GC.Spread.Sheets.DataCharts.DataChartType.column); columnChart.setChartConfig(columnChartConfig); var pieChart = sheet.dataCharts.add("pieChart", 762, 50, 360, 281, GC.Spread.Sheets.DataCharts.DataChartType.pie); pieChart.setChartConfig(pieChartConfig); } function beautifySheet(sheet, dataRange) { var range = dataRange.range(); for (var i = range.row; i < range.row + range.rowCount; i++) { sheet.autoFitRow(i); } for (var i = range.col; i < range.col + range.colCount; i++) { sheet.autoFitColumn(i); } } function getBaseApiUrl() { return window.location.href.match(/http.+spreadjs\/demos\//)[0] + 'server/api'; } </script> <style scoped> #app { height: 100%; } .sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: 100%; height: 100%; overflow: hidden; float: left; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } </style>
<!DOCTYPE html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <title>SpreadJS VUE</title> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/en/vue3/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/spread/source/splitView/splitView.css"> <script src="$DEMOROOT$/en/vue3/node_modules/systemjs/dist/system.src.js"></script> <script src="./systemjs.config.js"></script> <script src="./compiler.js" type="module"></script> <script src="../columnChartConfig.js" type="text/javascript"></script> <script src="../pieChartConfig.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/splitView/SplitView.js"></script> <script> var System = SystemJS; System.import("./src/app.js"); System.import('$DEMOROOT$/en/lib/vue3/license.js'); </script> </head> <body> <div id="app"></div> </body> </html>
(function (global) { SystemJS.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, packageConfigPaths: [ './node_modules/*/package.json', "./node_modules/@mescius/*/package.json", "./node_modules/@babel/*/package.json", "./node_modules/@vue/*/package.json" ], map: { 'vue': "npm:vue/dist/vue.esm-browser.js", 'tiny-emitter': 'npm:tiny-emitter/index.js', 'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js', "systemjs-babel-build": "npm:systemjs-plugin-babel/systemjs-babel-browser.js", '@mescius/spread-sheets': 'npm:@mescius/spread-sheets/index.js', '@mescius/spread-sheets-vue': 'npm:@mescius/spread-sheets-vue/index.js', '@mescius/spread-sheets-shapes': 'npm:@mescius/spread-sheets-shapes/index.js', '@mescius/spread-sheets-datacharts-addon': 'npm:@mescius/spread-sheets-datacharts-addon/index.js', '@mescius/spread-sheets-tablesheet': 'npm:@mescius/spread-sheets-tablesheet/index.js', }, meta: { '*.css': { loader: 'systemjs-plugin-css' }, '*.vue': { loader: "../plugin-vue/index.js" } } }); })(this);