Sticky Table Headers

Table headers can stay fixed to the column headers if the user is scrolling through a large number of table rows. This makes it easy to view the relevant table header information with the corresponding data. To see this in action, scroll the spreadsheet down. The table header cells will replace the column headers cells when they are out of view from the table.

Description
app.vue
index.html
Copy to CodeMine

The table header will be displayed in the column header when the users scroll the table data and the table header is out of sheet visible area.

The table header will be displayed in the column header when the users scroll the table data and the table header is out of sheet visible area.
<template> <div class="sample-tutorial"> <gc-spread-sheets class="sample-spreadsheets" @workbookInitialized="initSpread"> </gc-spread-sheets> </div> </template> <script setup> import '@mescius/spread-sheets-vue'; import { ref } from "vue"; import GC from "@mescius/spread-sheets"; const initSpread = (spread) => { spread.suspendPaint(); let spreadNS = GC.Spread.Sheets; let sheet = spread.getActiveSheet(); sheet.tables.add("table1", 1, 1, 44, 3, spreadNS.Tables.TableThemes.light1); sheet.setActiveCell(2, 1); sheet.setColumnWidth(1, 120); sheet.setColumnWidth(2, 120); sheet.setColumnWidth(3, 120); sheet.getCell(1, 1).text("First Name"); sheet.getCell(1, 2).text("Last Name"); sheet.getCell(1, 3).text("Score"); for (var i = 2; i < 45; i++) { if (i % 2 === 0) { sheet.getCell(i, 1).text("Alexa"); sheet.getCell(i, 2).text("Wilder"); sheet.getCell(i, 3).text("90"); } else if (i % 3 === 0) { sheet.getCell(i, 1).text("Victor"); sheet.getCell(i, 2).text("Wooten"); sheet.getCell(i, 3).text("70"); } else { sheet.getCell(i, 1).text("Ben"); sheet.getCell(i, 2).text("Smith"); sheet.getCell(i, 3).text("65"); } } spread.resumePaint(); } </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"> <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> 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' }, meta: { '*.css': { loader: 'systemjs-plugin-css' }, '*.vue': { loader: "../plugin-vue/index.js" } } }); })(this);