@protobi/exceljs
Version:
Excel Workbook Manager - Temporary fork with pivot table enhancements and bug fixes pending upstream merge
1,086 lines (1,072 loc) • 63.3 kB
JavaScript
"use strict";
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { throw: 1, return: 2, break: 3, continue: 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, catch: function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && o.reverse()); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; }
function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); }
function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || Promise); }
function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (_regeneratorDefine2(_regeneratorAsyncIterator.prototype), _regeneratorDefine2(_regeneratorAsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine2(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); }
function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
function _OverloadYield(e, d) { this.v = e, this.k = d; }
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _asyncIterator(r) { var n, t, o, e = 2; for ("undefined" != typeof Symbol && (t = Symbol.asyncIterator, o = Symbol.iterator); e--;) { if (t && null != (n = r[t])) return n.call(r); if (o && null != (n = r[o])) return new AsyncFromSyncIterator(n.call(r)); t = "@@asyncIterator", o = "@@iterator"; } throw new TypeError("Object is not async iterable"); }
function AsyncFromSyncIterator(r) { function AsyncFromSyncIteratorContinuation(r) { if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object.")); var n = r.done; return Promise.resolve(r.value).then(function (r) { return { value: r, done: n }; }); } return AsyncFromSyncIterator = function AsyncFromSyncIterator(r) { this.s = r, this.n = r.next; }, AsyncFromSyncIterator.prototype = { s: null, n: null, next: function next() { return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments)); }, return: function _return(r) { var n = this.s.return; return void 0 === n ? Promise.resolve({ value: r, done: !0 }) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments)); }, throw: function _throw(r) { var n = this.s.return; return void 0 === n ? Promise.reject(r) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments)); } }, new AsyncFromSyncIterator(r); }
var fs = require('fs');
var JSZip = require('jszip');
var _require = require('readable-stream'),
PassThrough = _require.PassThrough;
var ZipStream = require('../utils/zip-stream');
var StreamBuf = require('../utils/stream-buf');
var utils = require('../utils/utils');
var XmlStream = require('../utils/xml-stream');
var _require2 = require('../utils/browser-buffer-decode'),
bufferToString = _require2.bufferToString;
var StylesXform = require('./xform/style/styles-xform');
var CoreXform = require('./xform/core/core-xform');
var SharedStringsXform = require('./xform/strings/shared-strings-xform');
var RelationshipsXform = require('./xform/core/relationships-xform');
var ContentTypesXform = require('./xform/core/content-types-xform');
var AppXform = require('./xform/core/app-xform');
var WorkbookXform = require('./xform/book/workbook-xform');
var WorksheetXform = require('./xform/sheet/worksheet-xform');
var DrawingXform = require('./xform/drawing/drawing-xform');
var TableXform = require('./xform/table/table-xform');
var PivotCacheRecordsXform = require('./xform/pivot-table/pivot-cache-records-xform');
var PivotCacheDefinitionXform = require('./xform/pivot-table/pivot-cache-definition-xform');
var PivotTableXform = require('./xform/pivot-table/pivot-table-xform');
var CommentsXform = require('./xform/comment/comments-xform');
var VmlNotesXform = require('./xform/comment/vml-notes-xform');
var theme1Xml = require('./xml/theme1');
function fsReadFileAsync(filename, options) {
return new Promise(function (resolve, reject) {
fs.readFile(filename, options, function (error, data) {
if (error) {
reject(error);
} else {
resolve(data);
}
});
});
}
var XLSX = /*#__PURE__*/function () {
function XLSX(workbook) {
_classCallCheck(this, XLSX);
this.workbook = workbook;
}
// ===============================================================================
// Workbook
// =========================================================================
// Read
_createClass(XLSX, [{
key: "readFile",
value: function () {
var _readFile = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(filename, options) {
var stream, workbook;
return _regeneratorRuntime().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return utils.fs.exists(filename);
case 2:
if (_context.sent) {
_context.next = 4;
break;
}
throw new Error("File not found: ".concat(filename));
case 4:
stream = fs.createReadStream(filename);
_context.prev = 5;
_context.next = 8;
return this.read(stream, options);
case 8:
workbook = _context.sent;
stream.close();
return _context.abrupt("return", workbook);
case 13:
_context.prev = 13;
_context.t0 = _context["catch"](5);
stream.close();
throw _context.t0;
case 17:
case "end":
return _context.stop();
}
}, _callee, this, [[5, 13]]);
}));
function readFile(_x, _x2) {
return _readFile.apply(this, arguments);
}
return readFile;
}()
}, {
key: "parseRels",
value: function parseRels(stream) {
var xform = new RelationshipsXform();
return xform.parseStream(stream);
}
}, {
key: "parseWorkbook",
value: function parseWorkbook(stream) {
var xform = new WorkbookXform();
return xform.parseStream(stream);
}
}, {
key: "parseSharedStrings",
value: function parseSharedStrings(stream) {
var xform = new SharedStringsXform();
return xform.parseStream(stream);
}
}, {
key: "reconcile",
value: function reconcile(model, options) {
var workbookXform = new WorkbookXform();
var worksheetXform = new WorksheetXform(options);
var drawingXform = new DrawingXform();
var tableXform = new TableXform();
workbookXform.reconcile(model);
// reconcile drawings with their rels
var drawingOptions = {
media: model.media,
mediaIndex: model.mediaIndex
};
Object.keys(model.drawings).forEach(function (name) {
var drawing = model.drawings[name];
var drawingRel = model.drawingRels[name];
if (drawingRel) {
drawingOptions.rels = drawingRel.reduce(function (o, rel) {
o[rel.Id] = rel;
return o;
}, {});
(drawing.anchors || []).forEach(function (anchor) {
var hyperlinks = anchor.picture && anchor.picture.hyperlinks;
if (hyperlinks && drawingOptions.rels[hyperlinks.rId]) {
hyperlinks.hyperlink = drawingOptions.rels[hyperlinks.rId].Target;
delete hyperlinks.rId;
}
});
drawingXform.reconcile(drawing, drawingOptions);
}
});
// reconcile tables with the default styles
var tableOptions = {
styles: model.styles
};
Object.values(model.tables).forEach(function (table) {
tableXform.reconcile(table, tableOptions);
});
var sheetOptions = {
styles: model.styles,
sharedStrings: model.sharedStrings,
media: model.media,
mediaIndex: model.mediaIndex,
date1904: model.properties && model.properties.date1904,
drawings: model.drawings,
comments: model.comments,
tables: model.tables,
vmlDrawings: model.vmlDrawings
};
model.worksheets.forEach(function (worksheet) {
worksheet.relationships = model.worksheetRels[worksheet.sheetNo];
worksheetXform.reconcile(worksheet, sheetOptions);
});
// delete unnecessary parts
delete model.worksheetHash;
delete model.worksheetRels;
delete model.globalRels;
delete model.sharedStrings;
delete model.workbookRels;
delete model.sheetDefs;
delete model.styles;
delete model.mediaIndex;
delete model.drawings;
delete model.drawingRels;
delete model.vmlDrawings;
}
}, {
key: "_processWorksheetEntry",
value: function () {
var _processWorksheetEntry2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(stream, model, sheetNo, options, path) {
var xform, worksheet;
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
xform = new WorksheetXform(options);
_context2.next = 3;
return xform.parseStream(stream);
case 3:
worksheet = _context2.sent;
worksheet.sheetNo = sheetNo;
model.worksheetHash[path] = worksheet;
model.worksheets.push(worksheet);
case 7:
case "end":
return _context2.stop();
}
}, _callee2);
}));
function _processWorksheetEntry(_x3, _x4, _x5, _x6, _x7) {
return _processWorksheetEntry2.apply(this, arguments);
}
return _processWorksheetEntry;
}()
}, {
key: "_processCommentEntry",
value: function () {
var _processCommentEntry2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(stream, model, name) {
var xform, comments;
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
xform = new CommentsXform();
_context3.next = 3;
return xform.parseStream(stream);
case 3:
comments = _context3.sent;
model.comments["../".concat(name, ".xml")] = comments;
case 5:
case "end":
return _context3.stop();
}
}, _callee3);
}));
function _processCommentEntry(_x8, _x9, _x0) {
return _processCommentEntry2.apply(this, arguments);
}
return _processCommentEntry;
}()
}, {
key: "_processTableEntry",
value: function () {
var _processTableEntry2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4(stream, model, name) {
var xform, table;
return _regeneratorRuntime().wrap(function _callee4$(_context4) {
while (1) switch (_context4.prev = _context4.next) {
case 0:
xform = new TableXform();
_context4.next = 3;
return xform.parseStream(stream);
case 3:
table = _context4.sent;
model.tables["../tables/".concat(name, ".xml")] = table;
case 5:
case "end":
return _context4.stop();
}
}, _callee4);
}));
function _processTableEntry(_x1, _x10, _x11) {
return _processTableEntry2.apply(this, arguments);
}
return _processTableEntry;
}()
}, {
key: "_processWorksheetRelsEntry",
value: function () {
var _processWorksheetRelsEntry2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5(stream, model, sheetNo) {
var xform, relationships;
return _regeneratorRuntime().wrap(function _callee5$(_context5) {
while (1) switch (_context5.prev = _context5.next) {
case 0:
xform = new RelationshipsXform();
_context5.next = 3;
return xform.parseStream(stream);
case 3:
relationships = _context5.sent;
model.worksheetRels[sheetNo] = relationships;
case 5:
case "end":
return _context5.stop();
}
}, _callee5);
}));
function _processWorksheetRelsEntry(_x12, _x13, _x14) {
return _processWorksheetRelsEntry2.apply(this, arguments);
}
return _processWorksheetRelsEntry;
}()
}, {
key: "_processMediaEntry",
value: function () {
var _processMediaEntry2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee6(entry, model, filename) {
var lastDot, extension, name;
return _regeneratorRuntime().wrap(function _callee6$(_context6) {
while (1) switch (_context6.prev = _context6.next) {
case 0:
lastDot = filename.lastIndexOf('.'); // if we can't determine extension, ignore it
if (!(lastDot >= 1)) {
_context6.next = 6;
break;
}
extension = filename.substr(lastDot + 1);
name = filename.substr(0, lastDot);
_context6.next = 6;
return new Promise(function (resolve, reject) {
var streamBuf = new StreamBuf();
streamBuf.on('finish', function () {
model.mediaIndex[filename] = model.media.length;
model.mediaIndex[name] = model.media.length;
var medium = {
type: 'image',
name: name,
extension: extension,
buffer: streamBuf.toBuffer()
};
model.media.push(medium);
resolve();
});
entry.on('error', function (error) {
reject(error);
});
entry.pipe(streamBuf);
});
case 6:
case "end":
return _context6.stop();
}
}, _callee6);
}));
function _processMediaEntry(_x15, _x16, _x17) {
return _processMediaEntry2.apply(this, arguments);
}
return _processMediaEntry;
}()
}, {
key: "_processDrawingEntry",
value: function () {
var _processDrawingEntry2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee7(entry, model, name) {
var xform, drawing;
return _regeneratorRuntime().wrap(function _callee7$(_context7) {
while (1) switch (_context7.prev = _context7.next) {
case 0:
xform = new DrawingXform();
_context7.next = 3;
return xform.parseStream(entry);
case 3:
drawing = _context7.sent;
model.drawings[name] = drawing;
case 5:
case "end":
return _context7.stop();
}
}, _callee7);
}));
function _processDrawingEntry(_x18, _x19, _x20) {
return _processDrawingEntry2.apply(this, arguments);
}
return _processDrawingEntry;
}()
}, {
key: "_processDrawingRelsEntry",
value: function () {
var _processDrawingRelsEntry2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee8(entry, model, name) {
var xform, relationships;
return _regeneratorRuntime().wrap(function _callee8$(_context8) {
while (1) switch (_context8.prev = _context8.next) {
case 0:
xform = new RelationshipsXform();
_context8.next = 3;
return xform.parseStream(entry);
case 3:
relationships = _context8.sent;
model.drawingRels[name] = relationships;
case 5:
case "end":
return _context8.stop();
}
}, _callee8);
}));
function _processDrawingRelsEntry(_x21, _x22, _x23) {
return _processDrawingRelsEntry2.apply(this, arguments);
}
return _processDrawingRelsEntry;
}()
}, {
key: "_processVmlDrawingEntry",
value: function () {
var _processVmlDrawingEntry2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee9(entry, model, name) {
var xform, vmlDrawing;
return _regeneratorRuntime().wrap(function _callee9$(_context9) {
while (1) switch (_context9.prev = _context9.next) {
case 0:
xform = new VmlNotesXform();
_context9.next = 3;
return xform.parseStream(entry);
case 3:
vmlDrawing = _context9.sent;
model.vmlDrawings["../drawings/".concat(name, ".vml")] = vmlDrawing;
case 5:
case "end":
return _context9.stop();
}
}, _callee9);
}));
function _processVmlDrawingEntry(_x24, _x25, _x26) {
return _processVmlDrawingEntry2.apply(this, arguments);
}
return _processVmlDrawingEntry;
}()
}, {
key: "_processThemeEntry",
value: function () {
var _processThemeEntry2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee0(entry, model, name) {
return _regeneratorRuntime().wrap(function _callee0$(_context0) {
while (1) switch (_context0.prev = _context0.next) {
case 0:
_context0.next = 2;
return new Promise(function (resolve, reject) {
// TODO: stream entry into buffer and store the xml in the model.themes[]
var stream = new StreamBuf();
entry.on('error', reject);
stream.on('error', reject);
stream.on('finish', function () {
model.themes[name] = stream.read().toString();
resolve();
});
entry.pipe(stream);
});
case 2:
case "end":
return _context0.stop();
}
}, _callee0);
}));
function _processThemeEntry(_x27, _x28, _x29) {
return _processThemeEntry2.apply(this, arguments);
}
return _processThemeEntry;
}()
/**
* @deprecated since version 4.0. You should use `#read` instead. Please follow upgrade instruction: https://github.com/exceljs/exceljs/blob/master/UPGRADE-4.0.md
*/
}, {
key: "createInputStream",
value: function createInputStream() {
throw new Error('`XLSX#createInputStream` is deprecated. You should use `XLSX#read` instead. This method will be removed in version 5.0. Please follow upgrade instruction: https://github.com/exceljs/exceljs/blob/master/UPGRADE-4.0.md');
}
}, {
key: "read",
value: function () {
var _read = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee1(stream, options) {
var chunks, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _iterator, _step, chunk;
return _regeneratorRuntime().wrap(function _callee1$(_context1) {
while (1) switch (_context1.prev = _context1.next) {
case 0:
// TODO: Remove once node v8 is deprecated
// Detect and upgrade old streams
if (!stream[Symbol.asyncIterator] && stream.pipe) {
stream = stream.pipe(new PassThrough());
}
chunks = [];
_iteratorAbruptCompletion = false;
_didIteratorError = false;
_context1.prev = 4;
_iterator = _asyncIterator(stream);
case 6:
_context1.next = 8;
return _iterator.next();
case 8:
if (!(_iteratorAbruptCompletion = !(_step = _context1.sent).done)) {
_context1.next = 14;
break;
}
chunk = _step.value;
chunks.push(chunk);
case 11:
_iteratorAbruptCompletion = false;
_context1.next = 6;
break;
case 14:
_context1.next = 20;
break;
case 16:
_context1.prev = 16;
_context1.t0 = _context1["catch"](4);
_didIteratorError = true;
_iteratorError = _context1.t0;
case 20:
_context1.prev = 20;
_context1.prev = 21;
if (!(_iteratorAbruptCompletion && _iterator.return != null)) {
_context1.next = 25;
break;
}
_context1.next = 25;
return _iterator.return();
case 25:
_context1.prev = 25;
if (!_didIteratorError) {
_context1.next = 28;
break;
}
throw _iteratorError;
case 28:
return _context1.finish(25);
case 29:
return _context1.finish(20);
case 30:
return _context1.abrupt("return", this.load(Buffer.concat(chunks), options));
case 31:
case "end":
return _context1.stop();
}
}, _callee1, this, [[4, 16, 20, 30], [21,, 25, 29]]);
}));
function read(_x30, _x31) {
return _read.apply(this, arguments);
}
return read;
}()
}, {
key: "load",
value: function () {
var _load = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee10(data, options) {
var buffer, model, zip, _i, _Object$values, entry, entryName, stream, content, chunkSize, i, workbook, appXform, appProperties, coreXform, coreProperties, match;
return _regeneratorRuntime().wrap(function _callee10$(_context10) {
while (1) switch (_context10.prev = _context10.next) {
case 0:
if (options && options.base64) {
buffer = Buffer.from(data.toString(), 'base64');
} else {
buffer = data;
}
model = {
worksheets: [],
worksheetHash: {},
worksheetRels: [],
themes: {},
media: [],
mediaIndex: {},
drawings: {},
drawingRels: {},
comments: {},
tables: {},
vmlDrawings: {}
};
_context10.next = 4;
return JSZip.loadAsync(buffer);
case 4:
zip = _context10.sent;
_i = 0, _Object$values = Object.values(zip.files);
case 6:
if (!(_i < _Object$values.length)) {
_context10.next = 126;
break;
}
entry = _Object$values[_i];
if (entry.dir) {
_context10.next = 123;
break;
}
entryName = entry.name;
if (entryName[0] === '/') {
entryName = entryName.substr(1);
}
stream = void 0;
if (!(entryName.match(/xl\/media\//) ||
// themes are not parsed as stream
entryName.match(/xl\/theme\/([a-zA-Z0-9]+)[.]xml/))) {
_context10.next = 21;
break;
}
stream = new PassThrough();
_context10.t0 = stream;
_context10.next = 17;
return entry.async('nodebuffer');
case 17:
_context10.t1 = _context10.sent;
_context10.t0.write.call(_context10.t0, _context10.t1);
_context10.next = 36;
break;
case 21:
// use object mode to avoid buffer-string convention
stream = new PassThrough({
writableObjectMode: true,
readableObjectMode: true
});
content = void 0; // https://www.npmjs.com/package/process
if (!process.browser) {
_context10.next = 31;
break;
}
_context10.t2 = bufferToString;
_context10.next = 27;
return entry.async('nodebuffer');
case 27:
_context10.t3 = _context10.sent;
content = (0, _context10.t2)(_context10.t3);
_context10.next = 34;
break;
case 31:
_context10.next = 33;
return entry.async('string');
case 33:
content = _context10.sent;
case 34:
chunkSize = 16 * 1024;
for (i = 0; i < content.length; i += chunkSize) {
stream.write(content.substring(i, i + chunkSize));
}
case 36:
stream.end();
_context10.t4 = entryName;
_context10.next = _context10.t4 === '_rels/.rels' ? 40 : _context10.t4 === 'xl/workbook.xml' ? 44 : _context10.t4 === 'xl/_rels/workbook.xml.rels' ? 53 : _context10.t4 === 'xl/sharedStrings.xml' ? 57 : _context10.t4 === 'xl/styles.xml' ? 61 : _context10.t4 === 'docProps/app.xml' ? 65 : _context10.t4 === 'docProps/core.xml' ? 72 : 78;
break;
case 40:
_context10.next = 42;
return this.parseRels(stream);
case 42:
model.globalRels = _context10.sent;
return _context10.abrupt("break", 123);
case 44:
_context10.next = 46;
return this.parseWorkbook(stream);
case 46:
workbook = _context10.sent;
model.sheets = workbook.sheets;
model.definedNames = workbook.definedNames;
model.views = workbook.views;
model.properties = workbook.properties;
model.calcProperties = workbook.calcProperties;
return _context10.abrupt("break", 123);
case 53:
_context10.next = 55;
return this.parseRels(stream);
case 55:
model.workbookRels = _context10.sent;
return _context10.abrupt("break", 123);
case 57:
model.sharedStrings = new SharedStringsXform();
_context10.next = 60;
return model.sharedStrings.parseStream(stream);
case 60:
return _context10.abrupt("break", 123);
case 61:
model.styles = new StylesXform();
_context10.next = 64;
return model.styles.parseStream(stream);
case 64:
return _context10.abrupt("break", 123);
case 65:
appXform = new AppXform();
_context10.next = 68;
return appXform.parseStream(stream);
case 68:
appProperties = _context10.sent;
model.company = appProperties.company;
model.manager = appProperties.manager;
return _context10.abrupt("break", 123);
case 72:
coreXform = new CoreXform();
_context10.next = 75;
return coreXform.parseStream(stream);
case 75:
coreProperties = _context10.sent;
Object.assign(model, coreProperties);
return _context10.abrupt("break", 123);
case 78:
match = entryName.match(/xl\/worksheets\/sheet(\d+)[.]xml/);
if (!match) {
_context10.next = 83;
break;
}
_context10.next = 82;
return this._processWorksheetEntry(stream, model, match[1], options, entryName);
case 82:
return _context10.abrupt("break", 123);
case 83:
match = entryName.match(/xl\/worksheets\/_rels\/sheet(\d+)[.]xml.rels/);
if (!match) {
_context10.next = 88;
break;
}
_context10.next = 87;
return this._processWorksheetRelsEntry(stream, model, match[1]);
case 87:
return _context10.abrupt("break", 123);
case 88:
match = entryName.match(/xl\/theme\/([a-zA-Z0-9]+)[.]xml/);
if (!match) {
_context10.next = 93;
break;
}
_context10.next = 92;
return this._processThemeEntry(stream, model, match[1]);
case 92:
return _context10.abrupt("break", 123);
case 93:
match = entryName.match(/xl\/media\/([a-zA-Z0-9]+[.][a-zA-Z0-9]{3,4})$/);
if (!match) {
_context10.next = 98;
break;
}
_context10.next = 97;
return this._processMediaEntry(stream, model, match[1]);
case 97:
return _context10.abrupt("break", 123);
case 98:
match = entryName.match(/xl\/drawings\/([a-zA-Z0-9]+)[.]xml/);
if (!match) {
_context10.next = 103;
break;
}
_context10.next = 102;
return this._processDrawingEntry(stream, model, match[1]);
case 102:
return _context10.abrupt("break", 123);
case 103:
match = entryName.match(/xl\/(comments\d+)[.]xml/);
if (!match) {
_context10.next = 108;
break;
}
_context10.next = 107;
return this._processCommentEntry(stream, model, match[1]);
case 107:
return _context10.abrupt("break", 123);
case 108:
match = entryName.match(/xl\/tables\/(table\d+)[.]xml/);
if (!match) {
_context10.next = 113;
break;
}
_context10.next = 112;
return this._processTableEntry(stream, model, match[1]);
case 112:
return _context10.abrupt("break", 123);
case 113:
match = entryName.match(/xl\/drawings\/_rels\/([a-zA-Z0-9]+)[.]xml[.]rels/);
if (!match) {
_context10.next = 118;
break;
}
_context10.next = 117;
return this._processDrawingRelsEntry(stream, model, match[1]);
case 117:
return _context10.abrupt("break", 123);
case 118:
match = entryName.match(/xl\/drawings\/(vmlDrawing\d+)[.]vml/);
if (!match) {
_context10.next = 123;
break;
}
_context10.next = 122;
return this._processVmlDrawingEntry(stream, model, match[1]);
case 122:
return _context10.abrupt("break", 123);
case 123:
_i++;
_context10.next = 6;
break;
case 126:
this.reconcile(model, options);
// apply model
this.workbook.model = model;
return _context10.abrupt("return", this.workbook);
case 129:
case "end":
return _context10.stop();
}
}, _callee10, this);
}));
function load(_x32, _x33) {
return _load.apply(this, arguments);
}
return load;
}() // =========================================================================
// Write
}, {
key: "addMedia",
value: function () {
var _addMedia = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee12(zip, model) {
return _regeneratorRuntime().wrap(function _callee12$(_context12) {
while (1) switch (_context12.prev = _context12.next) {
case 0:
_context12.next = 2;
return Promise.all(model.media.map(/*#__PURE__*/function () {
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee11(medium) {
var filename, data, dataimg64, content;
return _regeneratorRuntime().wrap(function _callee11$(_context11) {
while (1) switch (_context11.prev = _context11.next) {
case 0:
if (!(medium.type === 'image')) {
_context11.next = 13;
break;
}
filename = "xl/media/".concat(medium.name, ".").concat(medium.extension);
if (!medium.filename) {
_context11.next = 7;
break;
}
_context11.next = 5;
return fsReadFileAsync(medium.filename);
case 5:
data = _context11.sent;
return _context11.abrupt("return", zip.append(data, {
name: filename
}));
case 7:
if (!medium.buffer) {
_context11.next = 9;
break;
}
return _context11.abrupt("return", zip.append(medium.buffer, {
name: filename
}));
case 9:
if (!medium.base64) {
_context11.next = 13;
break;
}
dataimg64 = medium.base64;
content = dataimg64.substring(dataimg64.indexOf(',') + 1);
return _context11.abrupt("return", zip.append(content, {
name: filename,
base64: true
}));
case 13:
throw new Error('Unsupported media');
case 14:
case "end":
return _context11.stop();
}
}, _callee11);
}));
return function (_x36) {
return _ref.apply(this, arguments);
};
}()));
case 2:
case "end":
return _context12.stop();
}
}, _callee12);
}));
function addMedia(_x34, _x35) {
return _addMedia.apply(this, arguments);
}
return addMedia;
}()
}, {
key: "addDrawings",
value: function addDrawings(zip, model) {
var drawingXform = new DrawingXform();
var relsXform = new RelationshipsXform();
model.worksheets.forEach(function (worksheet) {
var drawing = worksheet.drawing;
if (drawing) {
drawingXform.prepare(drawing, {});
var xml = drawingXform.toXml(drawing);
zip.append(xml, {
name: "xl/drawings/".concat(drawing.name, ".xml")
});
xml = relsXform.toXml(drawing.rels);
zip.append(xml, {
name: "xl/drawings/_rels/".concat(drawing.name, ".xml.rels")
});
}
});
}
}, {
key: "addTables",
value: function addTables(zip, model) {
var tableXform = new TableXform();
model.worksheets.forEach(function (worksheet) {
var tables = worksheet.tables;
tables.forEach(function (table) {
tableXform.prepare(table, {});
var tableXml = tableXform.toXml(table);
zip.append(tableXml, {
name: "xl/tables/".concat(table.target)
});
});
});
}
}, {
key: "addPivotTables",
value: function addPivotTables(zip, model) {
if (!model.pivotTables.length) return;
var pivotCacheRecordsXform = new PivotCacheRecordsXform();
var pivotCacheDefinitionXform = new PivotCacheDefinitionXform();
var pivotTableXform = new PivotTableXform();
var relsXform = new RelationshipsXform();
// Process each pivot table
model.pivotTables.forEach(function (pivotTable, index) {
var tableNum = index + 1;
// pivot cache records
// --------------------------------------------------
// copy of the source data.
//
// Note: cells in the columns of the source data which are part
// of the "rows" or "columns" of the pivot table configuration are
// replaced by references to their __cache field__ identifiers.
// See "pivot cache definition" below.
var xml = pivotCacheRecordsXform.toXml(pivotTable);
zip.append(xml, {
name: "xl/pivotCache/pivotCacheRecords".concat(tableNum, ".xml")
});
// pivot cache definition
// --------------------------------------------------
// cache source (source data):
// ref="A1:E7" on sheet="Sheet1"
// cache fields:
// - 0: "A" (a1, a2, a3)
// - 1: "B" (b1, b2)
// - ...
xml = pivotCacheDefinitionXform.toXml(pivotTable);
zip.append(xml, {
name: "xl/pivotCache/pivotCacheDefinition".concat(tableNum, ".xml")
});
xml = relsXform.toXml([{
Id: 'rId1',
Type: XLSX.RelType.PivotCacheRecords,
Target: "pivotCacheRecords".concat(tableNum, ".xml")
}]);
zip.append(xml, {
name: "xl/pivotCache/_rels/pivotCacheDefinition".concat(tableNum, ".xml.rels")
});
// pivot tables (on destination worksheet)
// --------------------------------------------------
// location: ref="A3:E15"
// pivotFields
// rowFields and rowItems
// colFields and colItems
// dataFields
// pivotTableStyleInfo
xml = pivotTableXform.toXml(pivotTable);
zip.append(xml, {
name: "xl/pivotTables/pivotTable".concat(tableNum, ".xml")
});
xml = relsXform.toXml([{
Id: 'rId1',
Type: XLSX.RelType.PivotCacheDefinition,
Target: "../pivotCache/pivotCacheDefinition".concat(tableNum, ".xml")
}]);
zip.append(xml, {
name: "xl/pivotTables/_rels/pivotTable".concat(tableNum, ".xml.rels")
});
});
}
}, {
key: "addContentTypes",
value: function () {
var _addContentTypes = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee13(zip, model) {
var xform, xml;
return _regeneratorRuntime().wrap(function _callee13$(_context13) {
while (1) switch (_context13.prev = _context13.next) {
case 0:
xform = new ContentTypesXform();
xml = xform.toXml(model);
zip.append(xml, {
name: '[Content_Types].xml'
});
case 3:
case "end":
return _context13.stop();
}
}, _callee13);
}));
function addContentTypes(_x37, _x38) {
return _addContentTypes.apply(this, arguments);
}
return addContentTypes;
}()
}, {
key: "addApp",
value: function () {
var _addApp = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee14(zip, model) {
var xform, xml;
return _regeneratorRuntime().wrap(function _callee14$(_context14) {
while (1) switch (_context14.prev = _context14.next) {
case 0:
xform = new AppXform();
xml = xform.toXml(model);
zip.append(xml, {
name: 'docProps/app.xml'
});
case 3:
case "end":
return _context14.stop();
}
}, _callee14);
}));
function addApp(_x39, _x40) {
return _addApp.apply(this, arguments);
}
return addApp;
}()
}, {
key: "addCore",
value: function () {
var _addCore = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee15(zip, model) {
var coreXform;
return _regeneratorRuntime().wrap(function _callee15$(_context15) {
while (1) switch (_context15.prev = _context15.next) {
case 0:
coreXform = new CoreXform();
zip.append(coreXform.toXml(model), {
name: 'docProps/core.xml'
});
case 2:
case "end":
return _context15.stop();
}
}, _callee15);
}));
function addCore(_x41, _x42) {
return _addCore.apply(this, arguments);
}
return addCore;
}()
}, {
key: "addThemes",
value: function () {
var _addThemes = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee16(zip, model) {
var themes;
return _regeneratorRuntime().wrap(function _callee16$(_context16) {
while (1) switch (_context16.prev = _context16.next) {
case 0:
themes = model.themes || {
theme1: theme1Xml
};
Object.keys(themes).forEach(function (name) {
var xml = themes[name];
var path = "xl/theme/".concat(name, ".xml");
zip.append(xml, {
name: path
});
});
case 2:
case "end":
return _context16.stop();
}
}, _callee16);
}));
function addThemes(_x43, _x44) {
return _addThemes.apply(this, arguments);
}
return addThemes;
}()
}, {
key: "addOfficeRels",
value: function () {
var _addOfficeRels = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee17(zip) {
var xform, xml;
return _regeneratorRuntime().wrap(function _callee17$(_context17) {
while (1) switch (_context17.prev = _context17.next) {
case 0:
xform = new RelationshipsXform();
xml = xform.toXml([{
Id: 'rId1',
Type: XLSX.RelType.OfficeDocument,
Target: 'xl/workbook.xml'
}, {
Id: 'rId2',
Type: XLSX.RelType.CoreProperties,
Target: 'docProps/core.xml'