Skip to content

Commit

Permalink
Added defined names to streaming writer
Browse files Browse the repository at this point in the history
  • Loading branch information
guyonroche committed Mar 14, 2016
1 parent b4fad06 commit 878a994
Show file tree
Hide file tree
Showing 3 changed files with 212 additions and 166 deletions.
96 changes: 52 additions & 44 deletions lib/stream/xlsx/workbook-writer.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Copyright (c) 2015 Guyon Roche
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* of this software and associated documentation files (the 'Software'), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
Expand All @@ -11,7 +11,7 @@
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Expand All @@ -20,31 +20,32 @@
* THE SOFTWARE.
*
*/
"use strict";
'use strict';

var fs = require("fs");
var Promise = require("bluebird");
var _ = require("underscore");
var Archiver = require("archiver");
var fs = require('fs');
var Promise = require('bluebird');
var _ = require('underscore');
var Archiver = require('archiver');

var utils = require("../../utils/utils");
var Enums = require("../../doc/enums");
var StreamBuf = require("../../utils/stream-buf");
var utils = require('../../utils/utils');
var Enums = require('../../doc/enums');
var StreamBuf = require('../../utils/stream-buf');

var RelType = require("../../xlsx/rel-type");
var StyleManager = require("../../xlsx/stylemanager");
var SharedStrings = require("../../utils/shared-strings");
var RelType = require('../../xlsx/rel-type');
var StyleManager = require('../../xlsx/stylemanager');
var SharedStrings = require('../../utils/shared-strings');
var DefinedNames = require('../../doc/defined-names');

var WorksheetWriter = require("./worksheet-writer");
var WorksheetWriter = require('./worksheet-writer');

var WorkbookWriter = module.exports = function(options) {
options = options || {};
//console.log(JSON.stringify(options, null, " "))
//console.log(JSON.stringify(options, null, ' '))

this.created = options.created || new Date();
this.modified = options.modified || this.created;
this.creator = options.creator || "ExcelJS";
this.lastModifiedBy = options.lastModifiedBy || "ExcelJS";
this.creator = options.creator || 'ExcelJS';
this.lastModifiedBy = options.lastModifiedBy || 'ExcelJS';

// using shared strings creates a smaller xlsx file but may use more memory
this.useSharedStrings = options.useSharedStrings || false;
Expand All @@ -53,9 +54,12 @@ var WorkbookWriter = module.exports = function(options) {
// style manager
this.styles = options.useStyles ? new StyleManager() : new StyleManager.Mock();

// defined names
this._definedNames = new DefinedNames();

this._worksheets = [];

this.zip = Archiver("zip");
this.zip = Archiver('zip');
if (options.stream) {
this.stream = options.stream;
} else if (options.filename) {
Expand All @@ -73,6 +77,10 @@ var WorkbookWriter = module.exports = function(options) {

};
WorkbookWriter.prototype = {
get definedNames() {
return this._definedNames;
},

_openStream: function(path) {
var self = this;
var stream = new StreamBuf({bufSize: 65536, batch: true});
Expand Down Expand Up @@ -147,7 +155,7 @@ WorkbookWriter.prototype = {
this.useSharedStrings;

var id = this.nextId;
name = name || "sheet" + id;
name = name || 'sheet' + id;

var worksheet = new WorksheetWriter({
id: id,
Expand All @@ -162,9 +170,9 @@ WorkbookWriter.prototype = {
getWorksheet: function(id) {
if (id === undefined) {
return _.find(this._worksheets, function(worksheet) { return true; });
} else if (typeof(id) === "number") {
} else if (typeof(id) === 'number') {
return this._worksheets[id];
} else if (typeof id === "string") {
} else if (typeof id === 'string') {
return _.find(this._worksheets, function(worksheet) {
return worksheet.name == id;
});
Expand All @@ -177,70 +185,70 @@ WorkbookWriter.prototype = {
},
addThemes: function() {
var self = this;
return utils.readModuleFile(require.resolve("../../xlsx/theme1.xml"))
return utils.readModuleFile(require.resolve('../../xlsx/theme1.xml'))
.then(function(data){
self.zip.append(data, { name: "xl/theme/theme1.xml" });
self.zip.append(data, { name: 'xl/theme/theme1.xml' });
});
},
addOfficeRels: function() {
var self = this;
var rels = {
relationships: [
{ rId: "rId1", type: RelType.OfficeDocument, target: "xl/workbook.xml" }
{ rId: 'rId1', type: RelType.OfficeDocument, target: 'xl/workbook.xml' }
]
};
return utils.fetchTemplate(require.resolve("../../xlsx/.rels"))
return utils.fetchTemplate(require.resolve('../../xlsx/.rels'))
.then(function(template) {
return template(rels);
})
.then(function(data) {
self.zip.append(data, { name: "/_rels/.rels" });
self.zip.append(data, { name: '/_rels/.rels' });
});
},

addContentTypes: function() {
var self = this;
return utils.fetchTemplate(require.resolve("../../xlsx/content-types.xml"))
return utils.fetchTemplate(require.resolve('../../xlsx/content-types.xml'))
.then(function(template){
return template({
worksheets: self._worksheets
});
})
.then(function(data) {
self.zip.append(data, { name: "[Content_Types].xml" });
self.zip.append(data, { name: '[Content_Types].xml' });
});
},
addApp: function() {
var self = this;
return utils.fetchTemplate(require.resolve("../../xlsx/app.xml"))
return utils.fetchTemplate(require.resolve('../../xlsx/app.xml'))
.then(function(template){
return template({
worksheets: self._worksheets
});
})
.then(function(data) {
self.zip.append(data, { name: "docProps/app.xml" });
self.zip.append(data, { name: 'docProps/app.xml' });
});
},
addCore: function() {
var self = this;
return utils.fetchTemplate(require.resolve("../../xlsx/core.xml"))
return utils.fetchTemplate(require.resolve('../../xlsx/core.xml'))
.then(function(template){
return template(self);
})
.then(function(data) {
self.zip.append(data, { name: "docProps/core.xml" });
self.zip.append(data, { name: 'docProps/core.xml' });
});
},
addSharedStrings: function() {
var self = this;
if (this.sharedStrings.count) {
return utils.fetchTemplate(require.resolve("../../xlsx/sharedStrings.xml"))
return utils.fetchTemplate(require.resolve('../../xlsx/sharedStrings.xml'))
.then(function(template) {
return template(self.sharedStrings);
})
.then(function(data) {
self.zip.append(data, { name: "/xl/sharedStrings.xml" });
self.zip.append(data, { name: '/xl/sharedStrings.xml' });
});
} else {
return Promise.resolve();
Expand All @@ -251,40 +259,40 @@ WorkbookWriter.prototype = {
var count = 1;
var workbookRels = {
relationships: [
{ rId: "rId" + (count++), type: RelType.Styles, target: "styles.xml" },
{ rId: "rId" + (count++), type: RelType.Theme, target: "theme/theme1.xml" }
{ rId: 'rId' + (count++), type: RelType.Styles, target: 'styles.xml' },
{ rId: 'rId' + (count++), type: RelType.Theme, target: 'theme/theme1.xml' }
]
};
if (this.sharedStrings.count) {
workbookRels.relationships.push(
{ rId: "rId" + (count++), type: RelType.SharedStrings, target: "sharedStrings.xml" }
{ rId: 'rId' + (count++), type: RelType.SharedStrings, target: 'sharedStrings.xml' }
);
}
_.each(this._worksheets, function(worksheet) {
worksheet.rId = "rId" + (count++);
worksheet.rId = 'rId' + (count++);
workbookRels.relationships.push(
{ rId: worksheet.rId, type: RelType.Worksheet, target: "worksheets/sheet" + worksheet.id + ".xml" }
{ rId: worksheet.rId, type: RelType.Worksheet, target: 'worksheets/sheet' + worksheet.id + '.xml' }
);
});
return utils.fetchTemplate(require.resolve("../../xlsx/.rels"))
return utils.fetchTemplate(require.resolve('../../xlsx/.rels'))
.then(function(template) {
return template(workbookRels);
})
.then(function(data) {
self.zip.append(data, { name: "/xl/_rels/workbook.xml.rels" });
self.zip.append(data, { name: '/xl/_rels/workbook.xml.rels' });
});
},
addWorkbook: function() {
var self = this;
return utils.fetchTemplate(require.resolve("../../xlsx/workbook.xml"))
return utils.fetchTemplate(require.resolve('../../xlsx/workbook.xml'))
.then(function(template){
return template({
worksheets: self._worksheets,
definedNames: false
definedNames: self._definedNames.model
});
})
.then(function(data) {
self.zip.append(data, { name: "/xl/workbook.xml" });
self.zip.append(data, { name: '/xl/workbook.xml' });
});
},
_finalize: function() {
Expand Down
4 changes: 4 additions & 0 deletions lib/stream/xlsx/worksheet-writer.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,10 @@ var WorksheetWriter = module.exports = function(options) {
};

WorksheetWriter.prototype = {
get workbook() {
return this._workbook;
},

get stream() {
if (!this._stream) {
this._stream = this._workbook._openStream('/xl/worksheets/sheet' + this.id + '.xml');
Expand Down
Loading

0 comments on commit 878a994

Please sign in to comment.