Overview

You can print a single sheet or all of the sheets in SpreadJS using the print plugin. This makes it easy to give users the ability to print the SpreadJS instance, which can be particularly useful if there is some sort of dashboard or form where they have entered information and want a physical copy.

This demo also shows how to display the worksheet print line and customize it through the .sjs-print-line CSS class.

In order to use the print feature, add the JS file link into the document's head section below the SpreadJS link. For example: Then you can use the print feature by using the print method. It is defined as: where the optional parameter sheetIndex tells which sheet to print (omit for printing all sheets). For example you can print all sheets with the following code: You can show the worksheet print preview lines and customize their color and width by overriding the corresponding CSS classes: .sjs-print-line controls the automatically calculated print lines. Its default border color is #9f9f9f and its default border width is 1px. .sjs-print-page-break controls manual row and column page breaks. Its default border color is #000000 and its default border width is 1px. .sjs-print-area controls the boundary of the configured print area. Its default border color is #000000 and its default border width is 1px. This demo overrides all three classes so their styles can be adjusted independently from the settings panel.
window.onload = function () { var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss")); initSpread(spread); initPrintPreviewOptions(spread); document.getElementById('btnPrint').onclick = function () { spread.print(); }; }; function initPrintPreviewOptions(spread) { var styleOptions = [ createStyleOption(".sjs-print-line", "printLine"), createStyleOption(".sjs-print-page-break", "pageBreak"), createStyleOption(".sjs-print-area", "printArea") ]; var printPreviewStyle = document.createElement("style"); var repaintTimer = null; printPreviewStyle.id = "print-preview-style"; document.head.appendChild(printPreviewStyle); function createStyleOption(selector, idPrefix) { return { selector: selector, colorInput: document.getElementById(idPrefix + "Color"), widthInput: document.getElementById(idPrefix + "Width"), colorText: document.getElementById(idPrefix + "ColorText"), widthText: document.getElementById(idPrefix + "WidthText") }; } function repaintPrintPreview() { var sheet = spread.getActiveSheet(); if (sheet && sheet.repaint) { sheet.repaint(); } else if (spread.repaint) { spread.repaint(); } } function scheduleRepaint(immediate) { if (repaintTimer) { clearTimeout(repaintTimer); repaintTimer = null; } if (immediate) { repaintPrintPreview(); return; } repaintTimer = setTimeout(repaintPrintPreview, 80); } function updatePrintPreviewStyles(immediate) { var rules = styleOptions.map(function (option) { var color = option.colorInput.value; var width = option.widthInput.value; option.colorText.textContent = color; option.widthText.textContent = width + "px"; return option.selector + " { border-color: " + color + "; border-width: " + width + "px; }"; }); printPreviewStyle.textContent = rules.join("\n"); scheduleRepaint(immediate); } styleOptions.forEach(function (option) { option.colorInput.oninput = function () { updatePrintPreviewStyles(false); }; option.colorInput.onchange = function () { updatePrintPreviewStyles(true); }; option.widthInput.oninput = function () { updatePrintPreviewStyles(false); }; option.widthInput.onchange = function () { updatePrintPreviewStyles(true); }; }); updatePrintPreviewStyles(true); } function initSpread(spread) { var sheet = spread.getActiveSheet(); sheet.suspendPaint(); sheet.options.allowCellOverflow = true; sheet.name("Demo"); spread.sheets[0].setText(31, 8, " "); sheet.addSpan(1, 1, 1, 1); sheet.setValue(1, 1, "Month"); sheet.setValue(2, 1, "January"); sheet.setValue(3, 1, "February"); sheet.setValue(4, 1, "March"); sheet.setValue(5, 1, "April"); sheet.setValue(6, 1, "May"); sheet.setValue(7, 1, "June"); sheet.setValue(8, 1, "July"); sheet.setValue(9, 1, "August"); sheet.setValue(10, 1, "September"); sheet.setValue(11, 1, "October"); sheet.setValue(12, 1, "November"); sheet.setValue(13, 1, "December"); sheet.addSpan(1, 2, 1, 1); sheet.setValue(1, 2, "Quantity"); sheet.setValue(2, 2, 60); sheet.setValue(3, 2, 100); sheet.setValue(4, 2, 110); sheet.setValue(5, 2, 90); sheet.setValue(6, 2, 112); sheet.setValue(7, 2, 137); sheet.setValue(8, 2, 80); sheet.setValue(9, 2, 88); sheet.setValue(10, 2, 118); sheet.setValue(11, 2, 122); sheet.setValue(12, 2, 130); sheet.setValue(13, 2, 135); sheet.addSpan(1, 3, 1, 1); sheet.setValue(1, 3, "Price"); sheet.setValue(2, 3, 30.0); sheet.setValue(3, 3, 45.0); sheet.setValue(4, 3, 10.0); sheet.setValue(5, 3, 99.9); sheet.setValue(6, 3, 89.0); sheet.setValue(7, 3, 150.0); sheet.setValue(8, 3, 35.0); sheet.setValue(9, 3, 59.9); sheet.setValue(10, 3, 47.9); sheet.setValue(11, 3, 55.0); sheet.setValue(12, 3, 32.0); sheet.setValue(13, 3, 20.0); sheet.addSpan(1, 4, 1, 1); sheet.setValue(1, 4, "Total"); sheet.setFormula(2, 4, "=C3*D3"); sheet.setFormula(3, 4, "=C4*D4"); sheet.setFormula(4, 4, "=C5*D5"); sheet.setFormula(5, 4, "=C6*D6"); sheet.setFormula(6, 4, "=C7*D7"); sheet.setFormula(7, 4, "=C8*D8"); sheet.setFormula(8, 4, "=C9*D9"); sheet.setFormula(9, 4, "=C10*D10"); sheet.setFormula(10, 4, "=C11*D11"); sheet.setFormula(11, 4, "=C12*D12"); sheet.setFormula(12, 4, "=C13*D13"); sheet.setFormula(13, 4, "=C14*D14"); // set column width sheet.setColumnWidth(0, 50); sheet.setColumnWidth(1, 100); sheet.setColumnWidth(2, 60); sheet.setColumnWidth(3, 60); sheet.setColumnWidth(4, 90); sheet.setColumnWidth(5, 50); //set alignment sheet.getRange(1, 1, 1, 4).hAlign(GC.Spread.Sheets.HorizontalAlign.center) //set formatter sheet.getRange(2, 3, 12, 1).formatter("$ #,##0"); sheet.getRange(2, 4, 12, 1).formatter("$ #,##0"); //set color sheet.getRange(1, 1, 1, 4).backColor("#69a569").foreColor("white"); //set lineBorder sheet.getRange(2, 1, 12, 4).setBorder(new GC.Spread.Sheets.LineBorder("#A8A9AD", GC.Spread.Sheets.LineStyle.dotted), { all: true }); addFigures(sheet); var printInfo = sheet.printInfo(); printInfo.paperSize(new GC.Spread.Sheets.Print.PaperSize(GC.Spread.Sheets.Print.PaperKind.a4)); printInfo.rowStart(1); printInfo.rowEnd(19); printInfo.columnStart(1); printInfo.columnEnd(13); sheet.setRowPageBreak(16, true); sheet.setColumnPageBreak(2, true); sheet.isPrintLineVisible(true); sheet.resumePaint(); } function addFigures(sheet) { sheet.getRange(20, -1, 1, -1).visible(false); sheet.addSpan(4, 6, 6, 3); sheet.setFormula(4, 6, '=PIESPARKLINE(E3:E7, "#e6f0e6","#c9dec9","#a3c8a3","#73ab73","#d1ffd1")'); sheet.addSpan(10, 6, 1, 3); sheet.getCell(10, 6).text("Figure 1").hAlign(1); }
<!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/purejs/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets/dist/gc.spread.sheets.all.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-print/dist/gc.spread.sheets.print.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script src="app.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="styles.css"> </head> <body> <div class="sample-tutorial"> <div id="ss" class="sample-spreadsheets"></div> <div class="options-container"> <div class="panel-header"> <div> <h3>Print Preview Settings</h3> </div> </div> <div class="settings-stack"> <section class="settings-group" aria-labelledby="printLineHeading"> <h4 id="printLineHeading">Print Line</h4> <div class="setting-row"> <label for="printLineColor">Color</label> <div class="control-inline"> <input type="color" id="printLineColor" value="#2e9d5b"> <span id="printLineColorText">#2e9d5b</span> </div> </div> <div class="setting-row"> <label for="printLineWidth">Width</label> <div class="control-inline"> <input type="range" id="printLineWidth" min="1" max="8" value="2"> <span id="printLineWidthText">2px</span> </div> </div> </section> <section class="settings-group" aria-labelledby="pageBreakHeading"> <h4 id="pageBreakHeading">Page Break</h4> <div class="setting-row"> <label for="pageBreakColor">Color</label> <div class="control-inline"> <input type="color" id="pageBreakColor" value="#87ceeb"> <span id="pageBreakColorText">#87ceeb</span> </div> </div> <div class="setting-row"> <label for="pageBreakWidth">Width</label> <div class="control-inline"> <input type="range" id="pageBreakWidth" min="1" max="8" value="2"> <span id="pageBreakWidthText">2px</span> </div> </div> </section> <section class="settings-group" aria-labelledby="printAreaHeading"> <h4 id="printAreaHeading">Print Area</h4> <div class="setting-row"> <label for="printAreaColor">Color</label> <div class="control-inline"> <input type="color" id="printAreaColor" value="#ffc0cb"> <span id="printAreaColorText">#ffc0cb</span> </div> </div> <div class="setting-row"> <label for="printAreaWidth">Width</label> <div class="control-inline"> <input type="range" id="printAreaWidth" min="1" max="8" value="2"> <span id="printAreaWidthText">2px</span> </div> </div> </section> </div> <div class="panel-actions"> <input type="button" value="Print" id="btnPrint"> </div> </div> </div> </body> </html>
.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: 18px 16px; height: 100%; box-sizing: border-box; background: #f7f8fa; border-left: 1px solid #dde2e8; overflow: auto; color: #202734; } .panel-header { padding-bottom: 16px; margin-bottom: 16px; border-bottom: 1px solid #e2e6eb; } .panel-header h3 { margin: 0 0 6px; font-size: 16px; font-weight: 600; } .settings-stack { display: flex; flex-direction: column; gap: 12px; } .settings-group { padding: 12px; border: 1px solid #e0e5eb; border-radius: 6px; background: #fff; } .settings-group h4 { margin: 0 0 12px; color: #202734; font-size: 14px; font-weight: 600; } .setting-row { margin-bottom: 16px; } .setting-row:last-child { margin-bottom: 0; } .setting-row label { display: block; margin-bottom: 8px; color: #394252; font-size: 13px; font-weight: 600; } .control-inline { display: flex; align-items: center; gap: 10px; } .control-inline input[type="color"] { flex: 0 0 auto; width: 38px; height: 32px; padding: 0; border: 1px solid #cfd6df; border-radius: 4px; background: #fff; } .control-inline input[type="range"] { flex: 1 1 auto; min-width: 0; } .control-inline span { min-width: 48px; color: #4d5767; font-size: 12px; text-align: right; } .panel-actions { margin-top: 16px; } input[type="button"] { display: block; width: 100%; height: 30px; padding: 4px 12px; border: 1px solid #9db8dd; border-radius: 2px; background: #fff; color: #003e7e; font-weight: 600; cursor: pointer; } input[type="button"]:hover { border-color: #6e9ed4; background: #f5f9ff; } input[type="button"]:active { border-color: #3f7ec0; background: #eaf3ff; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; }