Skip to content

Commit a7bb3aa

Browse files
authored
Merge pull request #799 from SharkMediaSport/master
Add support for repeated columns on every page when printing.
2 parents 2415152 + 3f7f7b4 commit a7bb3aa

File tree

4 files changed

+109
-6
lines changed

4 files changed

+109
-6
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,8 @@ worksheet.pageSetup.printArea = 'A1:G20';
302302
// Repeat specific rows on every printed page
303303
worksheet.pageSetup.printTitlesRow = '1:3';
304304

305+
// Repeat specific columns on every printed page
306+
worksheet.pageSetup.printTitlesColumn = 'A:C';
305307
```
306308

307309
**Supported pageSetup settings**

index.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,11 @@ export interface PageSetup {
754754
* Repeat specific rows on every printed page, e.g. `'1:3'`
755755
*/
756756
printTitlesRow: string;
757+
758+
/**
759+
* Repeat specific columns on every printed page, e.g. `'A:C'`
760+
*/
761+
printTitlesColumn: string;
757762
}
758763

759764
export type AutoFilter = string | {

lib/xlsx/xform/book/workbook-xform.js

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,28 @@ utils.inherits(WorkbookXform, BaseXform, {
5454
};
5555
printAreas.push(definedName);
5656
}
57-
if (sheet.pageSetup && sheet.pageSetup.printTitlesRow) {
58-
const titlesRows = sheet.pageSetup.printTitlesRow.split(':');
57+
if (sheet.pageSetup && (sheet.pageSetup.printTitlesRow || sheet.pageSetup.printTitlesColumn)) {
58+
59+
let ranges = [];
60+
61+
if (sheet.pageSetup.printTitlesColumn) {
62+
63+
const titlesColumns = sheet.pageSetup.printTitlesColumn.split(':');
64+
ranges.push('\'' + sheet.name + '\'!$' + titlesColumns[0] + ':$' + titlesColumns[1]);
65+
}
66+
67+
if (sheet.pageSetup.printTitlesRow) {
68+
69+
const titlesRows = sheet.pageSetup.printTitlesRow.split(':');
70+
ranges.push('\'' + sheet.name + '\'!$' + titlesRows[0] + ':$' + titlesRows[1]);
71+
}
72+
5973
const definedName = {
6074
name: '_xlnm.Print_Titles',
61-
ranges: ['\'' + sheet.name + '\'!$' + titlesRows[0] + ':$' + titlesRows[1]],
75+
ranges: ranges,
6276
localSheetId: index
6377
};
78+
6479
printAreas.push(definedName);
6580
}
6681
index++;
@@ -183,9 +198,25 @@ utils.inherits(WorkbookXform, BaseXform, {
183198
if (!worksheet.pageSetup) {
184199
worksheet.pageSetup = {};
185200
}
186-
const longRange = definedName.ranges[0].split('!');
187-
const range = longRange[longRange.length - 1];
188-
worksheet.pageSetup.printTitlesRow = range;
201+
202+
const rangeString = definedName.ranges.join(",");
203+
204+
const rowRangeRegex = /\$\d+:\$\d+/;
205+
const rowRangeMatches = rangeString.match(rowRangeRegex);
206+
207+
if (rowRangeMatches && rowRangeMatches.length) {
208+
209+
worksheet.pageSetup.printTitlesRow = rowRangeMatches[0];
210+
}
211+
212+
const columnRangeRegex = /\$[A-Z]+:\$[A-Z]+/;
213+
const columnRangeMatches = rangeString.match(columnRangeRegex);
214+
215+
if (columnRangeMatches && columnRangeMatches.length) {
216+
217+
worksheet.pageSetup.printTitlesColumn = columnRangeMatches[0];
218+
}
219+
189220
}
190221
} else {
191222
definedNames.push(definedName);

spec/integration/workbook/workbook.spec.js

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,71 @@ describe('Workbook', function() {
9393
.then(function(wb2) {
9494
var ws2 = wb2.getWorksheet('printHeader');
9595
expect(ws2.pageSetup.printTitlesRow).to.equal('$1:$2');
96+
expect(ws2.pageSetup.printTitlesColumn).to.be.undefined;
97+
});
98+
});
99+
it('printTitlesColumn', function() {
100+
var wb = new Excel.Workbook();
101+
var ws = wb.addWorksheet('printColumn');
102+
103+
ws.getCell('A1').value = 'This is a column repeated on every printed page';
104+
ws.getCell('A2').value = 'This is a column repeated on every printed page';
105+
ws.getCell('B1').value = 'This is a repeated column too';
106+
ws.getCell('B2').value = 'This is a repeated column too';
107+
108+
ws.getCell('C1').value = 'This is a regular column';
109+
ws.getCell('C2').value = 'This is a regular column';
110+
ws.getCell('D1').value = 'This is a regular column';
111+
ws.getCell('D2').value = 'This is a regular column';
112+
113+
ws.pageSetup.printTitlesRow = 'A:B';
114+
115+
return wb.xlsx.writeFile(TEST_XLSX_FILE_NAME)
116+
.then(function() {
117+
var wb2 = new Excel.Workbook();
118+
return wb2.xlsx.readFile(TEST_XLSX_FILE_NAME);
119+
})
120+
.then(function(wb2) {
121+
var ws2 = wb2.getWorksheet('printColumn');
122+
expect(ws2.pageSetup.printTitlesRow).to.be.undefined;
123+
expect(ws2.pageSetup.printTitlesColumn).to.equal('$A:$B');
124+
});
125+
});
126+
it('printTitlesRowAndColumn', function() {
127+
var wb = new Excel.Workbook();
128+
var ws = wb.addWorksheet('printHeaderAndColumn');
129+
130+
ws.getCell('A1').value = 'This is a column / row repeated on every printed page';
131+
ws.getCell('A2').value = 'This is a column / row repeated on every printed page';
132+
ws.getCell('B1').value = 'This is a repeated column / row too';
133+
ws.getCell('B2').value = 'This is a repeated column / row too';
134+
135+
ws.getCell('C1').value = 'This is a regular column, repeated row';
136+
ws.getCell('C2').value = 'This is a regular column, repeated row';
137+
ws.getCell('D1').value = 'This is a regular column, repeated row';
138+
ws.getCell('D2').value = 'This is a regular column, repeated row';
139+
140+
ws.getCell('A3').value = 'This is a repeated column';
141+
ws.getCell('B3').value = 'This is a repeated column';
142+
ws.getCell('C3').value = 'This is a regular column / row';
143+
ws.getCell('D3').value = 'This is a regular column / row';
144+
145+
ws.pageSetup.printTitlesColumn = 'A:B';
146+
ws.pageSetup.printTitlesRow = '1:2';
147+
148+
for (var i = 0; i < 100; i++) {
149+
ws.addRow(['repeated column, not repeated row', 'repeated column, not repeated row', 'no repeat', 'no repeat']);
150+
}
151+
152+
return wb.xlsx.writeFile(TEST_XLSX_FILE_NAME)
153+
.then(function() {
154+
var wb2 = new Excel.Workbook();
155+
return wb2.xlsx.readFile(TEST_XLSX_FILE_NAME);
156+
})
157+
.then(function(wb2) {
158+
var ws2 = wb2.getWorksheet('printHeaderAndColumn');
159+
expect(ws2.pageSetup.printTitlesRow).to.equal('$1:$2');
160+
expect(ws2.pageSetup.printTitlesColumn).to.equal('$A:$B');
96161
});
97162
});
98163

0 commit comments

Comments
 (0)