diff --git a/README.md b/README.md index ee1b92b60..ceead5e59 100644 --- a/README.md +++ b/README.md @@ -1099,6 +1099,15 @@ worksheet.properties.outlineLevelCol = 2; expect(worksheet.getColumn(3).collapsed).to.be.false; ``` +The outline properties can be set on the worksheet + +```javascript +worksheet.properties.outlineProperties = { + summaryBelow: false, + summaryRight: false, +}; +``` + ## Images Adding images to a worksheet is a two-step process. diff --git a/lib/stream/xlsx/worksheet-writer.js b/lib/stream/xlsx/worksheet-writer.js index 24a7d6c97..fc6349c43 100644 --- a/lib/stream/xlsx/worksheet-writer.js +++ b/lib/stream/xlsx/worksheet-writer.js @@ -418,6 +418,7 @@ WorksheetWriter.prototype = { }, _writeSheetProperties: function(xmlBuf, properties, pageSetup) { var sheetPropertiesModel = { + outlineProperties: properties && properties.outlineProperties, tabColor: properties && properties.tabColor, pageSetup: pageSetup && pageSetup.fitToPage ? { fitToPage: pageSetup.fitToPage diff --git a/lib/xlsx/xform/sheet/outline-properties-xform.js b/lib/xlsx/xform/sheet/outline-properties-xform.js new file mode 100644 index 000000000..f2c995031 --- /dev/null +++ b/lib/xlsx/xform/sheet/outline-properties-xform.js @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2015 Guyon Roche + * LICENCE: MIT - please refer to LICENCE file included with this module + * or https://github.com/guyonroche/exceljs/blob/master/LICENSE + */ + +'use strict'; + +var utils = require('../../../utils/utils'); +var BaseXform = require('../base-xform'); + +var OutlinePropertiesXform = module.exports = function() {}; + +var isDefined = (attr) => typeof attr !== 'undefined'; + +utils.inherits(OutlinePropertiesXform, BaseXform, { + + get tag() { return 'outlinePr'; }, + + render: function(xmlStream, model) { + if (model && (isDefined(model.summaryBelow) || isDefined(model.summaryRight))) { + xmlStream.leafNode(this.tag, { + summaryBelow: isDefined(model.summaryBelow) ? Number(model.summaryBelow) : undefined, + summaryRight: isDefined(model.summaryRight) ? Number(model.summaryRight) : undefined, + }); + return true; + } + return false; + }, + + parseOpen: function(node) { + if (node.name === this.tag) { + this.model = { + summaryBelow: isDefined(node.attributes.summaryBelow) ? Boolean(Number(node.attributes.summaryBelow)) : undefined, + summaryRight: isDefined(node.attributes.summaryRight) ? Boolean(Number(node.attributes.summaryRight)) : undefined, + }; + return true; + } + return false; + }, + parseText: function() { + }, + parseClose: function() { + return false; + } +}); diff --git a/lib/xlsx/xform/sheet/sheet-properties-xform.js b/lib/xlsx/xform/sheet/sheet-properties-xform.js index 09a47a414..62363d929 100644 --- a/lib/xlsx/xform/sheet/sheet-properties-xform.js +++ b/lib/xlsx/xform/sheet/sheet-properties-xform.js @@ -10,11 +10,13 @@ var utils = require('../../../utils/utils'); var BaseXform = require('../base-xform'); var ColorXform = require('../style/color-xform'); var PageSetupPropertiesXform = require('./page-setup-properties-xform'); +var OutlinePropertiesXform = require('./outline-properties-xform'); var SheetPropertiesXform = module.exports = function() { this.map = { tabColor: new ColorXform('tabColor'), - pageSetUpPr: new PageSetupPropertiesXform() + pageSetUpPr: new PageSetupPropertiesXform(), + outlinePr: new OutlinePropertiesXform(), }; }; @@ -30,6 +32,7 @@ utils.inherits(SheetPropertiesXform, BaseXform, { var inner = false; inner = this.map.tabColor.render(xmlStream, model.tabColor) || inner; inner = this.map.pageSetUpPr.render(xmlStream, model.pageSetup) || inner; + inner = this.map.outlinePr.render(xmlStream, model.outlineProperties) || inner; if (inner) { xmlStream.closeNode(); @@ -39,7 +42,7 @@ utils.inherits(SheetPropertiesXform, BaseXform, { } } }, - + parseOpen: function(node) { if (this.parser) { this.parser.parseOpen(node); @@ -70,7 +73,7 @@ utils.inherits(SheetPropertiesXform, BaseXform, { } return true; } - if (this.map.tabColor.model || this.map.pageSetUpPr.model) { + if (this.map.tabColor.model || this.map.pageSetUpPr.model || this.map.outlinePr.model) { this.model = {}; if (this.map.tabColor.model) { this.model.tabColor = this.map.tabColor.model; @@ -78,6 +81,9 @@ utils.inherits(SheetPropertiesXform, BaseXform, { if (this.map.pageSetUpPr.model) { this.model.pageSetup = this.map.pageSetUpPr.model; } + if (this.map.outlinePr.model) { + this.model.outlineProperties = this.map.outlinePr.model; + } } else { this.model = null; } diff --git a/lib/xlsx/xform/sheet/worksheet-xform.js b/lib/xlsx/xform/sheet/worksheet-xform.js index dcfed7376..a25bc2605 100644 --- a/lib/xlsx/xform/sheet/worksheet-xform.js +++ b/lib/xlsx/xform/sheet/worksheet-xform.js @@ -153,6 +153,7 @@ utils.inherits(WorkSheetXform, BaseXform, { outlineLevelRow: model.properties.outlineLevelRow } : undefined; var sheetPropertiesModel = { + outlineProperties: model.properties && model.properties.outlineProperties, tabColor: model.properties && model.properties.tabColor, pageSetup: model.pageSetup && model.pageSetup.fitToPage ? { fitToPage: model.pageSetup.fitToPage @@ -183,7 +184,7 @@ utils.inherits(WorkSheetXform, BaseXform, { this.map.drawing.render(xmlStream, model.drawing); this.map.picture.render(xmlStream, model.background); // Note: must be after drawing this.map.rowBreaks.render(xmlStream, model.rowBreaks); - + xmlStream.closeNode(); }, @@ -224,6 +225,9 @@ utils.inherits(WorkSheetXform, BaseXform, { if (this.map.sheetPr.model && this.map.sheetPr.model.tabColor) { properties.tabColor = this.map.sheetPr.model.tabColor; } + if (this.map.sheetPr.model && this.map.sheetPr.model.outlineProperties) { + properties.outlineProperties = this.map.sheetPr.model.outlinePropertiesx; + } var sheetProperties = { fitToPage: (this.map.sheetPr.model && this.map.sheetPr.model.pageSetup && this.map.sheetPr.model.pageSetup.fitToPage) || false, margins: this.map.pageMargins.model diff --git a/spec/unit/xlsx/xform/sheet/outline-properties-xform.spec.js b/spec/unit/xlsx/xform/sheet/outline-properties-xform.spec.js new file mode 100644 index 000000000..351942187 --- /dev/null +++ b/spec/unit/xlsx/xform/sheet/outline-properties-xform.spec.js @@ -0,0 +1,43 @@ +'use strict'; + +var OutlinePropertiesXform = require('../../../../../lib/xlsx/xform/sheet/outline-properties-xform'); +var testXformHelper = require('./../test-xform-helper'); + +var expectations = [ + { + title: 'empty', + create: function() { return new OutlinePropertiesXform(); }, + preparedModel: {}, + xml: '', + parsedModel: {}, + tests: ['render', 'renderIn'] + }, + { + title: 'summaryBelow', + create: function() { return new OutlinePropertiesXform(); }, + preparedModel: { summaryBelow: false }, + xml: '', + parsedModel: { summaryBelow: false }, + tests: ['render', 'renderIn', 'parse'] + }, + { + title: 'summaryRight', + create: function() { return new OutlinePropertiesXform(); }, + preparedModel: { summaryRight: false }, + xml: '', + parsedModel: { summaryRight: false }, + tests: ['render', 'renderIn', 'parse'] + }, + { + title: 'summaryRight', + create: function() { return new OutlinePropertiesXform(); }, + preparedModel: { summaryBelow: true, summaryRight: false }, + xml: '', + parsedModel: { summaryBelow: true, summaryRight: false }, + tests: ['render', 'renderIn', 'parse'] + }, +]; + +describe('OutlinePropertiesXform', function() { + testXformHelper(expectations); +}); diff --git a/spec/unit/xlsx/xform/sheet/sheet-properties-xform.spec.js b/spec/unit/xlsx/xform/sheet/sheet-properties-xform.spec.js index 0d99ada3d..647ebb009 100644 --- a/spec/unit/xlsx/xform/sheet/sheet-properties-xform.spec.js +++ b/spec/unit/xlsx/xform/sheet/sheet-properties-xform.spec.js @@ -28,6 +28,14 @@ var expectations = [ parsedModel: {pageSetup: {fitToPage: true}}, tests: ['render', 'renderIn', 'parse'] }, + { + title: 'outlineProperties', + create: function() { return new SheetPropertiesXform(); }, + preparedModel: { outlineProperties: { summaryBelow: false } }, + xml: '', + parsedModel: { outlineProperties: { summaryBelow: false } }, + tests: ['render', 'renderIn', 'parse'] + }, { title: 'tabColor + pageSetup', create: function() { return new SheetPropertiesXform(); }, @@ -35,6 +43,30 @@ var expectations = [ xml: '', parsedModel: {tabColor: { argb: 'FFFF0000'}, pageSetup: {fitToPage: true}}, tests: ['render', 'renderIn', 'parse'] + }, + { + title: 'tabColor + outlineProperties', + create: function() { return new SheetPropertiesXform(); }, + preparedModel: { tabColor: { argb: 'FFFF0000' }, outlineProperties: { summaryBelow: false } }, + xml: '', + parsedModel: { tabColor: { argb: 'FFFF0000' }, outlineProperties: { summaryBelow: false } }, + tests: ['render', 'renderIn', 'parse'] + }, + { + title: 'pageSetup + outlineProperties', + create: function() { return new SheetPropertiesXform(); }, + preparedModel: {pageSetup: {fitToPage: true}, outlineProperties: { summaryBelow: false }}, + xml: '', + parsedModel: {pageSetup: {fitToPage: true}, outlineProperties: { summaryBelow: false }}, + tests: ['render', 'renderIn', 'parse'] + }, + { + title: 'tabColor + outlineProperties + pageSetup', + create: function() { return new SheetPropertiesXform(); }, + preparedModel: { tabColor: { argb: 'FFFF0000' }, outlineProperties: { summaryBelow: false }, pageSetup: { fitToPage: true } }, + xml: '', + parsedModel: { tabColor: { argb: 'FFFF0000' }, outlineProperties: { summaryBelow: false }, pageSetup: { fitToPage: true } }, + tests: ['render', 'renderIn', 'parse'] } ]; pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy