Border and Gridlines

Spread allows you to set borders and diagonal border line for cells. You can show or hide the sheet gridlines.

Spread provides several types of line styles to help you customize the sheet's border line and grid lines, such as thin, dotted, double, and so on. For example, the following lines change the left and right border lines of the indicated range to the dotted line style. Spread provides two kinds of diagonal border line. The diagonal border line includes diagonal down and diagonal up. diagonalDown diagonalUp For example,The following set the diagonal border line for cells You can add or remove gridlines or set the color with the following code: You can set the option SheetAreaOffset to move the whole sheet rendering area have some offset from the host left/top point.There will be enough space to show all things (just like left/top border and left/top selection) perfectly. The sheetAreaOffset default value is {left:0,top:0}.
<template> <div class="sample-tutorial"> <gc-spread-sheets class="sample-spreadsheets" @workbookInitialized="initSpread"> <gc-worksheet> </gc-worksheet> </gc-spread-sheets> <div class="options-container" v-if="isGridLinePanel"> <div class="options-row"> <input type="checkbox" id="showGridLineCheckBox" v-model="showGridLine" /> <label for="showGridLineCheckBox">ShowGridLine</label> </div> </div> <div class="options-container" v-if="!isGridLinePanel"> <div class="options-row"> <input type="checkbox" id="headerVisible" v-model="headerVisible" /> <label for="headerVisible">HeaderVisible</label> </div> <div class="options-row"> <label for="left">left:</label> <input type="number" id="left" v-model="left" /> </div> <div class="options-row"> <label for="top">top:</label> <input type="number" id="top" v-model="top" /> </div> <div class="options-row"> <input type="button" value="Set Sheet Area Offset" @click="setOffset()" /> </div> </div> </div> </template> <script setup> import { ref, watch } from "vue"; import "@mescius/spread-sheets-vue"; import GC from '@mescius/spread-sheets'; let spreadNS = GC.Spread.Sheets; const spreadRef = ref(null); const showGridLine = ref(false); const headerVisible = ref(false); const left = ref("2"); const top = ref("2"); const isGridLinePanel = ref(true); watch(showGridLine, (value) => { let sheet = spreadRef.value.getActiveSheet(); sheet.suspendPaint(); sheet.options.gridline.showHorizontalGridline = value; sheet.options.gridline.showVerticalGridline = value; sheet.resumePaint(); }); watch(headerVisible, (value) => { let sheet = spreadRef.value.getActiveSheet(); sheet.options.rowHeaderVisible = value; sheet.options.colHeaderVisible = value; }); let initSpread = function (spread) { spreadRef.value = spread; spread.addSheet(1); initSheetBorderAndGridLine(); initSheetAreaSheet(); let gridlineSheet = spread.getSheet(0); showGridLine.value = gridlineSheet.options.gridline.showHorizontalGridline && gridlineSheet.options.gridline.showVerticalGridline; spread.bind(GC.Spread.Sheets.Events.ActiveSheetChanged, function (e, args) { let isGridLinePanelValue; if (args.newSheet === gridlineSheet) { isGridLinePanelValue = true; } else { isGridLinePanelValue = false; } isGridLinePanel.value = isGridLinePanelValue; }); } function initSheetBorderAndGridLine() { let spread = spreadRef.value; let sheet = spread.getSheet(0); sheet.suspendPaint(); sheet.options.gridline.showHorizontalGridline = false; sheet.options.gridline.showVerticalGridline = false; let lineBorder1 = new spreadNS.LineBorder('blue', spreadNS.LineStyle.thin); let range = sheet.getRange(7, 1, 2, 2); range.setBorder(lineBorder1, { outline: true }); range.borderLeft(new spreadNS.LineBorder('red', spreadNS.LineStyle.double)); range = sheet.getRange(7, 4, 2, 2); range.setBorder(lineBorder1, { outline: true }); range.borderTop(new spreadNS.LineBorder('green', spreadNS.LineStyle.medium)); range = sheet.getRange(7, 7, 2, 2); range.setBorder(lineBorder1, { outline: true }); range.borderRight(new spreadNS.LineBorder('black', spreadNS.LineStyle.dashed)); range = sheet.getRange(7, 10, 2, 2); range.setBorder(lineBorder1, { outline: true }); range.borderBottom(new spreadNS.LineBorder('purple', spreadNS.LineStyle.dotted)); range = sheet.getRange(11, 1, 2, 2); range.setBorder(new spreadNS.LineBorder('orange', spreadNS.LineStyle.thick), { all: true }); range.diagonalUp(new spreadNS.LineBorder('orange', spreadNS.LineStyle.thin)); range = sheet.getRange(11, 4, 2, 2); range.setBorder(new spreadNS.LineBorder('orange', spreadNS.LineStyle.hair), { all: true }); range.diagonalDown(new spreadNS.LineBorder('purple', spreadNS.LineStyle.dotted)); range = sheet.getRange(11, 7, 2, 2); range.setBorder(new spreadNS.LineBorder('orange', spreadNS.LineStyle.mediumDashed), { all: true }); range.diagonalUp(new spreadNS.LineBorder('plum', spreadNS.LineStyle.double)); range.diagonalDown(new spreadNS.LineBorder('brown', spreadNS.LineStyle.thick)); range = sheet.getRange(11, 10, 2, 2); range.setBorder(new spreadNS.LineBorder('orange', spreadNS.LineStyle.dashDot), { all: true }); range = sheet.getRange(17, 1, 2, 5); range.setBorder(lineBorder1, { outline: true }); range = sheet.getRange(17, 1, 2, 2); range.setBorder(new spreadNS.LineBorder('brown', spreadNS.LineStyle.slantedDashDot), { inside: true }); range = sheet.getRange(17, 4, 2, 2); range.setBorder(new spreadNS.LineBorder('brown', spreadNS.LineStyle.mediumDashed), { inside: true }); range = sheet.getRange(16, 7, 7, 4); range.setBorder(new spreadNS.LineBorder('plum', spreadNS.LineStyle.thick), { left: true, bottom: true }); range = sheet.getRange(15, 8, 7, 4); range.setBorder(new spreadNS.LineBorder('royalblue', spreadNS.LineStyle.slantedDashDot), { top: true, right: true }); range = sheet.getRange(16, 8, 6, 3); range.setBorder(new spreadNS.LineBorder('tomato', spreadNS.LineStyle.dashDot), { left: true, bottom: true }); range = sheet.getRange(16, 8, 6, 3); range.setBorder(new spreadNS.LineBorder('palegreen', spreadNS.LineStyle.mediumDashed), { top: true, right: true }); range = sheet.getRange(16, 9, 5, 2); range.setBorder(new spreadNS.LineBorder('violet', spreadNS.LineStyle.dotted), { left: true, bottom: true }); range = sheet.getRange(17, 8, 5, 2); range.setBorder(new spreadNS.LineBorder('skyblue', spreadNS.LineStyle.hair), { top: true, right: true }); sheet.addSpan(17, 9, 2, 1); range = sheet.getRange(17, 9, 2, 1); range.setBorder(new spreadNS.LineBorder('purple', spreadNS.LineStyle.thin), { all: true }); sheet.setArray(1, 3, [ ['Gender', 'Phone Number', 'Address'], ['woman', '021-432668', 'Chester Road'], ['man', '021-432238', 'Gertt Road'], ['man', '021-432533', 'Jnyliner Road'], ['man', '021-432125', 'Approach Road'] ]); let style = new GC.Spread.Sheets.Style(); style.wordWrap = true; style.vAlign = GC.Spread.Sheets.VerticalAlign.center; sheet.setStyle(1, 2, style, 3); sheet.setText(1, 2, ' Info Name', spreadNS.SheetArea.viewport); let cell = sheet.getCell(1, 2); cell.diagonalDown(new spreadNS.LineBorder('purple', spreadNS.LineStyle.dotted)); sheet.setStyle(1, 3, style, GC.Spread.Sheets.SheetArea.viewport); sheet.setStyle(1, 4, style, GC.Spread.Sheets.SheetArea.viewport); sheet.setStyle(1, 5, style, GC.Spread.Sheets.SheetArea.viewport); sheet.setText(2, 2, 'John', spreadNS.SheetArea.viewport); sheet.setText(3, 2, 'linda', spreadNS.SheetArea.viewport); sheet.setText(4, 2, 'henry', spreadNS.SheetArea.viewport); sheet.setText(5, 2, 'smith', spreadNS.SheetArea.viewport); sheet.setRowHeight(1, 30); sheet.setColumnWidth(4, 120); sheet.setColumnWidth(5, 120); range = sheet.getRange(1, 2, 5, 4); range.setBorder(new spreadNS.LineBorder('black', spreadNS.LineStyle.thin), { all: true }); sheet.resumePaint(); } function initSheetAreaSheet() { let sheet = spreadRef.value.getSheet(1); sheet.suspendPaint(); sheet.name('SheetAreaOffset'); let data = sheetAreaJSON; sheet.fromJSON(data); sheet.options.colHeaderVisible = false; sheet.options.rowHeaderVisible = false; sheet.options.sheetAreaOffset = { left: 2, top: 2 }; let range = sheet.getRange(0, 0, 3, 10); range.setBorder(new spreadNS.LineBorder('black', spreadNS.LineStyle.double), { left: true, bottom: true, top: true, right: true }); sheet.resumePaint(); headerVisible.value = sheet.options.colHeaderVisible && sheet.options.rowHeaderVisible; left.value = sheet.options.sheetAreaOffset.left; top.value = sheet.options.sheetAreaOffset.top; } function setOffset() { let sheet = spreadRef.value.getActiveSheet(); let leftValue = left.value, topValue = top.value; sheet.options.sheetAreaOffset = { left: parseInt(leftValue, 10), top: parseInt(topValue, 10) } } </script> <style scoped> #app { height: 100%; } .sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: calc(100% - 280px); height: 100%; overflow: hidden; float: left; } .options-container { float: right; width: 280px; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; overflow: auto; } .options-row { font-size: 14px; padding: 5px; margin-top: 10px; } input { display: inline-block; } input[type="text"] { width: 160px; } label { display: inline-block; margin-bottom: 6px; width: 200px; } select { width: 120px; height: 35px; } 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 src="$DEMOROOT$/spread/source/data/sheetAreaData.js" type="text/javascript"></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-resources-en': 'npm:@mescius/spread-sheets-resources-en/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);