@protobi/exceljs
Version:
Excel Workbook Manager - Temporary fork with pivot table enhancements and bug fixes pending upstream merge
448 lines (431 loc) • 13.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 _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); }
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 commit() {
this._worksheet._commitRow(this); // eslint-disable-line no-underscore-dangle
}
// 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