Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -559,6 +559,9 @@ row.values = {
dob: new Date()
};

// Insert a page break prior to the row
row.addPageBreak();

// Iterate over all rows that have values in a worksheet
worksheet.eachRow(function(row, rowNumber) {
console.log('Row ' + rowNumber + ' = ' + JSON.stringify(row.values));
Expand Down
16 changes: 16 additions & 0 deletions lib/doc/row.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,22 @@ Row.prototype = {
}
},

// ===========================================================================
// Page Breaks
addPageBreak: function(lft, rght) {
const ws = this._worksheet;
const left = Math.max(0, lft - 1) || 0;
const right = Math.max(0, rght - 1) || 16838;
const pb = {
id: this._number,
max: right,
man: 1
};
if (left) pb.min = left;

ws.rowBreaks.push(pb);
},

// return a sparse array of cell values
get values() {
var values = [];
Expand Down
4 changes: 4 additions & 0 deletions lib/doc/worksheet.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ var Worksheet = module.exports = function(options) {
// keep record of all merges
this._merges = {};

// record of all row and column pageBreaks
this.rowBreaks = [];

this._workbook = options.workbook;

// for tabColor, default row height, outline levels, etc
Expand Down Expand Up @@ -557,6 +560,7 @@ Worksheet.prototype = {
dataValidations: this.dataValidations.model,
properties: this.properties,
pageSetup: this.pageSetup,
rowBreaks: this.rowBreaks,
views: this.views,
autoFilter: this.autoFilter,
media: this._media,
Expand Down
35 changes: 35 additions & 0 deletions lib/xlsx/xform/sheet/page-breaks-xform.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/**
* 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 PageBreaksXform = module.exports = function() {
};

utils.inherits(PageBreaksXform, BaseXform, {

get tag() { return 'brk'; },

render: function(xmlStream, model) {
xmlStream.leafNode('brk', model);
},

parseOpen: function(node) {
if (node.name === 'brk') {
this.model = node.attributes.ref;
return true;
}
return false;
},
parseText: function() {
},
parseClose: function() {
return false;
}
});
41 changes: 41 additions & 0 deletions lib/xlsx/xform/sheet/row-breaks-xform.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/**
* 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 PageBreaksXform = require('./page-breaks-xform');

var utils = require('../../../utils/utils');
var ListXform = require('../list-xform');

var RowBreaksXform = module.exports = function() {
const options = {tag: 'rowBreaks', count: true, childXform: new PageBreaksXform()};
ListXform.call(this, options);
};

utils.inherits(RowBreaksXform, ListXform, {

// get tag() { return 'rowBreaks'; },

render: function(xmlStream, model) {
if (model && model.length) {
xmlStream.openNode(this.tag, this.$);
if (this.count) {
xmlStream.addAttribute(this.$count, model.length);
xmlStream.addAttribute('manualBreakCount', model.length);
}

var childXform = this.childXform;
model.forEach(function(childModel) {
childXform.render(xmlStream, childModel);
});

xmlStream.closeNode();
} else if (this.empty) {
xmlStream.leafNode(this.tag);
}
}
});
5 changes: 4 additions & 1 deletion lib/xlsx/xform/sheet/worksheet-xform.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ var PrintOptionsXform = require('./print-options-xform');
var AutoFilterXform = require('./auto-filter-xform');
var PictureXform = require('./picture-xform');
var DrawingXform = require('./drawing-xform');
var RowBreaksXform = require('./row-breaks-xform');

var WorkSheetXform = module.exports = function() {
this.map = {
Expand All @@ -43,6 +44,7 @@ var WorkSheetXform = module.exports = function() {
sheetData: new ListXform({tag: 'sheetData', count: false, empty: true, childXform: new RowXform()}),
autoFilter: new AutoFilterXform(),
mergeCells: new ListXform({tag: 'mergeCells', count: true, childXform: new MergeCellXform()}),
rowBreaks: new RowBreaksXform(),
hyperlinks: new ListXform({tag: 'hyperlinks', count: false, childXform: new HyperlinkXform()}),
pageMargins: new PageMarginsXform(),
dataValidations: new DataValidationsXform(),
Expand Down Expand Up @@ -180,7 +182,8 @@ utils.inherits(WorkSheetXform, BaseXform, {
this.map.pageSetup.render(xmlStream, model.pageSetup);
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();
},

Expand Down
27 changes: 27 additions & 0 deletions spec/unit/doc/worksheet.pagebreak.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
var expect = require('chai').expect;

var Excel = require('../../../excel');

describe('Worksheet', function() {
describe('Page Breaks', function() {
it('adds multiple row breaks', function() {
var wb = new Excel.Workbook();
var ws = wb.addWorksheet('blort');

// initial values
ws.getCell('A1').value = 'A1';
ws.getCell('B1').value = 'B1';
ws.getCell('A2').value = 'A2';
ws.getCell('B2').value = 'B2';
ws.getCell('A3').value = 'A3';
ws.getCell('B3').value = 'B3';

var row = ws.getRow(1);
row.addPageBreak();
row = ws.getRow(2);
row.addPageBreak();

expect(ws.rowBreaks.length).to.equal(2);
});
});
});
3 changes: 2 additions & 1 deletion spec/unit/xlsx/xform/sheet/data/sheet.1.0.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,5 +60,6 @@
]
}
],
"media": []
"media": [],
"rowBreaks": []
}
3 changes: 2 additions & 1 deletion spec/unit/xlsx/xform/sheet/data/sheet.1.1.json
Original file line number Diff line number Diff line change
Expand Up @@ -75,5 +75,6 @@
"Type": "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"
}
],
"media": []
"media": [],
"rowBreaks": []
}
47 changes: 47 additions & 0 deletions spec/unit/xlsx/xform/sheet/data/sheet.7.0.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
{
"dimensions": "A1:C7",
"properties": {"defaultRowHeight": 14.4, "dyDescent": 0.55, "outlineLevelRow": 2},
"views": [{"state": "normal", "workbookViewId": 0}],
"pageSetup": {
"margins": {"left": 0.7, "right": 0.7, "top": 0.75, "bottom": 0.75, "header": 0.3, "footer": 0.3 }
},
"rows": [
{
"number": 1, "min": 1, "max": 3,
"cells": [
{"address": "A1", "type": 3, "value": "Name"},
{"address": "C1", "type": 3, "value": "Tom"}
]
},
{
"number": 2, "min": 1, "max": 3, "outlineLevel": 1,
"cells": [
{"address": "C2", "type": 3, "value": "Dick"}
]
},
{
"number": 3, "min": 1, "max": 3, "outlineLevel": 2, "collapsed": true,
"cells": [
{"address": "C3", "type": 3, "value": "Harry"}
]
},
{
"number": 5, "min": 1, "max": 3,
"cells": [
{"address": "A5", "type": 3, "value": "Inline"}
]
},
{
"number": 7, "min": 1, "max": 3,
"cells": [
{"address": "A7", "type": 3, "value": "Between"},
{"address": "B7", "type": 2, "value": 5}
]
}
],
"rowBreaks": [
{"id": 2, "max": 2, "min": 0, "man": 1},
{"id": 5, "max": 2, "min": 0, "man": 1}
],
"media": []
}
50 changes: 50 additions & 0 deletions spec/unit/xlsx/xform/sheet/data/sheet.7.1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{
"dimensions": "A1:C7",
"properties": {"defaultRowHeight": 14.4, "dyDescent": 0.55, "outlineLevelRow": 2},
"views": [{"state": "normal", "workbookViewId": 0}],
"pageSetup": {
"margins": {"left": 0.7, "right": 0.7, "top": 0.75, "bottom": 0.75, "header": 0.3, "footer": 0.3 }
},
"rows": [
{
"number": 1, "min": 1, "max": 3,
"cells": [
{"address": "A1", "type": 3, "value": "Name", "ssId": 0},
{"address": "C1", "type": 3, "value": "Tom", "ssId": 1}
]
},
{
"number": 2, "min": 1, "max": 3, "outlineLevel": 1,
"cells": [
{"address": "C2", "type": 3, "value": "Dick", "ssId": 2}
]
},
{
"number": 3, "min": 1, "max": 3, "outlineLevel": 2, "collapsed": true,
"cells": [
{"address": "C3", "type": 3, "value": "Harry", "ssId": 3}
]
},
{
"number": 5, "min": 1, "max": 3,
"cells": [
{"address": "A5", "type": 3, "value": "Inline", "ssId": 4}
]
},
{
"number": 7, "min": 1, "max": 3,
"cells": [
{"address": "A7", "type": 3, "value": "Between", "ssId": 5},
{"address": "B7", "type": 2, "value": 5}
]
}
],
"mergeCells": [],
"hyperlinks": [],
"rels": [],
"rowBreaks": [
{"id": 2, "max": 2, "min": 0, "man": 1},
{"id": 5, "max": 2, "min": 0, "man": 1}
],
"media": []
}
44 changes: 44 additions & 0 deletions spec/unit/xlsx/xform/sheet/data/sheet.7.2.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
<dimension ref="A1:C7"/>
<sheetViews>
<sheetView workbookViewId="0"/>
</sheetViews>
<sheetFormatPr defaultRowHeight="14.4" x14ac:dyDescent="0.55" outlineLevelRow="2"/>
<sheetData>
<row r="1" spans="1:3" x14ac:dyDescent="0.25">
<c r="A1" t="s">
<v>0</v>
</c><c r="C1" t="s">
<v>1</v>
</c>
</row>
<row r="2" spans="1:3" x14ac:dyDescent="0.25" outlineLevel="1">
<c r="C2" t="s">
<v>2</v>
</c>
</row>
<row r="3" spans="1:3" x14ac:dyDescent="0.25" outlineLevel="2" collapsed="1">
<c r="C3" t="s">
<v>3</v>
</c>
</row>
<row r="5" spans="1:3" x14ac:dyDescent="0.25">
<c r="A5" t="s">
<v>4</v>
</c>
</row>
<row r="7" spans="1:3" x14ac:dyDescent="0.25">
<c r="A7" t="s">
<v>5</v>
</c><c r="B7">
<v>5</v>
</c>
</row>
</sheetData>
<rowBreaks count="2" manualBreakCount="2">
<brk id="2" max="2" min="0" man="1"/>
<brk id="5" max="2" min="0" man="1"/>
</rowBreaks>
<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
</worksheet>
20 changes: 20 additions & 0 deletions spec/unit/xlsx/xform/sheet/page-breaks-xform.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
'use strict';

var PageBreaksXform = require('../../../../../lib/xlsx/xform/sheet/page-breaks-xform');
var testXformHelper = require('./../test-xform-helper');

var expectations = [
{
title: 'one page break',
create: function() { return new PageBreaksXform(); },
initialModel: {id: 2, max: 3, min: 1, man: 1},
preparedModel: {id: 2, max: 3, min: 1, man: 1},
xml: '<brk id="2" max="3" min="1" man="1"/>',
parsedModel: {id: 2, max: 3, min: 1, man: 1},
tests: ['prepare', 'render', 'renderIn']
}
];

describe('PageBreaksXform', function() {
testXformHelper(expectations);
});
9 changes: 9 additions & 0 deletions spec/unit/xlsx/xform/sheet/worksheet-xform.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,15 @@ var expectations = [
tests: ['render', 'parse'],
options: { sharedStrings: new SharedStringsXform(), hyperlinks: [], hyperlinkMap: fakeHyperlinkMap, styles: fakeStyles, formulae: {}, siFormulae: 0 }
},
{
title: 'Sheet 7 - Row Breaks',
create: () => new WorksheetXform(),
initialModel: require('./data/sheet.7.0.json'),
preparedModel: require('./data/sheet.7.1.json'),
xml: fs.readFileSync(__dirname + '/data/sheet.7.2.xml').toString(),
tests: ['prepare', 'render'],
options: { sharedStrings: new SharedStringsXform(), hyperlinks: [], hyperlinkMap: fakeHyperlinkMap, styles: fakeStyles, formulae: {}, siFormulae: 0 }
},
];

describe('WorksheetXform', function() {
Expand Down