diff --git a/TODO.txt b/TODO.txt index 613775c01..a451e0993 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,6 +1,8 @@ TODO: +On the way to the impossible we might find something eminently doable + Page Setup Themes: diff --git a/lib/stream/xlsx/hyperlink-writer.js b/lib/stream/xlsx/sheet-rels-writer.js similarity index 60% rename from lib/stream/xlsx/hyperlink-writer.js rename to lib/stream/xlsx/sheet-rels-writer.js index b10e905c5..92658c393 100644 --- a/lib/stream/xlsx/hyperlink-writer.js +++ b/lib/stream/xlsx/sheet-rels-writer.js @@ -23,17 +23,30 @@ 'use strict'; var utils = require('../../utils/utils'); +var RelType = require('../../xlsx/rel-type'); -var HyperlinkWriter = module.exports = function(options) { +var HyperlinksProxy = function(sheetRelsWriter) { + this.writer = sheetRelsWriter; +}; +HyperlinksProxy.prototype = { + push: function(hyperlink) { + this.writer.addHyperlink(hyperlink); + } +}; + +var SheetRelsWriter = module.exports = function(options) { // in a workbook, each sheet will have a number this.id = options.id; + // count of all relationships + this.count = 0; + // keep record of all hyperlinks this._hyperlinks = []; this._workbook = options.workbook; }; -HyperlinkWriter.prototype = { +SheetRelsWriter.prototype = { get stream() { if (!this._stream) { @@ -50,24 +63,32 @@ HyperlinkWriter.prototype = { return this._hyperlinks.forEach(fn); }, - push: function(hyperlink) { - // if first hyperlink, must open stream and write xml intro - if (!this._hyperlinks.length) { - this._writeOpen(); - } + get hyperlinksProxy() { + return this._hyperlinksProxy || + (this._hyperlinksProxy = new HyperlinksProxy(this)); + }, + addHyperlink: function(hyperlink) { + // Write to stream + var relationship = { + Target: hyperlink.target, + Type: RelType.Hyperlink, + TargetMode: 'External' + }; + var rId = this._writeRelationship(relationship); // store sheet stuff for later this._hyperlinks.push({ - address: hyperlink.address, - rId: hyperlink.rId + rId: rId, + address: hyperlink.address }); + }, - // and write to stream - this._writeRelationship(hyperlink); + addMedia: function(media) { + return this._writeRelationship(media); }, commit: function() { - if (this._hyperlinks.length) { + if (this.count) { // write xml utro this._writeClose(); // and close stream @@ -81,14 +102,32 @@ HyperlinkWriter.prototype = { '' + ''); }, - _writeRelationship: function(hyperlink) { - this.stream.write( - ''); + _writeRelationship: function(relationship) { + if (!this.count) { + this._writeOpen(); + } + + var rId = 'rId' + ++this.count; + + if (relationship.TargetMode) { + this.stream.write( + ''); + } else { + this.stream.write( + ''); + } + + + return rId; }, _writeClose: function() { this.stream.write(''); diff --git a/lib/stream/xlsx/workbook-writer.js b/lib/stream/xlsx/workbook-writer.js index 100ca6b2a..8f6b89a21 100644 --- a/lib/stream/xlsx/workbook-writer.js +++ b/lib/stream/xlsx/workbook-writer.js @@ -216,7 +216,7 @@ WorkbookWriter.prototype = { return new Bluebird(function(resolve) { var xform = new RelationshipsXform(); var xml = xform.toXml([ - {rId: 'rId1', type: RelType.OfficeDocument, target: 'xl/workbook.xml'} + {Id: 'rId1', Type: RelType.OfficeDocument, Target: 'xl/workbook.xml'} ]); self.zip.append(xml, {name: '/_rels/.rels'}); resolve(); @@ -273,19 +273,19 @@ WorkbookWriter.prototype = { var self = this; var count = 1; var relationships = [ - {rId: 'rId' + (count++), type: RelType.Styles, target: 'styles.xml'}, - {rId: 'rId' + (count++), type: RelType.Theme, target: 'theme/theme1.xml'} + {Id: 'rId' + (count++), Type: RelType.Styles, Target: 'styles.xml'}, + {Id: 'rId' + (count++), Type: RelType.Theme, Target: 'theme/theme1.xml'} ]; if (this.streamedValues.count) { relationships.push( - {rId: 'rId' + (count++), type: RelType.SharedStrings, target: 'sharedStrings.xml'} + {Id: 'rId' + (count++), Type: RelType.SharedStrings, Target: 'sharedStrings.xml'} ); } this._worksheets.forEach(function (worksheet) { if (worksheet) { worksheet.rId = 'rId' + (count++); relationships.push( - {rId: worksheet.rId, type: RelType.Worksheet, target: 'worksheets/sheet' + worksheet.id + '.xml'} + {Id: worksheet.rId, Type: RelType.Worksheet, Target: 'worksheets/sheet' + worksheet.id + '.xml'} ); } }); diff --git a/lib/stream/xlsx/worksheet-writer.js b/lib/stream/xlsx/worksheet-writer.js index 911487182..8f04c8748 100644 --- a/lib/stream/xlsx/worksheet-writer.js +++ b/lib/stream/xlsx/worksheet-writer.js @@ -26,6 +26,8 @@ var fs = require('fs'); var _ = require('lodash'); var utils = require('../../utils/utils'); +var RelType = require('../../xlsx/rel-type'); + var colCache = require('../../utils/col-cache'); var Dimensions = require('../../doc/range'); @@ -34,7 +36,7 @@ var StringBuf = require('../../utils/string-buf'); var Row = require('../../doc/row'); var Column = require('../../doc/column'); -var HyperlinkWriter = require('./hyperlink-writer'); +var SheetRelsWriter = require('./sheet-rels-writer'); var DataValidations = require('../../doc/data-validations'); var xml = new StringBuf(); @@ -51,6 +53,7 @@ var HyperlinkXform = require('../../xlsx/xform/sheet/hyperlink-xform'); var SheetViewXform = require('../../xlsx/xform/sheet/sheet-view-xform'); var PageMarginsXform = require('../../xlsx/xform/sheet/page-margins-xform'); var PageSetupXform = require('../../xlsx/xform/sheet/page-setup-xform'); +var PictureXform = require('../../xlsx/xform/sheet/picture-xform'); // since prepare and render is functional, we can use singletons var xform = { @@ -62,7 +65,8 @@ var xform = { hyperlinks: new ListXform({tag: 'hyperlinks', length: false, childXform: new HyperlinkXform()}), sheetViews: new ListXform({tag: 'sheetViews', length: false, childXform: new SheetViewXform()}), pageMargins: new PageMarginsXform(), - pageSeteup: new PageSetupXform() + pageSeteup: new PageSetupXform(), + picture: new PictureXform() }; @@ -90,7 +94,7 @@ var WorksheetWriter = module.exports = function(options) { this._merges.add = function(){}; // ignore cell instruction // keep record of all hyperlinks - this._hyperlinkWriter = new HyperlinkWriter(options); + this._sheetRelsWriter = new SheetRelsWriter(options); // keep a record of dimensions this._dimensions = new Dimensions(); @@ -147,6 +151,18 @@ var WorksheetWriter = module.exports = function(options) { // start writing to stream now this._writeOpenWorksheet(); + // background + if (options.background && options.background.type === 'image') { + var imageName = this._workbook.addMedia(options.background); + var pictureId = this._sheetRelsWriter.addMedia({ + Target: '../media/' + imageName, + Type: RelType.Image + }); + this._background = { + rId: pictureId + }; + } + this.startedData = false; }; @@ -197,13 +213,14 @@ WorksheetWriter.prototype = { this._writeDataValidations(); this._writePageMargins(); this._writePageSetup(); + this._writeBackground(); this._writeCloseWorksheet(); // signal end of stream to workbook this.stream.end(); // also commit the hyperlinks if any - this._hyperlinkWriter.commit(); + this._sheetRelsWriter.commit(); this.committed = true; }, @@ -452,7 +469,7 @@ WorksheetWriter.prototype = { var options = { styles: this._workbook.styles, sharedStrings: self.useSharedStrings ? self._workbook.sharedStrings : undefined, - hyperlinks: this._hyperlinkWriter, + hyperlinks: this._sheetRelsWriter.hyperlinksProxy, merges: this._merges }; xform.row.prepare(model, options); @@ -474,11 +491,10 @@ WorksheetWriter.prototype = { xml.addText(''); this.stream.write(xml); - //stringBufStack.push(xml); } }, _writeHyperlinks: function() { - this.stream.write(xform.hyperlinks.toXml(this._hyperlinkWriter._hyperlinks)); + this.stream.write(xform.hyperlinks.toXml(this._sheetRelsWriter._hyperlinks)); }, _writeDataValidations: function() { this.stream.write(xform.dataValidations.toXml(this.dataValidations.model)); @@ -489,6 +505,11 @@ WorksheetWriter.prototype = { _writePageSetup: function() { this.stream.write(xform.pageSeteup.toXml(this.pageSetup)); }, + _writeBackground: function() { + if (this._background) { + this.stream.write(xform.picture.toXml(this._background)); + } + }, _writeDimensions: function() { this._write(''); }, diff --git a/lib/xlsx/xform/core/content-types-xform.js b/lib/xlsx/xform/core/content-types-xform.js index 34abd4be4..bc82bf3ed 100644 --- a/lib/xlsx/xform/core/content-types-xform.js +++ b/lib/xlsx/xform/core/content-types-xform.js @@ -57,7 +57,7 @@ utils.inherits(ContentTypesXform, BaseXform, { xmlStream.openNode('Types', ContentTypesXform.TYPES_PROPERTY_ATTRIBUTES); var mediaHash = {}; - model.media.forEach(function(medium) { + (model.media || []).forEach(function(medium) { if (medium.type === 'image') { var imageType = medium.image.type; if (!mediaHash[imageType]) { diff --git a/lib/xlsx/xform/sheet/worksheet-xform.js b/lib/xlsx/xform/sheet/worksheet-xform.js index 9d8c9918b..de5eab57f 100644 --- a/lib/xlsx/xform/sheet/worksheet-xform.js +++ b/lib/xlsx/xform/sheet/worksheet-xform.js @@ -95,7 +95,7 @@ utils.inherits(WorkSheetXform, BaseXform, { Id: rId, Type: RelType.Hyperlink, Target: hyperlink.target, - TargetType: 'External' + TargetMode: 'External' }); }); @@ -223,7 +223,7 @@ utils.inherits(WorkSheetXform, BaseXform, { return h; }, {}); options.hyperlinkMap = (model.hyperlinks || []).reduce(function(h, hyperlink) { - h[hyperlink.address] = rels[hyperlink.Id]; + h[hyperlink.address] = rels[hyperlink.rId].Target; return h; }, {}); diff --git a/spec/integration/workbook-styles.spec.js b/spec/integration/workbook-styles.spec.js index b8cc9761a..893e7b711 100644 --- a/spec/integration/workbook-styles.spec.js +++ b/spec/integration/workbook-styles.spec.js @@ -119,40 +119,40 @@ describe('Workbook', function() { var ws = wb.addWorksheet('basket'); ws.getCell('A1').value = 5; - ws.getCell('A1').numFmt = testutils.styles.numFmts.numFmt1; - ws.getCell('A1').font = testutils.styles.fonts.arialBlackUI14; + ws.getCell('A1').numFmt = testUtils.styles.numFmts.numFmt1; + ws.getCell('A1').font = testUtils.styles.fonts.arialBlackUI14; ws.getCell('C1').value = 'Hello, World!'; - ws.getCell('C1').alignment = testutils.styles.namedAlignments.bottomRight; - ws.getCell('C1').border = testutils.styles.borders.doubleRed; - ws.getCell('C1').fill = testutils.styles.fills.redDarkVertical; - - ws.getRow(1).numFmt = testutils.styles.numFmts.numFmt2; - ws.getRow(1).font = testutils.styles.fonts.comicSansUdB16; - ws.getRow(1).alignment = testutils.styles.namedAlignments.middleCentre; - ws.getRow(1).border = testutils.styles.borders.thin; - ws.getRow(1).fill = testutils.styles.fills.redGreenDarkTrellis; - - expect(ws.getCell('A1').numFmt).to.equal(testutils.styles.numFmts.numFmt2); - expect(ws.getCell('A1').font).to.deep.equal(testutils.styles.fonts.comicSansUdB16); - expect(ws.getCell('A1').alignment).to.deep.equal(testutils.styles.namedAlignments.middleCentre); - expect(ws.getCell('A1').border).to.deep.equal(testutils.styles.borders.thin); - expect(ws.getCell('A1').fill).to.deep.equal(testutils.styles.fills.redGreenDarkTrellis); + ws.getCell('C1').alignment = testUtils.styles.namedAlignments.bottomRight; + ws.getCell('C1').border = testUtils.styles.borders.doubleRed; + ws.getCell('C1').fill = testUtils.styles.fills.redDarkVertical; + + ws.getRow(1).numFmt = testUtils.styles.numFmts.numFmt2; + ws.getRow(1).font = testUtils.styles.fonts.comicSansUdB16; + ws.getRow(1).alignment = testUtils.styles.namedAlignments.middleCentre; + ws.getRow(1).border = testUtils.styles.borders.thin; + ws.getRow(1).fill = testUtils.styles.fills.redGreenDarkTrellis; + + expect(ws.getCell('A1').numFmt).to.equal(testUtils.styles.numFmts.numFmt2); + expect(ws.getCell('A1').font).to.deep.equal(testUtils.styles.fonts.comicSansUdB16); + expect(ws.getCell('A1').alignment).to.deep.equal(testUtils.styles.namedAlignments.middleCentre); + expect(ws.getCell('A1').border).to.deep.equal(testUtils.styles.borders.thin); + expect(ws.getCell('A1').fill).to.deep.equal(testUtils.styles.fills.redGreenDarkTrellis); expect(ws.findCell('B1')).to.be.undefined; - expect(ws.getCell('C1').numFmt).to.equal(testutils.styles.numFmts.numFmt2); - expect(ws.getCell('C1').font).to.deep.equal(testutils.styles.fonts.comicSansUdB16); - expect(ws.getCell('C1').alignment).to.deep.equal(testutils.styles.namedAlignments.middleCentre); - expect(ws.getCell('C1').border).to.deep.equal(testutils.styles.borders.thin); - expect(ws.getCell('C1').fill).to.deep.equal(testutils.styles.fills.redGreenDarkTrellis); + expect(ws.getCell('C1').numFmt).to.equal(testUtils.styles.numFmts.numFmt2); + expect(ws.getCell('C1').font).to.deep.equal(testUtils.styles.fonts.comicSansUdB16); + expect(ws.getCell('C1').alignment).to.deep.equal(testUtils.styles.namedAlignments.middleCentre); + expect(ws.getCell('C1').border).to.deep.equal(testUtils.styles.borders.thin); + expect(ws.getCell('C1').fill).to.deep.equal(testUtils.styles.fills.redGreenDarkTrellis); // when we 'get' the previously null cell, it should inherit the row styles - expect(ws.getCell('B1').numFmt).to.equal(testutils.styles.numFmts.numFmt2); - expect(ws.getCell('B1').font).to.deep.equal(testutils.styles.fonts.comicSansUdB16); - expect(ws.getCell('B1').alignment).to.deep.equal(testutils.styles.namedAlignments.middleCentre); - expect(ws.getCell('B1').border).to.deep.equal(testutils.styles.borders.thin); - expect(ws.getCell('B1').fill).to.deep.equal(testutils.styles.fills.redGreenDarkTrellis); + expect(ws.getCell('B1').numFmt).to.equal(testUtils.styles.numFmts.numFmt2); + expect(ws.getCell('B1').font).to.deep.equal(testUtils.styles.fonts.comicSansUdB16); + expect(ws.getCell('B1').alignment).to.deep.equal(testUtils.styles.namedAlignments.middleCentre); + expect(ws.getCell('B1').border).to.deep.equal(testUtils.styles.borders.thin); + expect(ws.getCell('B1').fill).to.deep.equal(testUtils.styles.fills.redGreenDarkTrellis); }); @@ -161,42 +161,41 @@ describe('Workbook', function() { var ws = wb.addWorksheet('basket'); ws.getCell('A1').value = 5; - ws.getCell('A1').numFmt = testutils.styles.numFmts.numFmt1; - ws.getCell('A1').font = testutils.styles.fonts.arialBlackUI14; + ws.getCell('A1').numFmt = testUtils.styles.numFmts.numFmt1; + ws.getCell('A1').font = testUtils.styles.fonts.arialBlackUI14; ws.getCell('A3').value = 'Hello, World!'; - ws.getCell('A3').alignment = testutils.styles.namedAlignments.bottomRight; - ws.getCell('A3').border = testutils.styles.borders.doubleRed; - ws.getCell('A3').fill = testutils.styles.fills.redDarkVertical; - - ws.getColumn('A').numFmt = testutils.styles.numFmts.numFmt2; - ws.getColumn('A').font = testutils.styles.fonts.comicSansUdB16; - ws.getColumn('A').alignment = testutils.styles.namedAlignments.middleCentre; - ws.getColumn('A').border = testutils.styles.borders.thin; - ws.getColumn('A').fill = testutils.styles.fills.redGreenDarkTrellis; - - expect(ws.getCell('A1').numFmt).to.equal(testutils.styles.numFmts.numFmt2); - expect(ws.getCell('A1').font).to.deep.equal(testutils.styles.fonts.comicSansUdB16); - expect(ws.getCell('A1').alignment).to.deep.equal(testutils.styles.namedAlignments.middleCentre); - expect(ws.getCell('A1').border).to.deep.equal(testutils.styles.borders.thin); - expect(ws.getCell('A1').fill).to.deep.equal(testutils.styles.fills.redGreenDarkTrellis); + ws.getCell('A3').alignment = testUtils.styles.namedAlignments.bottomRight; + ws.getCell('A3').border = testUtils.styles.borders.doubleRed; + ws.getCell('A3').fill = testUtils.styles.fills.redDarkVertical; + + ws.getColumn('A').numFmt = testUtils.styles.numFmts.numFmt2; + ws.getColumn('A').font = testUtils.styles.fonts.comicSansUdB16; + ws.getColumn('A').alignment = testUtils.styles.namedAlignments.middleCentre; + ws.getColumn('A').border = testUtils.styles.borders.thin; + ws.getColumn('A').fill = testUtils.styles.fills.redGreenDarkTrellis; + + expect(ws.getCell('A1').numFmt).to.equal(testUtils.styles.numFmts.numFmt2); + expect(ws.getCell('A1').font).to.deep.equal(testUtils.styles.fonts.comicSansUdB16); + expect(ws.getCell('A1').alignment).to.deep.equal(testUtils.styles.namedAlignments.middleCentre); + expect(ws.getCell('A1').border).to.deep.equal(testUtils.styles.borders.thin); + expect(ws.getCell('A1').fill).to.deep.equal(testUtils.styles.fills.redGreenDarkTrellis); expect(ws.findRow(2)).to.be.undefined; - expect(ws.getCell('A3').numFmt).to.equal(testutils.styles.numFmts.numFmt2); - expect(ws.getCell('A3').font).to.deep.equal(testutils.styles.fonts.comicSansUdB16); - expect(ws.getCell('A3').alignment).to.deep.equal(testutils.styles.namedAlignments.middleCentre); - expect(ws.getCell('A3').border).to.deep.equal(testutils.styles.borders.thin); - expect(ws.getCell('A3').fill).to.deep.equal(testutils.styles.fills.redGreenDarkTrellis); + expect(ws.getCell('A3').numFmt).to.equal(testUtils.styles.numFmts.numFmt2); + expect(ws.getCell('A3').font).to.deep.equal(testUtils.styles.fonts.comicSansUdB16); + expect(ws.getCell('A3').alignment).to.deep.equal(testUtils.styles.namedAlignments.middleCentre); + expect(ws.getCell('A3').border).to.deep.equal(testUtils.styles.borders.thin); + expect(ws.getCell('A3').fill).to.deep.equal(testUtils.styles.fills.redGreenDarkTrellis); // when we 'get' the previously null cell, it should inherit the column styles - expect(ws.getCell('A2').numFmt).to.equal(testutils.styles.numFmts.numFmt2); - expect(ws.getCell('A2').font).to.deep.equal(testutils.styles.fonts.comicSansUdB16); - expect(ws.getCell('A2').alignment).to.deep.equal(testutils.styles.namedAlignments.middleCentre); - expect(ws.getCell('A2').border).to.deep.equal(testutils.styles.borders.thin); - expect(ws.getCell('A2').fill).to.deep.equal(testutils.styles.fills.redGreenDarkTrellis); + expect(ws.getCell('A2').numFmt).to.equal(testUtils.styles.numFmts.numFmt2); + expect(ws.getCell('A2').font).to.deep.equal(testUtils.styles.fonts.comicSansUdB16); + expect(ws.getCell('A2').alignment).to.deep.equal(testUtils.styles.namedAlignments.middleCentre); + expect(ws.getCell('A2').border).to.deep.equal(testUtils.styles.borders.thin); + expect(ws.getCell('A2').fill).to.deep.equal(testUtils.styles.fills.redGreenDarkTrellis); }); - }); }); diff --git a/spec/integration/workbook-xlsx-writer.spec.js b/spec/integration/workbook-xlsx-writer.spec.js index 6ec649d8d..508104a52 100644 --- a/spec/integration/workbook-xlsx-writer.spec.js +++ b/spec/integration/workbook-xlsx-writer.spec.js @@ -217,5 +217,44 @@ describe('WorkbookWriter', function() { testUtils.checkTestBook(wb2, 'xlsx', ['dataValidations']); }); }); + + }); + + describe('Images', function() { + it('stores background image', function() { + var wb = new Excel.stream.xlsx.WorkbookWriter({filename: TEST_FILE_NAME, useSharedStrings: true}); + var ws = wb.addWorksheet('blort'); + var ws2; + ws.getCell('A1').value = 'Hello, World!'; + ws.background = { + type: 'image', + image: { + filename: __dirname + '/data/image.png', + type: 'png' + } + }; + return wb.xlsx.writeFile(TEST_XLSX_FILE_NAME) + .then(function() { + var wb2 = new Excel.Workbook(); + return wb2.xlsx.readFile(TEST_XLSX_FILE_NAME); + }) + .then(function(wb2) { + ws2 = wb2.getWorksheet('blort'); + expect(ws2).to.not.be.undefined; + + return fsReadFileAsync(__dirname + '/data/image.png'); + }) + .then(function(data) { + expect(ws2.background.type).to.equal('image'); + expect(ws2.background.image.type).to.equal('png'); + expect(Buffer.compare(data, ws2.background.image.buffer)).to.equal(0); + }) + }); + it('stores embedded image', function() { + expect(true).to.equal(false); + }); + it('stores images and hyperlinks', function() { + expect(true).to.equal(false); + }); }); }); diff --git a/spec/integration/workbook.spec.js b/spec/integration/workbook.spec.js index b04e4d5fb..6052fa952 100644 --- a/spec/integration/workbook.spec.js +++ b/spec/integration/workbook.spec.js @@ -27,6 +27,20 @@ describe('Workbook', function() { describe('Serialise', function() { + it('xlsx file', function() { + + var wb = testUtils.createTestBook(new Excel.Workbook(), 'xlsx'); + + return wb.xlsx.writeFile(TEST_XLSX_FILE_NAME) + .then(function() { + var wb2 = new Excel.Workbook(); + return wb2.xlsx.readFile(TEST_XLSX_FILE_NAME); + }) + .then(function(wb2) { + testUtils.checkTestBook(wb2, 'xlsx'); + }); + }); + it('sheets with correct names', function() { var wb = new Excel.Workbook(); var ws1 = wb.addWorksheet('Hello, World!'); @@ -128,20 +142,6 @@ describe('Workbook', function() { }); }); - it('xlsx file', function() { - - var wb = testUtils.createTestBook(new Excel.Workbook(), 'xlsx'); - - return wb.xlsx.writeFile(TEST_XLSX_FILE_NAME) - .then(function() { - var wb2 = new Excel.Workbook(); - return wb2.xlsx.readFile(TEST_XLSX_FILE_NAME); - }) - .then(function(wb2) { - testUtils.checkTestBook(wb2, 'xlsx'); - }); - }); - it('dataValidations', function() { var wb = testUtils.createTestBook(new Excel.Workbook(), 'xlsx', ['dataValidations']); @@ -469,7 +469,7 @@ describe('Workbook', function() { }); describe('Images', function() { - it.only('stores background image', function() { + it('stores background image', function() { var wb = new Excel.Workbook(); var ws = wb.addWorksheet('blort'); var ws2; diff --git a/spec/unit/xlsx/xform/sheet/cell-xform.spec.js b/spec/unit/xlsx/xform/sheet/cell-xform.spec.js index dc5ef221d..ad6778a4e 100644 --- a/spec/unit/xlsx/xform/sheet/cell-xform.spec.js +++ b/spec/unit/xlsx/xform/sheet/cell-xform.spec.js @@ -24,14 +24,7 @@ var fakeStyles = { }; var fakeHyperlinkMap = { - getHyperlink: function(address) { - switch(address) { - case 'H1': - return 'http://www.foo.com'; - default: - return; - } - } + H1: 'http://www.foo.com' }; var expectations = [ diff --git a/spec/unit/xlsx/xform/sheet/data/sheet.1.1.json b/spec/unit/xlsx/xform/sheet/data/sheet.1.1.json index 110af7001..52641662a 100644 --- a/spec/unit/xlsx/xform/sheet/data/sheet.1.1.json +++ b/spec/unit/xlsx/xform/sheet/data/sheet.1.1.json @@ -64,9 +64,15 @@ "hyperlinks": [ { "address": "B6", "rId": "rId1", - "target": "https://www.npmjs.com/package/exceljs", - "targetMode": "External", - "type": "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" + "target": "https://www.npmjs.com/package/exceljs" + } + ], + "rels": [ + { + "Id": "rId1", + "Target": "https://www.npmjs.com/package/exceljs", + "TargetType": "External", + "Type": "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" } ] } diff --git a/spec/unit/xlsx/xform/sheet/data/sheet.2.1.json b/spec/unit/xlsx/xform/sheet/data/sheet.2.1.json index 75fc890ab..252ca3090 100644 --- a/spec/unit/xlsx/xform/sheet/data/sheet.2.1.json +++ b/spec/unit/xlsx/xform/sheet/data/sheet.2.1.json @@ -41,6 +41,7 @@ ], "mergeCells": [], "hyperlinks": [], + "rels": [], "dataValidations": { "B1": { "type": "list", "allowBlank": true, "showInputMessage": true, "showErrorMessage": true, "formulae": ["$C$1:$C$3"]}, "B5": { "type": "list", "allowBlank": true, "showInputMessage": true, "showErrorMessage": true, "formulae": ["\"value 1, value 2, value 3\""]}, diff --git a/spec/unit/xlsx/xform/sheet/data/sheet.3.1.json b/spec/unit/xlsx/xform/sheet/data/sheet.3.1.json index 1f0fb8cc9..40b1bec97 100644 --- a/spec/unit/xlsx/xform/sheet/data/sheet.3.1.json +++ b/spec/unit/xlsx/xform/sheet/data/sheet.3.1.json @@ -4,5 +4,6 @@ "views": [], "rows": [], "mergeCells": [], - "hyperlinks": [] + "hyperlinks": [], + "rels": [] } diff --git a/spec/unit/xlsx/xform/sheet/worksheet-xform.spec.js b/spec/unit/xlsx/xform/sheet/worksheet-xform.spec.js index 948139ee9..de2289608 100644 --- a/spec/unit/xlsx/xform/sheet/worksheet-xform.spec.js +++ b/spec/unit/xlsx/xform/sheet/worksheet-xform.spec.js @@ -32,14 +32,7 @@ var fakeStyles = { }; var fakeHyperlinkMap = { - getHyperlink: function(address) { - switch(address) { - case 'B6': - return 'https://www.npmjs.com/package/exceljs'; - default: - return; - } - } + B6: 'https://www.npmjs.com/package/exceljs' }; function fixDate(model) {