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
styles.css
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> import Vue from 'vue'; import '@mescius/spread-sheets-vue' import GC from '@mescius/spread-sheets'; import './styles.css'; let App = Vue.extend({ name: "app", methods:{ initSpread: function (spread) { this.spread = 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(); }, } }); new Vue({ render: h => h(App) }).$mount('#app'); </script>
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/en/vue/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <!-- SystemJS --> <script src="$DEMOROOT$/en/vue/node_modules/systemjs/dist/system.src.js"></script> <script src="systemjs.config.js"></script> <script> System.import('./src/app.vue'); System.import('$DEMOROOT$/en/lib/vue/license.js'); </script> </head> <body> <div id="app"></div> </body> </html>
.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; }
(function (global) { System.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true }, meta: { '*.css': { loader: 'css' }, '*.vue': { loader: 'vue-loader' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { '@mescius/spread-sheets': 'npm:@mescius/spread-sheets/index.js', '@mescius/spread-sheets-vue': 'npm:@mescius/spread-sheets-vue/index.js', '@grapecity/jsob-test-dependency-package/react-components': 'npm:@grapecity/jsob-test-dependency-package/react-components/index.js', 'jszip': 'npm:jszip/dist/jszip.js', 'css': 'npm:systemjs-plugin-css/css.js', 'vue': 'npm:vue/dist/vue.min.js', 'vue-loader': 'npm:systemjs-vue-browser/index.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' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'js' }, rxjs: { defaultExtension: 'js' }, "node_modules": { defaultExtension: 'js' } } }); })(this);