You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
478 lines
12 KiB
478 lines
12 KiB
2 years ago
|
'use strict';
|
||
|
|
||
|
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, descriptor.key, descriptor); } }
|
||
|
|
||
|
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
||
|
|
||
|
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: "commit",
|
||
|
// Inform Streaming Writer that this row (and all rows before it) are complete
|
||
|
// and ready to write. Has no effect on Worksheet document
|
||
|
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: "_applyStyle",
|
||
|
// =========================================================================
|
||
|
// styles
|
||
|
value: function _applyStyle(name, value) {
|
||
|
this.style[name] = value;
|
||
|
|
||
|
this._cells.forEach(function (cell) {
|
||
|
if (cell) {
|
||
|
cell[name] = value;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
return value;
|
||
|
}
|
||
|
}, {
|
||
|
key: "number",
|
||
|
get: function get() {
|
||
|
return this._number;
|
||
|
}
|
||
|
}, {
|
||
|
key: "worksheet",
|
||
|
get: function get() {
|
||
|
return this._worksheet;
|
||
|
}
|
||
|
}, {
|
||
|
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;
|
||
|
}
|
||
|
}, {
|
||
|
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
|