Sticky Multiple Header

If you want to include the tablesheet data range row headers in worksheet, you can enable the sticky options when rendering the TableSheet.

Usage The following code shows how to render a TableSheet into worksheet and then show the row headers Sticky Header Features in This Demo multiple header
<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()); var dataRange = registerTableSheetIntoWorksheet(tableSheet, sheet); beautifySheet(sheet, dataRange); spread.undoManager().clear(); }); spread.resumePaint(); } async function initTableSheet(spread, callback) { spread.options.autoFitType = GC.Spread.Sheets.AutoFitType.cellWithHeader; //init a data manager var dataManager = spread.dataManager(); var productAPI = getBaseApiUrl() + "/Product"; var productTable = dataManager.addTable("productTable", { remote: { read: { url: productAPI }, update: { url: productAPI, method: "PUT" }, create: { url: productAPI }, delete: { url: productAPI } } }); //init a table sheet var tableSheet = spread.addSheetTab(0, "MyTableSheet", GC.Spread.Sheets.SheetType.tableSheet); await productTable.fetch(); var myView = productTable.addView("myView", [ { value: "ProductName", caption: "Name", width: 250 }, { value: "SupplierId", caption: ["Foreign Keys", "Supplier Id"], width: 140 }, { value: "CategoryId", caption: ["Foreign Keys", "Category Id"], width: 140 }, { value: "QuantityPerUnit", caption: ["Product Infos", "Quantity Per Unit"], width: 140 }, { value: "UnitPrice", caption: ["Product Infos", "Unit Price"], width: 140 }, { value: "UnitsInStock", caption: ["Product Infos", "Units In Stock"], width: 140 }, { value: "=[@UnitPrice]*[@UnitsInStock]", caption: ["Product Infos", "Total Price"] } ]); tableSheet.setDataView(myView); spread.suspendPaint(); callback && callback(tableSheet); spread.resumePaint(); return tableSheet; } function registerTableSheetIntoWorksheet(tableSheet, sheet) { var name = tableSheet.name() + "_DataRange"; var row = 1; var col = 1; var dataRange = sheet.dataRanges.add(name, tableSheet.name(), new GC.Spread.Sheets.Range(row, col, -1, -1), { sticky: { top: 1 } }); return dataRange; } 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); } sheet.setColumnWidth(1, 30); } 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="$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);