UNPKG

@zlooun/exceljs

Version:

Fixes the problem with writing a file using streams and not using RAM based on 'exeljs'

464 lines (448 loc) 26.9 kB
'use strict'; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator.return && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, catch: function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } var _ = require('../utils/under-dash'); var Enums = require('./enums'); var colCache = require('../utils/col-cache'); var Cell = require('./cell'); var Row = /*#__PURE__*/function () { function Row(worksheet, number) { _classCallCheck(this, Row); this._worksheet = worksheet; this._number = number; this._cells = []; this.style = {}; this.outlineLevel = 0; } // return the row number _createClass(Row, [{ key: "number", get: function get() { return this._number; } }, { key: "worksheet", get: function get() { return this._worksheet; } // Inform Streaming Writer that this row (and all rows before it) are complete // and ready to write. Has no effect on Worksheet document }, { key: "commit", value: function () { var _commit = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { return _regeneratorRuntime().wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.next = 2; return this._worksheet._commitRow(this); case 2: case "end": return _context.stop(); } }, _callee, this); })); function commit() { return _commit.apply(this, arguments); } return commit; }() // helps GC by breaking cyclic references }, { key: "destroy", value: function destroy() { delete this._worksheet; delete this._cells; delete this.style; } }, { key: "findCell", value: function findCell(colNumber) { return this._cells[colNumber - 1]; } // given {address, row, col}, find or create new cell }, { key: "getCellEx", value: function getCellEx(address) { var cell = this._cells[address.col - 1]; if (!cell) { var column = this._worksheet.getColumn(address.col); cell = new Cell(this, column, address.address); this._cells[address.col - 1] = cell; } return cell; } // get cell by key, letter or column number }, { key: "getCell", value: function getCell(col) { if (typeof col === 'string') { // is it a key? var column = this._worksheet.getColumnKey(col); if (column) { col = column.number; } else { col = colCache.l2n(col); } } return this._cells[col - 1] || this.getCellEx({ address: colCache.encodeAddress(this._number, col), row: this._number, col: col }); } // remove cell(s) and shift all higher cells down by count }, { key: "splice", value: function splice(start, count) { var nKeep = start + count; for (var _len = arguments.length, inserts = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { inserts[_key - 2] = arguments[_key]; } var nExpand = inserts.length - count; var nEnd = this._cells.length; var i; var cSrc; var cDst; if (nExpand < 0) { // remove cells for (i = start + inserts.length; i <= nEnd; i++) { cDst = this._cells[i - 1]; cSrc = this._cells[i - nExpand - 1]; if (cSrc) { cDst = this.getCell(i); cDst.value = cSrc.value; cDst.style = cSrc.style; // eslint-disable-next-line no-underscore-dangle cDst._comment = cSrc._comment; } else if (cDst) { cDst.value = null; cDst.style = {}; // eslint-disable-next-line no-underscore-dangle cDst._comment = undefined; } } } else if (nExpand > 0) { // insert new cells for (i = nEnd; i >= nKeep; i--) { cSrc = this._cells[i - 1]; if (cSrc) { cDst = this.getCell(i + nExpand); cDst.value = cSrc.value; cDst.style = cSrc.style; // eslint-disable-next-line no-underscore-dangle cDst._comment = cSrc._comment; } else { this._cells[i + nExpand - 1] = undefined; } } } // now add the new values for (i = 0; i < inserts.length; i++) { cDst = this.getCell(start + i); cDst.value = inserts[i]; cDst.style = {}; // eslint-disable-next-line no-underscore-dangle cDst._comment = undefined; } } // Iterate over all non-null cells in this row }, { key: "eachCell", value: function eachCell(options, iteratee) { if (!iteratee) { iteratee = options; options = null; } if (options && options.includeEmpty) { var n = this._cells.length; for (var i = 1; i <= n; i++) { iteratee(this.getCell(i), i); } } else { this._cells.forEach(function (cell, index) { if (cell && cell.type !== Enums.ValueType.Null) { iteratee(cell, index + 1); } }); } } // =========================================================================== // Page Breaks }, { key: "addPageBreak", value: function addPageBreak(lft, rght) { var ws = this._worksheet; var left = Math.max(0, lft - 1) || 0; var right = Math.max(0, rght - 1) || 16838; var pb = { id: this._number, max: right, man: 1 }; if (left) pb.min = left; ws.rowBreaks.push(pb); } // return a sparse array of cell values }, { key: "values", get: function get() { var values = []; this._cells.forEach(function (cell) { if (cell && cell.type !== Enums.ValueType.Null) { values[cell.col] = cell.value; } }); return values; } // set the values by contiguous or sparse array, or by key'd object literal , set: function set(value) { var _this = this; // this operation is not additive - any prior cells are removed this._cells = []; if (!value) { // empty row } else if (value instanceof Array) { var offset = 0; if (value.hasOwnProperty('0')) { // contiguous array - start at column 1 offset = 1; } value.forEach(function (item, index) { if (item !== undefined) { _this.getCellEx({ address: colCache.encodeAddress(_this._number, index + offset), row: _this._number, col: index + offset }).value = item; } }); } else { // assume object with column keys this._worksheet.eachColumnKey(function (column, key) { if (value[key] !== undefined) { _this.getCellEx({ address: colCache.encodeAddress(_this._number, column.number), row: _this._number, col: column.number }).value = value[key]; } }); } } // returns true if the row includes at least one cell with a value }, { key: "hasValues", get: function get() { return _.some(this._cells, function (cell) { return cell && cell.type !== Enums.ValueType.Null; }); } }, { key: "cellCount", get: function get() { return this._cells.length; } }, { key: "actualCellCount", get: function get() { var count = 0; this.eachCell(function () { count++; }); return count; } // get the min and max column number for the non-null cells in this row or null }, { key: "dimensions", get: function get() { var min = 0; var max = 0; this._cells.forEach(function (cell) { if (cell && cell.type !== Enums.ValueType.Null) { if (!min || min > cell.col) { min = cell.col; } if (max < cell.col) { max = cell.col; } } }); return min > 0 ? { min: min, max: max } : null; } // ========================================================================= // styles }, { key: "_applyStyle", value: function _applyStyle(name, value) { this.style[name] = value; this._cells.forEach(function (cell) { if (cell) { cell[name] = value; } }); return value; } }, { key: "numFmt", get: function get() { return this.style.numFmt; }, set: function set(value) { this._applyStyle('numFmt', value); } }, { key: "font", get: function get() { return this.style.font; }, set: function set(value) { this._applyStyle('font', value); } }, { key: "alignment", get: function get() { return this.style.alignment; }, set: function set(value) { this._applyStyle('alignment', value); } }, { key: "protection", get: function get() { return this.style.protection; }, set: function set(value) { this._applyStyle('protection', value); } }, { key: "border", get: function get() { return this.style.border; }, set: function set(value) { this._applyStyle('border', value); } }, { key: "fill", get: function get() { return this.style.fill; }, set: function set(value) { this._applyStyle('fill', value); } }, { key: "hidden", get: function get() { return !!this._hidden; }, set: function set(value) { this._hidden = value; } }, { key: "outlineLevel", get: function get() { return this._outlineLevel || 0; }, set: function set(value) { this._outlineLevel = value; } }, { key: "collapsed", get: function get() { return !!(this._outlineLevel && this._outlineLevel >= this._worksheet.properties.outlineLevelRow); } // ========================================================================= }, { key: "model", get: function get() { var cells = []; var min = 0; var max = 0; this._cells.forEach(function (cell) { if (cell) { var cellModel = cell.model; if (cellModel) { if (!min || min > cell.col) { min = cell.col; } if (max < cell.col) { max = cell.col; } cells.push(cellModel); } } }); return this.height || cells.length ? { cells: cells, number: this.number, min: min, max: max, height: this.height, style: this.style, hidden: this.hidden, outlineLevel: this.outlineLevel, collapsed: this.collapsed } : null; }, set: function set(value) { var _this2 = this; if (value.number !== this._number) { throw new Error('Invalid row number in model'); } this._cells = []; var previousAddress; value.cells.forEach(function (cellModel) { switch (cellModel.type) { case Cell.Types.Merge: // special case - don't add this types break; default: { var address; if (cellModel.address) { address = colCache.decodeAddress(cellModel.address); } else if (previousAddress) { // This is a <c> element without an r attribute // Assume that it's the cell for the next column var _previousAddress = previousAddress, row = _previousAddress.row; var col = previousAddress.col + 1; address = { row: row, col: col, address: colCache.encodeAddress(row, col), $col$row: "$".concat(colCache.n2l(col), "$").concat(row) }; } previousAddress = address; var cell = _this2.getCellEx(address); cell.model = cellModel; break; } } }); if (value.height) { this.height = value.height; } else { delete this.height; } this.hidden = value.hidden; this.outlineLevel = value.outlineLevel || 0; this.style = value.style && JSON.parse(JSON.stringify(value.style)) || {}; } }]); return Row; }(); module.exports = Row; //# sourceMappingURL=row.js.map